2017-11-30 4 views
0

私は類似のアイテムを見つけるためにBloom FiltersとMinhashingを実装すべきアプリケーションがあります。K-長の文字列のMinhashing

私はブルームフィルタを実装していますが、私はそれを行うにはMinhashing部分を理解していることを確認する必要があります。

  • aplicationは、それが文書でK-長文字列と店舗数を生成し、その後、すべてのそれらはBloomに挿入されています。
  • ここで、MinHashを実装するには、ユーザーが文字列を挿入して比較し、ドキュメント上で最も似た文字列を探すようにするオプションを指定します。

文書上のすべての文字列を揃える必要がありますか?問題は、私が実際に私を助ける何かを見つけることができないということです。私が見つけたのは2つの文書に関するものであり、決して1つの文字列に対する1つの文字列ではありません。

答えて

0

したがって、ユーザーは文字列を入力し、アプリケーションは単一のドキュメント内で最も類似した文字列を見つけます。 「類似性」とは、レーベンシュタイン距離(「ネコ」は「ラット」や「カート」と同様のものとみなされます)などの何かを意味しますか?類似した段落、類似の文章、類似のフレーズ、または同様の言葉を探していますか?これらは重要な考慮事項です。

また、1つの文字列と1組の文字列を比較しているとします。これらの文字列は何ですか?センテンス?パラグラフ?複数の段落にまたがる複数の類似点(または複数の文章、または何を持っているか)を見つけたくない場合は、ドキュメントを複数の別々の文字列と考えることが理にかなっています。そうでなければ、それを単一の長い文字列と考えるべきです。

MinHashアルゴリズムは、すべてのドキュメントを同時にメモリに保存することが不可能で、すべてのドキュメントを1つ1つおきに比較することがn乗問題である場合、多くのドキュメントを互いに比較するためのアルゴリズムです。 MinHashは、いくつかの帯状板だけにハッシュを保存することによってこれらの問題を克服し、その結果、ある程度の精度を犠牲にしています。 MinHashは必要ありません。あなたの帯状疱疹に4文字グラムを使用して、すべてのシングルを単にメモリに保存するだけです。しかし、単語の順序を入れ替えることを期待しない場合は、Smith-Waterman algorithmがさらに適しています(hereも参照)。

長い文字列を入力することを期待している場合は、あなたの帯状疱疹の言葉に基づいてより良い結果を得ることができます。たとえば3ワードグラムでは、ホワイトスペース、ケース、句読点の違いを無視します。

4文字グラムを生成することは簡単です。「猫はマットに座っている」とは、「The」、「he c」、「e ca」、「cat」などです。ユーザーが検索文字列を入力すると、それは同じ方法で取り消され、最も多くの共有された対象物を含む段落を検索することができます。比較の効率を上げるために、帯状疱疹を文字列として格納するのではなく、FNV1aまたは同様の安価なハッシュを使用してハッシュとして格納できます。

帯状疱疹は、文字ではなく単語から構築することもできます(例:「cat sat」、「cat sat」、「sat on the」)。これは、テキストのサイズが大きくなるほど、たとえば30語以上の場合によくなる傾向があります。私は、このアプローチを取った場合、通常、空白、大文字と小文字の違いを無視します。

パラグラフにまたがるマッチを探したい場合は、すべてのシングルの文字の位置を保存し、可能なマッチのさまざまな構成を考慮する必要があるため、かなり複雑になります。広くそれらの帯状疱疹が散在しています。それは非常に複雑なコードになる可能性があります。スミス - ウォーターマンなどのLevensteinベースのソリューションを使用すると、単語の順序の逆転にはうまく対応できません。

私はあなたがそれをどのように使用しているのか分かりませんが、私はブルームフィルターがあなたを助けてくれるとは思わないと思います。ブルームフィルタは、ドキュメントが高度に構造化されている場合に便利です:可能な文字列の限られたセットで、それらの1つの存在を検索しています。しかし、自然言語のために、私はそれが非常に有用であるとは思わない。