Ich benötige Unterstützung bei einem ML-Projekt, das ich gerade erstellen möchte.
Ich erhalte viele Rechnungen von vielen verschiedenen Lieferanten - alle in ihrem eigenen Layout. Ich muss 3 Schlüsselelemente aus den Rechnungen extrahieren . Diese 3 Elemente befinden sich alle in einer Tabelle / Werbebuchung für alle Rechnungen.
Die 3 Elemente sind:
- 1 : Tarifnummer (Ziffer)
- 2 : Menge (immer eine Ziffer)
- 3 : Gesamtzeilenbetrag (Geldwert)
Bitte beachten Sie den folgenden Screenshot, in dem ich dieses Feld auf einer Musterrechnung markiert habe.
Ich habe dieses Projekt mit einem Vorlagenansatz gestartet, der auf regulären Ausdrücken basiert . Dies war jedoch überhaupt nicht skalierbar und ich endete mit Tonnen verschiedener Regeln.
Ich hoffe, dass maschinelles Lernen mir hier helfen kann - oder vielleicht eine hybride Lösung?
Der gemeinsame Nenner
In allen meinen Rechnungen besteht trotz der unterschiedlichen Layouts jede Werbebuchung immer aus einer Tarifnummer . Diese Tarifnummer besteht immer aus 8 Ziffern und ist immer wie folgt formatiert:
- xxxxxxxx
- xxxx.xxxx
- xx.xx.xx.xx
(Wobei "x" eine Ziffer von 0 bis 9 ist).
Des Weiteren , wie Sie auf der Rechnung sehen kann , gibt es sowohl einen Einheitspreis und ein Gesamtbetrag pro Zeile. Der Betrag, den ich benötige, ist immer der höchste für jede Zeile.
Die Ausgabe
Für jede Rechnung wie oben benötige ich die Ausgabe für jede Zeile. Dies könnte zum Beispiel so aussehen:
{
"line":"0",
"tariff":"85444290",
"quantity":"3",
"amount":"258.93"
},
{
"line":"1",
"tariff":"85444290",
"quantity":"4",
"amount":"548.32"
},
{
"line":"2",
"tariff":"76109090",
"quantity":"5",
"amount":"412.30"
}
Wohin von hier aus?
Ich bin mir nicht sicher, was ich tun möchte, fällt unter maschinelles Lernen und wenn ja, in welche Kategorie. Ist es Computer Vision? NLP? Named Entity Recognition?
Mein erster Gedanke war:
- Konvertieren Sie die Rechnung in Text. (Die Rechnungen sind alle in textfähigen PDFs, so dass ich so etwas wie verwenden kann
pdftotext
, um die genauen Textwerte zu erhalten) - Erstellen Sie benutzerdefinierte benannte Entitäten für
quantity
,tariff
undamount
- Exportieren Sie die gefundenen Entitäten.
Ich habe jedoch das Gefühl, dass mir etwas fehlt.
Kann mir jemand in die richtige Richtung helfen?
Bearbeiten:
Im Folgenden finden Sie einige weitere Beispiele dafür, wie ein Abschnitt mit einer Rechnungstabelle aussehen kann:
Bearbeiten 2:
Die drei Beispielbilder ohne Rahmen / Begrenzungsrahmen finden Sie weiter unten :
Tariff No.:
oder$
) oder der Spalte, zu der es gehört, zu koppeln (hier kann es Ihnen helfen, die räumlichen Informationen der Buchstaben zu speichern). wenn irgendein OCR-Tool das tut). Ich glaube, Sie müssen sich weder mit diesem Problem (abgesehen von der vorgefertigten OCR) noch mit NLP (es ist keine natürliche Sprache) mit maschinellem Lernen befassen. Ohne zu sehen, wie gut diese Tools mit Ihren Daten funktionieren, können wir nur spekulieren, was der nächste Schritt ist und was notwendig ist: DAntworten:
Ich arbeite an einem ähnlichen Problem in der Logistikbranche und vertraue mir, wenn ich sage, dass diese Dokumententabellen in unzähligen Layouts vorliegen. Zahlreiche Unternehmen, die dieses Problem etwas gelöst haben und verbessern, sind wie folgt aufgeführt
Die Kategorie, in die ich dieses Problem einordnen möchte, wäre multimodales Lernen , da sowohl Text- als auch Bildmodalitäten einen großen Beitrag zu diesem Problem leisten. Obwohl OCR-Token eine wichtige Rolle bei der Klassifizierung von Attributwerten spielen, sind ihre Position auf der Seite, der Abstand und die Abstände zwischen Zeichen wichtige Merkmale bei der Erkennung von Tabellen-, Zeilen- und Spaltengrenzen. Das Problem wird umso interessanter, wenn Zeilen über mehrere Seiten verteilt sind oder einige Spalten nicht leere Werte enthalten.
Während die akademische Welt und Konferenzen den Begriff Intelligente Dokumentverarbeitung verwenden , werden im Allgemeinen sowohl einzelne Felder als auch tabellarische Daten extrahiert. Ersteres ist in der Forschungsliteratur eher durch Attributwertklassifizierung bekannt, und letzteres ist durch Tabellenextraktion oder Extraktion mit wiederholter Struktur bekannt.
Bei unserem Versuch, diese halbstrukturierten Dokumente in den letzten drei Jahren zu verarbeiten, halte ich es für eine lange und mühsame Reise , sowohl Genauigkeit als auch Skalierbarkeit zu erreichen . Die Lösungen, die Skalierbarkeit / "vorlagenfreier" Ansatz bieten, haben einen Korpus von halbstrukturierten Geschäftsdokumenten in der Größenordnung von Zehntausenden, wenn nicht Millionen, kommentiert. Obwohl dieser Ansatz eine skalierbare Lösung ist, ist er so gut wie die Dokumente, für die er geschult wurde. Wenn Ihre Dokumente aus der Logistik- oder Versicherungsbranche stammen, die für ihre komplexen Layouts bekannt sind und aufgrund der Compliance-Verfahren sehr genau sein müssen, ist eine "vorlagenbasierte" Lösung das Allheilmittel gegen Ihre Krankheiten. Es wird garantiert mehr Genauigkeit geben.
Wenn Sie Links zu vorhandenen Forschungsergebnissen benötigen, erwähnen Sie diese in den Kommentaren unten und ich werde sie gerne teilen.
Außerdem würde ich empfehlen, pdfparser 1 über pdf2text oder pdfminer zu verwenden, da erstere Informationen auf Zeichenebene in digitalen Dateien mit deutlich besserer Leistung liefern.
Würde mich über Feedback freuen, da dies meine erste Antwort hier ist.
quelle
Hier ist ein Versuch mit OpenCV, die Idee ist:
Erhalten Sie ein Binärbild. Wir laden das Bild, vergrößern
imutils.resize
es, um bessere OCR-Ergebnisse zu erzielen (siehe Tesseract verbessert die Qualität ), konvertieren in Graustufen und dann den Otsu-Schwellenwert , um ein Binärbild (1-Kanal) zu erhalten.Entfernen Sie die Tabellengitterlinien. Wir erstellen einen horizontalen und einen vertikalen Kernel und führen dann morphologische Operationen durch , um benachbarte Textkonturen zu einer einzigen Kontur zu kombinieren. Die Idee ist, eine ROI-Zeile als ein Stück für OCR zu extrahieren.
Zeilen-ROIs extrahieren. Wir finden Konturen und sortieren sie dann von oben nach unten mit
imutils.contours.sort_contours
. Dies stellt sicher, dass wir jede Zeile in der richtigen Reihenfolge durchlaufen. Von hier aus durchlaufen wir die Konturen, extrahieren den Zeilen-ROI mithilfe von Numpy Slicing, OCR mithilfe von Pytesseract und analysieren dann die Daten.Hier ist die Visualisierung jedes Schritts:
Bild eingeben
Binäres Bild
Morph schließen
Visualisierung der Iteration durch jede Zeile
Extrahierte Zeilen-ROIs
Ergebnis der Ausgabe der Rechnungsdaten:
Leider bekomme ich beim Anprobieren des 2. und 3. Bildes gemischte Ergebnisse. Diese Methode führt bei den anderen Bildern nicht zu hervorragenden Ergebnissen, da das Layout der Rechnungen alle unterschiedlich ist. Dieser Ansatz zeigt jedoch, dass es möglich ist, herkömmliche Bildverarbeitungstechniken zum Extrahieren der Rechnungsinformationen zu verwenden, unter der Annahme, dass Sie ein festes Rechnungslayout haben.
Code
quelle