2012-10-06 9 views
12

私は潜在的に "乱雑な"エンティティ名の入力セットを参照リストの "クリーン"エンティティ名に一致させようとするアプリケーションに取り組んでいます。私は距離の編集や一般的なファジーマッチングアルゴリズムを使って作業してきましたが、一般的な用語にファジーマッチの重みが少なくなるような、用語の重み付けを可能にする優れたアプローチがあれば疑問です。用語ウェイトと一致するファジー文字列

この例では、Pythonのdifflibライブラリを使用しています。私は多くの標準化されたコンポーネントが共通しているため、エンティティを区別するために使用することができない組織名を使用しています。 RESEARCHINSTITUTESEMICONDUCTORMANUFACTURING、および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 "の例です。

大きな「頻出用語」リストを作成して比較対象から除外することはできますが、できるだけ頻度を使用したいのですが、一般的な単語でもの部分との情報とカットオフポイントどのリストも当然任意である。ここで

+2

[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 () ' –

+1

ファジーマッチする名前の完全なコーパスにアクセスできますか?もしそうなら、tf-idfを使ってファジーマッチングモデルを訓練することができます。 –

+0

あなたは文字列を分割し、すべての部分の違いを計算することができます。これは、名前がほぼ同じで、単語の違いが1つの場合に役立ちます。しかし、これはおそらくあなたがやりたいことに対して頑強ではありません。 – Bakuriu

答えて

2

はあなたのための奇妙なアイデアです:

は、あなたの入力し、その差分を圧縮します。

たとえば、 Huffmanまたはdictionary coderを入力すると、自動的に一般的な条件が処理されます。しかし、あなたの例ではロンドンがおそらく比較的一般的な言葉ですが、Lundonのミスペルトはまったくなく、圧縮された用語間の相違は生の用語よりはるかに高いです。

1

私の意見では、一般的な解決策はあなたの考え方と決して一致しません。あなたのデータに関する暗黙の知識があるとすぐに、それを何らかの形でコードに入れなければなりません。固定された既存のソリューションを直ちに不適格とする。

おそらく、NLP技術のアイデアを得るには、http://nltk.org/をご覧ください。あなたはあなたのデータについて十分に教えてくれませんが、POSタガーは、関連性の高い用語を多かれ少なかれ特定するのに役立ちます。都市、国、...の名前を持つ利用可能なデータベースは、それをさらに処理する前にデータをクリーンアップするのに役立つかもしれません。

利用可能なツールはたくさんありますが、高品質の出力を得るには、データとユースケースに合わせてカスタマイズされたソリューションが必要です。

+0

アプリケーション固有のソリューションに満足しています。私のデータは残念なことに、文脈のないエンティティ名です。私はPOSタギングという考えが好きですが、タガーから返されるものの95%がNNPになるような名前しかないので恐れています。 – rjf

+0

POSタグは「デフォルト」タグに限定されません。独自のタグ(CITY、NAME、TYPE、...)を使用してサンプルセットに自分自身をタグ付けし、そのデータを使用してタガーを訓練することができます。私がここに書き留めることができるより多くの選択肢があり、私はあなたのデータで "遊ぶ"必要があるより多くのヒントを与えるためにあります。ごめんなさい。 – Achim

2

各文字列を単語のリストに分割し、各単語の比較を実行して単語の一致のスコアを保持するリストを取得する方法について教えてください。間接的な一致または部分一致を見つけることができます。

あなた自身の体重を加えることができます。

もちろん、次のようなオフセットを処理する必要があります。

「革のためのロンドン会社」

1

私はちょうど別の異なるアプローチを提案しています「革のため、ロンドンの会社」。エンティティ名が参照リストから来ていると述べたので、共著者名、製品/論文タイトル、市区町村、州、国のような追加のコンテキスト情報があるのでしょうか?

上記のような便利なコンテキストがある場合は、実際にそれらの関係からエンティティのグラフを作成できます。関係は、例えば、次のようになります。

Author-paper relation 
Co-author relation 
author-institute relation 
institute-city relation 
.... 

それはで詳細に説明グラフベースのエンティティ解決手法を使用する時が来た:

アプローチを共著者の分野で非常に優れたパフォーマンスを発揮します。