huichen5796 / 2022-studienarbeit-hui-chen

a tool for detecting tables in image and analysing complex header
3 stars 0 forks source link

instraction to funciton Umform() #60

Closed huichen5796 closed 1 year ago

huichen5796 commented 2 years ago

Basis 1. zwei Zustände von Zelle Zelle ist voll ==> d.h. in der Zelle gibt es Wörter Zelle ist leer

Basis 2. Abteilung einer Tabelle image image Alle Tabellen bestehen aus vier Teilen.

Basis 3. zwei Typen von Tabellen einfache Tabelle: header hat nur eine Zeile, und Zeilenindex hat auch nur eine Spalt. komplexe Tabelle: header hat mehr als eine Zeile, oder Zeilenindex hat mehr als eine Spalt. hier: anhand Angenommen 3. (Angenommen seh unten) header liegt immer innerhalb ersten drei Zeilen. und Angenommen 2. #col1row0# ist immer voll. (Falls es nicht voll ist, füllen wir es aus.) Nun beurteilen wir so: wenn es in der ersten drei Zeilen keine leere Zelle gibt, ist die Tabelle einfache Tabelle.

Basis 4. Komplexe Tabellen können nach Verarbeitungen in einfachen Tabellen transformiert werden. Verarbeitungen: Schmelzen von header, Schmelzen von Zeilenindex

Basis 5. zwei Zustände von Zeile Zeile ist voll ==> d.h. in der Zeile gibt es keine leere Zelle Zeile ist nicht voll

Basis 6. PositionCorrection von Tabellenzellen see issue PositionCorrection image Daraus kann man sehen ==> abweichende Zellen werden immer nach oben links korrigiert. Deswegen kann man sagen: Je höher die Zeile in der Tabelle liegt, desto mehr möglich ist es für die Zeile, voll zu sein.

Basis 7. Nach Schmelzen ist die header-Zeile unbedingt voll, d.h. jeder Spalt von values hat ein entsprechendes header. Basis 8. Nach Schmelzen ist die Zeilenindex-Spalte auch unbedingt voll, d.h. jeder Zeile von values hat ein entsprechendes Zeilenindex.

huichen5796 commented 2 years ago

Um weitere Verarbeitungen zu vereinfachen:

huichen5796 commented 2 years ago

Gründe dafür, warum der header komplex ist.

Grund 1, Wörter sind zu lang image Grund 2, es gibt primär- und sekundär-header image

Für Grund 2 sollten zuerst die leeren Zellen in der erster Zeile ausgefüllt werden, für Grund 1 sollten aber nicht. Aber es ist unmöglich nur mit Lokationeninformationen der Zellen zu beurteilen, ob Ausfüllung erforderlich oder nicht. Um zu beurteilen muss man ggf. NLP DeepLeaning Modell nutzen. ---> Ausblick

Deswegen ignoriere ich Grund 1, kümmere ich nur um Grund 2, also der Grund für Existieren des komplexen headers ist primär- und sekundär-header, man muss alle leere Zellen in der erster Zeile ausfüllen.

Der daraus resultierende Fehler: image

huichen5796 commented 2 years ago

Schritte für Schmelzen der header

  1. Beurteilen -- wie viele Zeilen header hat.
  2. Analyse -- wie die leeren Zellen in der erster Zeile ausgefüllt werden sollte.
  3. Schmelzen

Ich zeiche die volle Zeile als 1, nicht volle Zeile als 0. Und hier werden #col0row0# Teil und header-Teil berücksichtiget. image Es gibt insgesamt sieben Möglichkeiten von komplexen Tabellen, also 100, 010, 001, 110, 101, 011, 000, 111. 111 ist sehr seltsam, wir ignorieren es. Es erscheint nur, wenn alle Wörter so lang sind, dass sie drei Zeilen einnehmen, dieser Fall wird jedoch wegen Basis 3 (seh oben) als einfache Tabelle beurteilt. image

Analyse anhand Basis 6 und Basis 7

Ausfüllung der erster Zeile image Regel 1. zuerst sollten wir bestimmen -- welche Zellen können dilatiert werden, also welche Zellen sind primär header. wie zum Beispiel: Zelle 'Delta' nicht, Zelle 'Omikron' kann. dadruch: eine(hier ist der Fall zeile_nummer = 2, if zeile_nummer = 3 sollte hier zwei sein.) Zelle unter 'Delta' ist leer, deswegen hat 'Delta' kein sekundär header, also 'Delta' ist kein primär header --> kann nicht dilatiert werden. image

Regel 2. wenn die beide Seite einer leere Zelle sind pirmär header: anhand Basis 6 werden die abweichenden Zellen immer nach oben links korrigiert. Deswegen für eine leere Zelle hat der primär header in der linke Seite Vorrang. image

Regel 3. wir sollten auch bestimmen -- welche leere-Zellen können ausgefüllt werden. wenn die zwei(hier ist der Fall zeile_nummer = 3, if zeile_nummer = 2 sollte hier eins sein.) Zellen unter der leerer Zelle in der erster Zeile beide leer sind, es bedeutet, diese leere Zelle kein header ist, dann sollte die leere Zelle nicht ausgefüllt werden image image

