私は潜在的に "乱雑な"エンティティ名の入力セットを参照リストの "クリーン"エンティティ名に一致させようとするアプリケーションに取り組んでいます。私は距離の編集や一般的なファジーマッチングアルゴリズムを使って作業してきましたが、一般的な用語にファジーマッチの重みが少なくなるような、用語の重み付けを可能にする優れたアプローチがあれば疑問です。用語ウェイトと一致するファジー文字列
この例では、Pythonのdifflib
ライブラリを使用しています。私は多くの標準化されたコンポーネントが共通しているため、エンティティを区別するために使用することができない組織名を使用しています。 RESEARCH
、INSTITUTE
、SEMICONDUCTOR
、MANUFACTURING
、およびCORP
が高頻度であるため、
from difflib import SequenceMatcher
e1a = SequenceMatcher(None, "ZOECON RESEARCH INSTITUTE",
"LONDON RESEARCH INSTITUTE")
print e1a.ratio()
0.88
e1b = SequenceMatcher(None, "ZOECON", "LONDON")
print e1b.ratio()
0.333333333333
e2a = SequenceMatcher(None, "WORLDWIDE SEMICONDUCTOR MANUFACTURING CORP",
"TAIWAN SEMICONDUCTOR MANUFACTURING CORP")
print e2a.ratio()
0.83950617284
e2b = SequenceMatcher(None, "WORLDWIDE",
"TAIWAN")
print e2b.ratio()
0.133333333333
両方の例では、完全な文字列に非常に多くの組織名で一般的な用語をスコア。私は、単語頻度をファジーストリングマッチング(必ずしもdifflib
を使用しているわけではありません)に統合する方法のアイデアを探しています。その結果、スコアは一般的な用語の影響を受けませんし、結果は "e1b" e2b "の例です。
大きな「頻出用語」リストを作成して比較対象から除外することはできますが、できるだけ頻度を使用したいのですが、一般的な単語でもの部分との情報とカットオフポイントどのリストも当然任意である。ここで
[Whoosh](https://bitbucket.org/mchaput/whoosh/wiki/Home)は面白そうです。特に、[スコアリング](http://packages.python.org/Whoosh/api/scoring。 html)モジュールと[whoosh.reading.TermInfo](http://packages.python.org/Whoosh/api/reading.html?highlight=frequency#whoosh.reading.TermInfo)の 'doc_frequency()'と 'weight () ' –
ファジーマッチする名前の完全なコーパスにアクセスできますか?もしそうなら、tf-idfを使ってファジーマッチングモデルを訓練することができます。 –
あなたは文字列を分割し、すべての部分の違いを計算することができます。これは、名前がほぼ同じで、単語の違いが1つの場合に役立ちます。しかし、これはおそらくあなたがやりたいことに対して頑強ではありません。 – Bakuriu