2017-01-16 15 views
0

2つの名前のセットが2つあります。「近いもの」の一致が見つからない場合は、名前を自分自身に一致させます。2組の名前の間で最も近い一致を見つける

私の現在のアプローチは、すべての可能な組み合わせでデータフレームを作成し、それを反復処理してSequenceMatcher(smとしてインポート)経由で類似率を計算するために.applyまたはリストを使用することです。

問題は、両方のリストに数千の名前があるため、実行時間が非常に長くなります。

私の一致基準は理想的には> 0.85のsm比であり、最初の名前は全体の単語として2番目の名前にあります。これらの基準が満たされない場合、その名前はそれ自身と一致する必要があります。

私が実装したい最後のステップは、元のシリーズをこれらの一致した名前に置き換えることです。ここで

が私の現在のアプローチのためのコードであり、これは不明であるなら、私に知らせてください、私は明確にどのように役立つか:

stop_words = [ 
      'pharmaceuticals', 
      'pharmaceutical', 
      'pharma', 
      'therapeutic', 
      'biopharma', 
      'therapeutics', 
      'international', 
      'biotechnology', 
      'vaccines', 
      '\&', 
      '&', 
      'co.', 
      'co', 
      'biotherapeutics', 
      'biotherapeutic', 
      'life science', 
      'life sciences', 
      'laboratories', 
      'biologics', 
      ] 

temp_db_companies = db['Company'] 

def approximate_match(s1, s2): 
    return str(sm(None, str(s1).lower().strip(), str(s2).lower().strip()).ratio()) + '|' + str(s2).strip() 


def replace_val_w_best_match(df, col_initial, series_final, stop_words): 
    init_names = df[col_initial].str.lower().str.split(" ", expand=True).replace(stop_words, "").fillna('') 

    init_names = pd.Series(['' for n in range(len(init_names))]).str.cat([init_names[col] for col in init_names.columns], sep= " ").str.replace(' ', ' ').reset_index() 

    matching_df = pd.DataFrame(columns = list(init_names.columns) + list(series_final), data = init_names) 

    matching_df = pd.melt(matching_df, 
          id_vars = ['index', 0], 
          value_vars = list(series_final), 
          var_name = 'Comparators', 
          value_name = 'Best match') 

# matching = matching_df.apply(lambda row: approximate_match(row[0], row['Comparators']), axis = 1) 

    l = [(matching_df[0]), list(matching_df['Comparators'])] 

    ratio = [sm(None, name1, name2) for name1 in l[0] for name2 in l[1]] 

    match = [name2 for name1 in l[0] for name2 in l[1]] 

    print(ratio[:5]) 
    print(match[:5]) 

答えて

1

とは何あなたはおそらく探していることはレーベンシュタイン距離アルゴリズムです。ある文字列を他の文字列に変換するために必要な編集の最小回数を計算します。

は、このライブラリをチェックアウト: https://github.com/ztane/python-Levenshtein/

レーベンシュタインライブラリがこの問題にあなたを助けるために設計されたStringMatcher.pyというクラスがあります。

このライブラリにも同様の機能が含まれていますhttps://github.com/gfairchild/pyxDamerauLevenshtein

+0

はシーケンスマッチングよりも、この方が効率的ですか?私の問題は、実行時間と近似文字列を照合する能力との比較です。 – wingsoficarus116

+0

既存の実装のタイミングを見ずに言うのは難しいですが、パフォーマンスが最も重要な場合は、2番目の実装をベンチマークすることをお勧めします。それはCythonで書かれているので、非常に高速でなければなりません。 pyxDamerauLevenshteinライブラリのベンチマークでは、2分で約500kの比較が実行されています。 –

+0

MS Visual C++を先にインストールする必要があります。通常のpip installコマンドは機能しません。申し訳ありませんが、これは普通の質問ですが、あなたの推薦を実装するのが大好きです。 – wingsoficarus116

関連する問題