RのtextreusepackgeがLSHバケットを元のminhashesよりもはるかに大きくするのはなぜですか?
私が理解している限り、LSHメソッドの主な機能の1つは、基礎となるハッシュ(多くの場合、ミンハッシュ)を超えたデータ削減です。私はtextreuse
Rでパッケージを使用してきましたが、生成されるデータのサイズに驚いています。textreuse
はピアレビューされたROpenSciパッケージなので、正しく機能すると思いますが、私の質問は解決しません。
minhash関数とLSH関数にそれぞれ256の順列と64のバンドを使用するとします。これは、50%という低い相対的な確実性(〜98%)で検出するためによく使用される現実的な値です。
TextReuseTextDocument
(256パーマ)を使用してランダムなテキストファイルをハッシュしtrtd
、に割り当てると、次のようになります。
object.size(trtd$minhashes)
> 1072 bytes
次に、このオブジェクト(64バンド)のLSHバケットを作成しl
、に割り当てます。次のようになります。
object.size(l$buckets)
> 6704 bytes
したがって、LSHバケットに保持されるハッシュは、元のミンハッシュの6倍になります。textreuse
md5ダイジェストを使用してバケットハッシュを作成するため、これが発生することを理解しています。
しかし、これは無駄/やり過ぎではありませんか、そして私はそれを改善することはできませんか?私たちのデータ削減手法がこの程度まで膨れ上がってしまうのは正常ですか?また、元のハッシュ(perms = 256およびbands = 256と同様)に基づいてドキュメントを照合し、しきい値を使用して誤検知を取り除く方が効果的ではありませんか?
大量のデータセットのマイニングなどの一般的なテキストを確認しましたが、この特定の実装についてはこの質問が残っていることに注意してください。また、質問は好奇心からだけでなく、必要性からでもあることに注意してください。数百万または数十億のハッシュがある場合、これらの違いは重要になります。
回答
パッケージの作者はこちら。はい、必要以上のハッシュ/バンドを使用するのは無駄です。(ここではキロバイトについて話していることに注意してください。これは元のドキュメントよりもはるかに小さい可能性があります。)
問題は、何が必要かということです。同一に近い(つまり、Jaccardスコアが1.0に近い)一致のみを検索する必要がある場合は、特に機密性の高い検索は必要ありません。ただし、部分的なオーバーラップのみを共有する可能性のある一致を確実に検出する必要がある場合(つまり、Jaccardスコアが0に近い場合)、より多くのハッシュ/バンドが必要になります。
MMDを読んだので、そこで方程式を調べることができます。ただし、パッケージには2つの関数があり、ここに記載されています。これは、必要なハッシュ/バンドの数を計算するのに役立ちます。lsh_threshold()
検出されるJaccardスコアのしきい値を計算します。whilelsh_probability()
は、特定のJaccardスコアを持つドキュメントのペアが検出される可能性がどの程度あるかを示します。検索問題に最適なハッシュ/バンドの数が得られるまで、これら2つの関数を試してみてください。