Algorithmus Schritt 1: bestimmen -- welche Zellen können dilatiert werden Schritt 2: bestimmen -- welche leere Zellen können ausgefüllt werden Schritt 3: iterate Ausbreiten der dilatierbaren primären headers

für jede asugefüllbare leere Zelle:

Dann nach Ausfüllung der erste Zeile ist das Schmelzen des headers anhand zeile_nummer image image image

image image image

huichen5796 commented 2 years ago

Verarbeitung von Zeilenindex Teil -- vertikal schmelzen image Schmelzen von leere values image image image

huichen5796 commented 2 years ago

So bisher sind allgemeine komplexe Tabelle in einfacher Tabelle transformiert. image image image

huichen5796 commented 2 years ago

für Zeilenindex mit mehr Spalt, brauche noch horizonal Schmelzen. wie beurteilen wir komplexe Zeilenindex -- in diesem Teil gibt es noch empty cell nach oben genannter alle Verarbeitung. image

Beispiel: image image image

huichen5796 commented 2 years ago

Übrigens: Die Spalte ist nach den ZentrumPunktkoordinaten geteilt. warum zentrum Diese Teilungsweise kann sowohl zentrierte als auch linksbündige und rechtsbündige Tabellen berücksichtigen, Zellen mit großen Längenunterschieden unter derselben Spalte können auch möglichst in derselben Spalte aufgeteilt werden.

Wenn der Längenunterschied sehr groß ist, werden Zellen in derselben Spalte fälschlicherweise in zwei Spalten aufgeteilt. Daher eine Ursache für komplexe Zeilenindex-Spalten: einige Zellen sind zu länger als die andere, die in einer gleicher Spalte liegt. Ausßerdem gibt es der zweite Grund für komplexe Zeilenindex-Spalten: primär- und sekundär-Zeilenindex. image

Wenn die beiden Spalten wie ein Reißverschluss ineinander passen können, dann ist das der erste Grund. image

wenn nicht, dann ist es der zweite Grund. image

Nun wird der Schwellwert der Teilung der Spalte dynamisch entsprechend der Länge jeder Zellen bestimmt, kleiner Zelle hat kleiner Schwellwert, also wird die Situation von Grund 1 weitestgehend vermieden, also kann sie ignoriert werden. Deswegen berücksichtigen wir bei Schmelzen der Zeilenindex-Teil nur die Situation von Grund 2. Für Grund 2 sollte die leeren Zellen in der erster Spalte ausgefüllt werden. Schwerpunkt hier ist wie sollte die leere Zellen ausgefüllt werden.

huichen5796 commented 2 years ago

image

habe aber keine Ahnung wie sollte die leere Zellen ausgefüllt werden. für diese Tabelle sollte image Zuerst wird der rote Rahmen zum grünen Rahmen hinzugefügt, dann werden der rote Rahmen und der grüne Rahmen in die leere Zelle kopiert. Aber ich denke, dieser Prozess funktioniert nur für diese eine Art von Tisch und ist nicht robust.

huichen5796 commented 2 years ago

TODOS: Angenommen 3 zu verbessern Schwellwert der Teilung der Spalten und Zeilen zu verbessern

huichen5796 commented 2 years ago

Verbessern:

oben genannte Vorgehensweise ist nur für header mit innerhalb 3 Zeilen verfügbar. Tatsächlich gibt es auch viele Tabellen mit mehr als 3 Zeilen header. so sollte erweitert werden.

In Anbetracht die Situation von einfache Tabelle 111, von 2 Zeilen header 001, 101, 011, von 3 Zeilen header 100, 010, 110, 000, Zeilen ab der dritten Zeile kann genutzt werden zum Bestimmung der Anzahl der Header.

dardurch kann die Bestimmung der zeile_nummer auf Situation mehr als 3 Zeile header erweitert werden.

dann sollten folgende Bestimmungen auch erweitert werden:

so:

Alle obigen Prozesse können somit auf einen allgemeineren Bereich ausgedehnt werden.

Aber nun gibt es ein BUG, wenn die Zeilenindex Teil auch komplex ist. image hier wird die Tebelle als 4 Zeilen header beurteilt, aber tatsächlich ist sie 3 Zeilen.

Wir mussten die Reihenfolge der Verarbeitung ändern, um die Allgemeingültigkeit zu maximieren.

  1. zuerst vertikales Schmelzen von Zeilenindex Teil image Hier verwenden wir eine robustere Methode, um den Zeilenstatus zu beurteilen: Leerzeilen sind die Zeilen, deren alle Zellen ab der dritten Spalte leer sind. In diesem Schritt werden wir alle leeren Zeilen nach oben zusammenführen (include header Zeilen).

  2. angenommen dann, dass sich die headerzeile in der oberen Hälfte der Tabelle befindet. Wenn in der unteren Hälfte der Tabelle Leerzeichen vorhanden sind, führe ich dann die Spalten, die leere Zellen haben, mit der vorherige Spalte zusammen. image

  3. dann gibt es um die Bestimmung von zeile_nummer.

  4. dann Bestimmung der Qualifikationen der Zellen in erster Zeile, dilatiert zu werden und ausgefüllt zu werden eigentlich gibt es nach Schritt 2 keine empty_cell ohne Qualifikation, ausgefüllt zu werden.

  5. Schmelzen von header