私は、およそ600,000人の名前(氏名)を、8700万人以上の観察(フルネーム)を持つ別のデータベースにほぼ一致させようとしています! fuzzywuzzyライブラリとPythonでのファジー文字列一致による2つの大きなcsvファイルの照合
私の最初の試みは、あまりにも遅かったので、私ははるかに高速であるモジュールfuzzysetを使用することにしました。 (964回の観測が一致はるかに小さいデータセットで
import time
from cfuzzyset import cFuzzySet as FuzzySet
df1=pd.read_csv(file1,delimiter='|') # test file with 964 observations
df2=pd.read_csv(file2,delimiter='|') # test file with 50,000 observations to be matched against
a=FuzzySet() # allocate the FuzzySet object
for row in file2['name']:
a.add(str(row)) # Fill the FuzzySet object with all names from file2
start_time = time.time() # Start recording the time
dicto={'index':[],'name':[]} # Dictionary where I store the output
for names in file1['f_ofulln']:
dicto['index'].append(a.get(names)[0][0])
dicto['name'].append(a.get(names)[0][1])
print("--- %s seconds ---" % (time.time() - start_time))
>>> --- 39.68284249305725 seconds ---
:私はメモリ内のすべてのデータセットをロードするのに十分な強力なコンピュータを持っていると仮定すると、私は50,000の観測と照合する964回の観測のテストファイルに次のことをやっています50,000回の観察に対して)、時間は39秒であった。
ただし、完全なデータセットに対してこのメソッドを実行する場合、これは遅すぎます。
実行時間を改善する方法を知っている人はいますか?私はすでに私が見つけたので、
多くのおかげで、
エイドリアン
迷惑メールにしないでください! – Olaf
この問題は、それよりもはるかに難しいです。マッチングを実行する前に87Mデータをブロック(またはクラスタリング)する必要があります。私はデータベース内のすべての名前に600kの名前の間のすべての距離を見つけることをお勧めしません。 'dedupe'と呼ばれるPythonライブラリには、ブロック技術の実装がいくつかあります。しかし、あなたが持っているデータセットに拡大するかどうかは分かりません。もう1つの可能性は、ファジー・マッチングを実行する前に、両方のセットに名前をdrop_duplicateすることです。 (私の曖昧な答えには申し訳ありません...) – titipata
おかげで、私は間違いなくマージするデータセットのサイズを減らすためにできるだけ多くの作業を行います。私は、ファジィセットモジュールがはるかに高速であることを発見したので、質問を修正しました。最後に、データフレーム全体をメモリに保存するためのリソースを見つけました。しかし、それでも、最終的な実行時間は数週間で数えられます! –