行の各要素が (キー、値) のペアであるデータ行の大きなコレクションがあるとします。
1) [(bird, "eagle"), (fish, "cod"), ... , (soda, "coke")]
2) [(bird, "lark"), (fish, "bass"), ..., (soda, "pepsi")]
n) ....
n+1) [(bird, "robin"), (fish, "flounder"), ..., (soda, "fanta")]
新しい行を特定できる計算を実行したいのですが、この行に「最も似ている」行はどれですか?
特定の行に対して「最も類似した」行を見つける最も直接的な方法は、その行を他のすべての行と直接比較することです。これは明らかに計算上非常に高価です。
次の形式の解決策を探しています。
行を取り、その行の微分整数を生成できる関数。この返された整数は、行の一種の「署名」になります。この署名の重要な特性は、2 つの行が非常に「似ている」場合は非常に近い整数を生成し、行が非常に「異なる」場合は離れた整数を生成することです。明らかに、それらが同一の行である場合、同じ署名が生成されます。
次に、これらの生成された署名を、それらが指す行のインデックスと共に取得し、それらを署名ごとに並べ替えることができます。このデータ構造を保持して、高速な検索を実行できるようにします。これをデータベース B と呼びます。
新しい行がある場合、データベース B の既存のどの行が最も類似しているかを知りたい場合は、次のようにします。
- 新しい行の署名を生成します
- データベース B の (signature,index) のソートされたリストをバイナリ検索して、最も近い一致を探します。
- データベース B で最も一致する (完全に一致する可能性がある) 行を返します。
私は彼らがこの質問で多くの手を振っていることを知っています. 私の問題は、この署名を生成する関数が何であるかを実際に知らないことです。レーベンシュタイン距離が表示されますが、それらは変換コストを表しており、署名ではありません。非可逆圧縮を試すことができることがわかりました.2つのものが同じものに圧縮されるため、「バケッタブル」である可能性があります。これを行う方法について他のアイデアを探しています。
ありがとうございました。