Hachage sensible à la localisation en Java avec Java-LSH

1. Vue d’ensemble

L’algorithme Locality-Sensitive Hashing (LSH) hache les éléments d’entrée afin que les éléments similaires aient une grande probabilité d’être mappés vers les mêmes compartiments.

Dans cet article rapide, nous allons utiliser la bibliothèque java-lsh pour illustrer un cas d’utilisation simple de cet algorithme.

2. Dépendance Maven

Pour commencer, nous devons ajouter une dépendance Maven à la https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22info.debatty%22%20AND%20a%3A%22java- lsh% 22[ java-lsh ]bibliothèque:

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

3. Cas d’utilisation du hachage sensible à la localisation

LSH a de nombreuses applications possibles, mais nous allons considérer un exemple particulier.

Supposons que nous ayons une base de données de documents et que nous voulions mettre en place un moteur de recherche capable d’identifier des documents similaires.

Nous pouvons utiliser LSH dans le cadre de cette solution:

  • Chaque document peut être transformé en un vecteur de nombres ou de booléens -

par exemple, nous pourrions utiliser le word2vect algorithme pour transformer des mots et des documents en vecteurs de nombres ** Une fois que nous avons un vecteur représentant chaque document, nous pouvons utiliser le LSH

algorithme pour calculer un hachage pour chaque vecteur, et en raison de la caractéristiques de LSH, documents présentés sous forme de vecteurs similaires aura un hash similaire ou même ** En conséquence, étant donné le vecteur d’un document particulier, on peut trouver N

nombre de vecteurs ayant un hachage similaire et renvoyant les documents correspondants à l’utilisateur final

4. Exemple

Nous utiliserons la bibliothèque java-lsh pour calculer les hachages de nos vecteurs d’entrée. Nous ne couvrirons pas la transformation elle-même, car il s’agit d’un sujet très vaste qui dépasse le cadre de cet article.

Cependant, supposons que nous ayons trois vecteurs d’entrée transformés à partir d’un ensemble de trois documents, présentés sous une forme utilisable comme entrée pour l’algorithme LSH:

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};

Notez que dans une application de production, le nombre de vecteurs d’entrée devrait être beaucoup plus élevé pour tirer parti de l’algorithme LSH , mais dans l’intérêt de cette démonstration, nous nous en tiendrons à trois vecteurs uniquement.

Il est important de noter que le premier vecteur est très différent des deuxième et troisième, alors que les deuxième et troisième vecteurs sont assez similaires.

Créons une instance de la classe LSHMinHash . Nous devons lui transmettre la taille des vecteurs d’entrée - tous les vecteurs d’entrée doivent avoir la même taille. Nous devons également spécifier le nombre de compartiments de hachage que nous voulons et le nombre d’étapes de calcul (itérations) que LSH doit effectuer:

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

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

Nous spécifions que tous les vecteurs qui seront hachés par les algorithmes doivent être hachés parmi dix compartiments. Nous voulons également avoir quatre itérations de LSH pour le calcul des hachages.

Pour calculer le hachage de chaque vecteur, nous passons le vecteur à la méthode 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));

L’exécution de ce code produira un résultat similaire à:

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

En regardant chaque tableau de sortie, nous pouvons voir les valeurs de hachage calculées à chacune des quatre itérations pour le vecteur d’entrée correspondant. La première ligne montre les résultats de hachage pour le premier vecteur, la deuxième ligne pour le deuxième vecteur et la troisième ligne pour le troisième vecteur.

Après quatre itérations, LSH a donné les résultats escomptés - LSH a calculé la même valeur de hachage (8) pour les deuxième et troisième vecteurs, qui étaient similaires, et une valeur de hachage différente (0) pour le premier vecteur, qui était différent des deuxième et troisième vecteurs.

LSH est un algorithme basé sur la probabilité, nous ne pouvons donc pas être sûrs que deux vecteurs similaires vont atterrir dans le même compartiment de hachage.

Néanmoins, lorsque nous avons un nombre suffisant de vecteurs en entrée, l’algorithme donne des résultats qui auront une forte probabilité d’affecter des vecteurs similaires aux mêmes compartiments .

LSH peut être un algorithme pratique pour traiter des ensembles de données volumineux.

5. Conclusion

Dans cet article rapide, nous avons examiné une application de l’algorithme de hachage sensible à la localisation et montré comment l’utiliser à l’aide de la bibliothèque java-lsh .

Vous trouverez la mise en œuvre de tous ces exemples et extraits de code dans le projet GitHub - il s’agit d’un projet Maven, il devrait donc être facile à importer et à courir comme il est.