ドキュメントを含む大規模なpostgresqlデータベースがあります。テーブル内の行として表されるすべてのドキュメント。新しいドキュメントがデータベースに追加されたら、重複をチェックする必要があります。select
しかし、完全に一致するものを見つけるためだけに使用することはできません。2つのドキュメントはわずかに異なる場合がありますが、それでも重複と見なすことができます。たとえば、一部のマイナーフィールドが異なり、他のすべてのフィールドが等しい場合などです。
私はこの問題を研究し、この問題を解決する方法を見つけます。すべてのドキュメントの署名を計算MinHash
し、転置インデックスを作成して、データベースから同様のドキュメントをクエリすることができます。MinHash
しかし、リレーショナルデータベースにマッピングする方法がわかりません。
私が理解しているように、MinHash
署名はN個のハッシュのリストです。ここでNはいくつかの属性です。類似性は次のように計算されます。
# Given 2 signatures Sa and Sb containing N hashes.
# Calculate number of equal hashes Neq.
number_of_equal_hashes = 0
for ix in range(0, N):
if Sa[ix] == Sb[ix]:
number_of_equal_hashes += 1
similarity = float(number_of_equal_hashes)/N
すでに2つの署名がある場合、これは簡単です。問題は、データベース内で類似性がある程度の値以下のすべてのドキュメント(対応する署名を含む)を見つけることです。
たとえば、次のように複数の列を持つテーブルを作成できます。
| minhash0 | minhash1 | minhash3 | docid |
各minhashX
列は、ドキュメントの属性の1つのminhashに対応しdocid
、ドキュメントの識別子です。次の方法で同様のレコードをクエリできます。
select * from invidx
where ((case when minhash0=minhash2search0 then 1 else 0 end) +
(case when minhash1=minhash2search1 then 1 else 0 end) +
(case when minhash2=minhash2search2 then 1 else 0 end))/N > THRESHOLD
ここで、minhash2searchX
は新しいドキュメントのミンハッシュであり、THRESHOLDは最小限の類似性です。ただし、このアプローチではフルスキャンが必要です。このアルゴリズムを高速化する方法はありますか?