0

各行のように、組織の名前とその組織内の個人の位置を非構造化テキストとして含むテキスト フィールドを持つ CSV ファイルを処理しようとしています。このフィールドは通常、次のようなテキストの混乱です。

Assoc. Research Professor  Dept. Psychology  Univ. California  Santa Barbara

役職と組織名を出さなければなりません。役職については、さまざまな職業の約 60 の異なる正規表現のシリーズに preg_match を使用していますが、かなりうまく機能していると思います (私の推測では、約 80% をキャッチすると思います)。しかし、組織名を聞き取れずに困っています。簡単な preg_match を実行できる約 16,000 の組織名を含む MySQL テーブルがありますが、一般的なスペルミスと略語により、組織の約 30% しか検出できません。たとえば、私のデータベースには

University of California Santa Barbara

ただし、CSV ファイルには次のいずれかのオプションが含まれる場合があります。

Univ Cal Santa Barbara
University Cal-Santa Barbara
University California-Santa Barbara
Cal University, Santa Barbara

数十万件のレコードを処理する必要があり、現在正しく処理されていないレコードの 70% を修正したり、組織ごとに複数のエイリアスを苦労して作成したりするのに時間を費やすことはできません。私ができるようにしたいのは、小さな違い (小さなスペルミス、ハイフンとスペース、一般的な略語など) をキャッチし、それでも一致が見つからない場合は、理想的には組織名を認識して新しいレコードを作成することです。それのための。

  • Python または PHP のどのライブラリまたはツールを使用すると、より広い範囲で類似性を照合できますか?
  • Python の NLTK はスペルミスをキャッチしますか?
  • AlchemyAPI を使用してスペルミスのある組織を検出することは可能ですか? これまでのところ、正しいスペルの組織をキャッチするためにしか使用できませんでした
  • 短い文字列 (組織名) を長い文字列 (名前と無関係な情報を含む) と比較しているので、PHP の similar_text 関数を使用する希望はありますか?

どんな助けや洞察もいただければ幸いです。

4

2 に答える 2

2

これはファジー論理の領域内にあります。これらが役立つかどうかを確認してください。

http://www.phpclasses.org/blog/post/119-Neural-Networks-in-PHP.html

http://ann.thwien.de/index.php/Installation

于 2010-11-17T16:54:11.683 に答える
1

を使用difflibして、CSV 入力と正規のスペルの間の類似率を計算し、それが特定のしきい値 (0.65 など) を超えている場合に一致と見なすことができる場合があります。

例えば:

import difflib

exact = 'University of California Santa Barbara'

inputs = ['Univ Cal Santa Barbara',
          'University Cal-Santa Barbara',
          'University California-Santa Barbara',
          'Cal University, Santa Barbara',
          'Canterbury University']

sm = difflib.SequenceMatcher(None, exact)
ratios = []
for input in inputs:
    sm.set_seq2(input)
    ratios.append(sm.ratio())

print ratios

与えます:

[0.73333333333333328, 0.81818181818181823, 0.93150684931506844,
 0.71641791044776115, 0.33898305084745761]

'Canterbury University' の match ratio() が、入力した値よりもはるかに低いことに注意してください。

繰り返しますが、SequenceMatcher.ratio() は、16,000 を超える値の計算が遅すぎる可能性があります。

于 2010-11-17T17:11:16.847 に答える