Java-LSHを使用したJavaにおける局所性に敏感なハッシュ

1概要

Locality-Sensitive Hashing(LSH) アルゴリズムは入力項目をハッシュするので、類似項目は同じバケットにマッピングされる可能性が高くなります。

このクイック記事では、このアルゴリズムの簡単な使用例を示すために java-lsh ライブラリを使用します。

2 Mavenの依存関係

始めるには、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22info.debatty%22%20AND%20a%3A%22java-にMavenの依存関係を追加する必要があります。 lsh%22[ java-lsh ]ライブラリ:

<dependency>
    <groupId>info.debatty</groupId>
    <artifactId>java-lsh</artifactId>
    <version>0.10</version>
</dependency>

3局所性に敏感なハッシュのユースケース

LSHには多くの可能な用途がありますが、1つの特定の例を検討します。

文書のデータベースがあり、類似の文書を識別できる検索エンジンを実装したいと仮定します。

このソリューションの一部としてLSHを使用できます。

  • すべての文書は数またはブール値のベクトルに変換できます -

たとえば、 word2vect アルゴリズム 単語や文書を数のベクトルに変換する ** 各文書を表すベクトルができたら、LSHを使うことができます。

各ベクトルのハッシュを計算するアルゴリズム LSHの特徴、類似のベクトルとして提示されている文書 類似または同じハッシュを持つ ** 結果として、特定のドキュメントのベクトルを考えると、 N が見つかります。

類似のハッシュを持ち、対応する文書をエンドユーザーに返すベクトルの数

4例

入力ベクトルのハッシュを計算するために java-lsh ライブラリを使用します。これはこの記事の範囲を超える大きなトピックであるため、変換自体については説明しません。

ただし、LSHアルゴリズムの入力として使用できる形式で表示された3つのドキュメントのセットから変換された3つの入力ベクトルがあるとします。

boolean[]vector1 = new boolean[]{true, true, true, true, true};
boolean[]vector2 = new boolean[]{false, false, false, true, false};
boolean[]vector3 = new boolean[]{false, false, true, true, false};

プロダクションアプリケーションでは、入力ベクトルの数はLSH ** アルゴリズムを活用するためにもっと大きくなければなりませんが、このデモのために、3つのベクトルだけに固執します。

最初のベクトルが2番目と3番目のベクトルと大きく異なるのに対して、2番目と3番目のベクトルは互いに非常に似ていることに注意することが重要です。

LSHMinHash クラスのインスタンスを作成しましょう。入力ベクトルのサイズをそれに渡す必要があります - すべての入力ベクトルは同じサイズを持つべきです。また、ハッシュバケットの数と、LSHが実行する計算段階(反復)の数を指定する必要があります。

int sizeOfVectors = 5;
int numberOfBuckets = 10;
int stages = 4;

LSHMinHash lsh = new LSHMinHash(stages, numberOfBuckets, sizeOfVectors);

アルゴリズムによってハッシュされるすべてのベクトルが10個のバケット間でハッシュされるように指定します。また、ハッシュを計算するためにLSHを4回繰り返す必要があります。

各ベクトルのハッシュを計算するために、ベクトルを hash() メソッドに渡します。

int[]firstHash = lsh.hash(vector1);
int[]secondHash = lsh.hash(vector2);
int[]thirdHash = lsh.hash(vector3);

System.out.println(Arrays.toString(firstHash));
System.out.println(Arrays.toString(secondHash));
System.out.println(Arrays.toString(thirdHash));

そのコードを実行すると、次のような出力になります。

----[0, 0, 1, 0][9, 3, 9, 8][1, 7, 8, 8]----

各出力配列を見ると、対応する入力ベクトルについて4回の反復のそれぞれで計算されたハッシュ値がわかります。 1行目は1番目のベクトル、2行目は2番目の行、3行目は3番目のベクトルのハッシュ結果を示します。

4回の反復後、LSHは予想どおりの結果をもたらしました。LSHは、2番目と3番目のベクトルで同じハッシュ値(8)を計算し、2番目と3番目のベクトルで異なるハッシュ値(0)を計算しました2番目と3番目のベクトルとは異なります。

LSHは確率に基づいたアルゴリズムであるため、2つの類似したベクトルが同じハッシュバケットに入ることを確認することはできません。

それにもかかわらず、十分な数の入力ベクトルがある場合、 このアルゴリズムは、同じベクトルを 同じバケットに割り当てる可能性が高い結果になります。

大量のデータセットを扱う場合、LSHは便利なアルゴリズムになります。

5結論

このクイック記事では、Locality-Sensitive Hashingアルゴリズムのアプリケーションを調べ、 java-lsh ライブラリを使用してその使用方法を示しました。

これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/libraries[GitHubプロジェクト]にあります - これはMavenプロジェクトです。そのまま実行します。