Heim > Backend-Entwicklung > Python-Tutorial > Semantischer Abgleich von Textbezeichnern mithilfe von LASER-Einbettungen in Python

Semantischer Abgleich von Textbezeichnern mithilfe von LASER-Einbettungen in Python

Linda Hamilton
Freigeben: 2024-11-25 05:33:11
Original
639 Leute haben es durchsucht

Semantic Matching of Text Identifiers Using LASER Embeddings in Python

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.

Problem

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.

Semantisches Matching mit LASER

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.

Durchführung

Vorverarbeitung des Textes

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()
Nach dem Login kopieren
Nach dem Login kopieren

Einbetten von Bezeichnern und Eingabezeilen

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]

Nach dem Login kopieren
Nach dem Login kopieren

Rangfolge der Identifikatoren nach Spezifität

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)

Nach dem Login kopieren
Nach dem Login kopieren

Ähnlichkeit berechnen

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))

Nach dem Login kopieren

Verschachtelte Übereinstimmungen auflösen

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()
Nach dem Login kopieren
Nach dem Login kopieren

Ergebnisse

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]

Nach dem Login kopieren
Nach dem Login kopieren

Überlegungen zu längeren und komplexen Eingaben

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.

Abschluss

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.

Vollständiger Code

ranked_identifiers = sorted(identifiers, key=lambda x: len(x.split()), reverse=True)
ranked_embeddings = encoder.encode_sentences(ranked_identifiers, normalize_embeddings=True)

Nach dem Login kopieren
Nach dem Login kopieren

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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage