動作するアルゴリズムを作成しましたが、実行時間は非常にひどいものです。はい、私はそれが恐ろしいことになることを最初から知っていますが、それほどではありません. わずか 200000 レコードの場合、プログラムは 1 時間以上実行されます。
基本的に私がやっていることは次のとおりです。
for each searchfield in search fields
for each sample in samples
do a q-gram matching
if there are matches then return it
else
split the searchfield into uniwords
for each sample in samples
split sample into uniwords
for each uniword in samples
if the uniword is a known abbreviation
then search the dictionary for its full word or other known abbr
else do a jaro-winkler matching
average the distances of all the uniwords
if the average is above threshold then make it as a match and break
end for
if there is a match make a comment that it matched one of the samples partially
end else
end for
はい、このコードは非常にループに適しています。リコールが非常に重要であるため、私は総当たりを使用しています。だから、何百万ものデータの200000データに対して実行しているだけでなく、クライアントのコンピューターがハイエンドではないため、どうすれば高速化できるのでしょうか。このプログラムをテストするコンピューターは、4 GB の RAM を搭載したデュアル コアです)。TF/IDF に出会いましたが、それで十分かどうかはわかりません。どうすればグーグルはリアルタイムで検索できるのだろうか。
前もって感謝します!
編集:このプログラムはデータフィルターです。200,000 個のダミー データ (実際のデータは約 12M です) から、サンプルに関係のないデータをフィルタリングする必要があります (500 個のダミー サンプル、実際のサンプルの量はまだわかりません)。
与えられたダミーデータとサンプルでは、実行時間は約 1 時間ですが、あちこちいじくり回した後、10 ~ 15 分に短縮することに成功しました。同じ文字で始まるフィールドとサンプルをグループ化し (the、a、an などの特別で意味のない単語を割り引いて)、同じ最初の文字でフィールドをサンプルに一致させることで、それを軽減しました。そこに問題があることはわかっています。フィールドの最初の文字のスペルが間違っていた場合はどうなりますか? しかし、その数はごくわずかだと思います。サンプルは常に維持されているため、正しいスペルになっています。