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])
はシーケンスマッチングよりも、この方が効率的ですか?私の問題は、実行時間と近似文字列を照合する能力との比較です。 – wingsoficarus116
既存の実装のタイミングを見ずに言うのは難しいですが、パフォーマンスが最も重要な場合は、2番目の実装をベンチマークすることをお勧めします。それはCythonで書かれているので、非常に高速でなければなりません。 pyxDamerauLevenshteinライブラリのベンチマークでは、2分で約500kの比較が実行されています。 –
MS Visual C++を先にインストールする必要があります。通常のpip installコマンドは機能しません。申し訳ありませんが、これは普通の質問ですが、あなたの推薦を実装するのが大好きです。 – wingsoficarus116