Beim Einsatz von OCR zur Digitalisierung von Finanzberichten stoßen Sie möglicherweise auf verschiedene Ansätze zur Erkennung bestimmter Kategorien in diesen Berichten. Herkömmliche Methoden wie der Levenshtein-Algorithmus können beispielsweise für den String-Abgleich basierend auf der Bearbeitungsentfernung verwendet werden, was ihn effektiv für die Behandlung von nahezu Übereinstimmungen macht, wie z. B. die Korrektur von Tippfehlern oder kleinen Abweichungen im Text.
Die Herausforderung wird jedoch komplexer, wenn Sie mehrere Kategorien in einer einzelnen Zeile eines Berichts erkennen müssen, insbesondere wenn diese Kategorien möglicherweise nicht genau wie erwartet angezeigt werden oder sich semantisch überschneiden könnten.
In diesem Beitrag analysieren wir einen semantischen Matching-Ansatz unter Verwendung der LASER-Einbettungen (Language-Agnostic SEntence Representations) von Facebook und zeigen, wie er diese Aufgabe effektiv bewältigen kann.
Das Ziel besteht darin, bestimmte Finanzbegriffe (Kategorien) in einer bestimmten Textzeile zu identifizieren. Nehmen wir an, wir haben einen festen Satz vordefinierter Kategorien, die alle möglichen Begriffe von Interesse darstellen, wie zum Beispiel:
["Umsatz", "Betriebsaufwand", "Betriebsgewinn", "Abschreibung", "Zinsen", "Nettogewinn", "Steuer", "Gewinn nach Steuern", "Metrik 1"]
Angenommen eine Eingabezeile wie:
„Betriebsgewinn, Nettogewinn und Gewinn nach Steuern“
Wir wollen herausfinden, welche Bezeichner in dieser Zeile vorkommen.
Anstatt uns auf exakte oder unscharfe Textübereinstimmungen zu verlassen, verwenden wir semantische Ähnlichkeit. Dieser Ansatz nutzt LASER-Einbettungen, um die semantische Bedeutung von Text zu erfassen und ihn mithilfe der Kosinusähnlichkeit zu vergleichen.
Vor dem Einbetten wird der Text vorverarbeitet, indem er in Kleinbuchstaben umgewandelt und zusätzliche Leerzeichen entfernt wird. Dies sorgt für Einheitlichkeit.
def preprocess(text): return text.lower().strip()
Der LASER-Encoder generiert normalisierte Einbettungen sowohl für die Liste der Identifikatoren als auch für die Eingabe-/OCR-Zeile.
identifier_embeddings = encoder.encode_sentences(identifiers, normalize_embeddings=True) ocr_line_embedding = encoder.encode_sentences([ocr_line], normalize_embeddings=True)[0]
Längere Bezeichner werden priorisiert, indem sie nach der Wortanzahl sortiert werden. Dies hilft bei der Handhabung verschachtelter Übereinstimmungen, bei denen längere Bezeichner möglicherweise kürzere Bezeichner subsumieren (z. B. „Gewinn nach Steuern“ subsumiert „Gewinn“).
ranked_identifiers = sorted(identifiers, key=lambda x: len(x.split()), reverse=True) ranked_embeddings = encoder.encode_sentences(ranked_identifiers, normalize_embeddings=True)
Mithilfe der Kosinusähnlichkeit messen wir, wie semantisch jeder Bezeichner der Eingabezeile ähnelt. Bezeichner mit einer Ähnlichkeit über einem bestimmten Schwellenwert gelten als Übereinstimmungen.
matches = [] threshold = 0.6 for idx, identifier_embedding in enumerate(ranked_embeddings): similarity = cosine_similarity([identifier_embedding], [ocr_line_embedding])[0][0] if similarity >= threshold: matches.append((ranked_identifiers[idx], similarity))
Um mit überlappenden Bezeichnern umzugehen, werden längere Übereinstimmungen priorisiert, um sicherzustellen, dass kürzere Übereinstimmungen darin ausgeschlossen werden.
def preprocess(text): return text.lower().strip()
Wenn der Code ausgeführt wird, liefert die Ausgabe eine Liste der erkannten Übereinstimmungen zusammen mit ihren Ähnlichkeitswerten. Für die Beispieleingabe:
identifier_embeddings = encoder.encode_sentences(identifiers, normalize_embeddings=True) ocr_line_embedding = encoder.encode_sentences([ocr_line], normalize_embeddings=True)[0]
Diese Methode funktioniert gut in strukturierten Finanzberichten mit mehreren Kategorien in einer einzigen Zeile, vorausgesetzt, es gibt nicht zu viele Kategorien oder viel nicht zusammenhängenden Text. Allerdings kann sich die Genauigkeit bei längeren, komplexen Eingaben oder unstrukturiertem benutzergeneriertem Text verschlechtern, da die Einbettungen möglicherweise Schwierigkeiten haben, sich auf relevante Kategorien zu konzentrieren. Bei verrauschten oder unvorhersehbaren Eingaben ist es weniger zuverlässig.
Dieser Beitrag zeigt, wie LASER-Einbettungen ein nützliches Werkzeug zur Erkennung mehrerer Kategorien im Text sein können. Ist es die beste Option? Vielleicht nicht, aber es ist sicherlich eine der Optionen, die es wert sind, in Betracht gezogen zu werden, insbesondere wenn es um komplexe Szenarien geht, bei denen herkömmliche Matching-Techniken möglicherweise nicht ausreichen.
ranked_identifiers = sorted(identifiers, key=lambda x: len(x.split()), reverse=True) ranked_embeddings = encoder.encode_sentences(ranked_identifiers, normalize_embeddings=True)
Das obige ist der detaillierte Inhalt vonSemantischer Abgleich von Textbezeichnern mithilfe von LASER-Einbettungen in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!