OCR を使用して財務レポートをデジタル化する場合、レポート内の特定のカテゴリを検出するためにさまざまなアプローチが使用される場合があります。たとえば、レーベンシュタイン アルゴリズムなどの従来の方法は、編集距離に基づく文字列の一致に使用でき、タイプミスやテキストの小さな変化の修正など、近似一致の処理に効果的です。
ただし、レポートの 1 行で複数のカテゴリを検出する必要がある場合、特にそれらのカテゴリが期待どおりに表示されない場合や、意味的に重複する可能性がある場合、課題はより複雑になります。
この投稿では、Facebook の LASER (Language-Agnostic SEntence Representations) 埋め込みを使用したセマンティック マッチング アプローチを分析し、このタスクを効果的に処理する方法を紹介します。
目的は、特定のテキスト行内の特定の財務条件 (カテゴリ) を識別することです。次のような、考えられる関心のあるすべての用語を表す事前定義されたカテゴリの固定セットがあると仮定しましょう。
[「収益」、「営業費用」、「営業利益」、「減価償却費」、「利息」、「純利益」、「税金」、「税引後利益」、「指標 1」]
次のような入力行があるとします。
「営業利益、純利益、税引き後利益」
この行にどの識別子が含まれているかを検出することを目的としています。
テキストの完全一致またはあいまい一致に依存する代わりに、意味的な類似性を使用します。このアプローチでは、LASER 埋め込みを利用してテキストの意味論的な意味を取得し、コサイン類似度を使用してそれを比較します。
埋め込む前に、テキストは小文字に変換され、余分なスペースが削除される前処理されます。これにより均一性が保証されます。
def preprocess(text): return text.lower().strip()
LASER エンコーダは、識別子のリストと入力/OCR ラインの両方に対して正規化された埋め込みを生成します。
identifier_embeddings = encoder.encode_sentences(identifiers, normalize_embeddings=True) ocr_line_embedding = encoder.encode_sentences([ocr_line], normalize_embeddings=True)[0]
長い識別子は、単語数に基づいて並べ替えることにより優先されます。これは、長い識別子が短い識別子を包含する可能性があるネストされた一致を処理するのに役立ちます (例: 「税引後利益」が「利益」を包含します)。
ranked_identifiers = sorted(identifiers, key=lambda x: len(x.split()), reverse=True) ranked_embeddings = encoder.encode_sentences(ranked_identifiers, normalize_embeddings=True)
コサイン類似度を使用して、各識別子が入力行に対して意味的にどの程度類似しているかを測定します。指定されたしきい値を超える類似性を持つ識別子は一致とみなされます。
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))
重複する識別子を処理するために、長い一致が優先され、その中の短い一致が確実に除外されます。
def preprocess(text): return text.lower().strip()
コードが実行されると、検出された一致のリストとその類似性スコアが出力に提供されます。入力例:
identifier_embeddings = encoder.encode_sentences(identifiers, normalize_embeddings=True) ocr_line_embedding = encoder.encode_sentences([ocr_line], normalize_embeddings=True)[0]
この方法は、カテゴリが多すぎたり、無関係なテキストが多すぎたりしない限り、1 行に複数のカテゴリがある構造化財務レポートでうまく機能します。ただし、長く複雑な入力や構造化されていないユーザー作成テキストでは、埋め込みが関連するカテゴリに焦点を当てるのに苦労する可能性があるため、精度が低下する可能性があります。ノイズの多い入力や予測不可能な入力に対しては信頼性が低くなります。
この投稿では、LASER 埋め込みがテキスト内の複数のカテゴリを検出するための便利なツールとなり得ることを示します。それは最良の選択肢ですか?おそらくそうではないかもしれませんが、特に従来のマッチング手法では不十分な可能性がある複雑なシナリオを扱う場合には、検討する価値のあるオプションの 1 つであることは確かです。
ranked_identifiers = sorted(identifiers, key=lambda x: len(x.split()), reverse=True) ranked_embeddings = encoder.encode_sentences(ranked_identifiers, normalize_embeddings=True)
以上がPython での LASER 埋め込みを使用したテキスト識別子のセマンティック マッチングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。