Рубрики
Без рубрики

Локализовано-чувствительное хэширование на Java с использованием Java-LSH

Быстрое и практическое руководство по применению алгоритма хэширования локальности в Java с использованием библиотеки Java-lsh.

Автор оригинала: baeldung.

1. Обзор

Местности чувствительных хэширования (LSH) алгоритм хэширует элементы ввода, так что аналогичные элементы имеют высокую вероятность быть отображены на те же ведра.

В этой быстрой статье мы будем использовать Java-lsh библиотека, чтобы продемонстрировать простой случай использования этого алгоритма.

2. Зависимость от Maven

Чтобы начать работу, нам нужно добавить зависимость Maven к Java-lsh библиотека:


    info.debatty
    java-lsh
    0.10

3. Случай использования хэширования по локастику

LSH имеет много возможных приложений, но мы рассмотрим один конкретный пример.

Предположим, у нас есть база данных документов и мы хотим внедрить поисковую систему, которая сможет идентифицировать аналогичные документы.

Мы можем использовать LSH как часть этого решения:

  • Каждый документ может быть преобразован в вектор чисел или booleans – например, мы могли бы использовать word2vect алгоритм преобразования слов и документов в векторы чисел
  • После того, как у нас есть вектор, представляющий каждый документ, мы можем использовать алгоритм LSH для расчета хэша для каждого вектора, и из-за характеристик LSH, документы, которые представлены как аналогичные векторы будут иметь аналогичный или тот же хэш
  • В результате, учитывая вектор конкретного документа, мы можем найти N количество векторов, которые имеют аналогичный хэш и возвращают соответствующие документы конечному пользователю

4. Пример

Мы будем использовать Java-lsh библиотека для расчета хэшей для наших векторов ввода. Мы не будем освещать сама трансформацию, так как это огромная тема, выходят за рамки данной статьи.

Однако предположим, что у нас есть три вектора ввода, которые преобразуются из набора из трех документов, представленных в форме, которая может быть использована в качестве ввода для алгоритма 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};

Обратите внимание, что в производственном приложении количество векторов ввода должно быть намного выше, чтобы использовать LSH алгоритм, но ради этой демонстрации, мы будем придерживаться только трех векторов.

Важно отметить, что первый вектор значительно отличается от второго и третьего, в то время как второй и третий векторы очень похожи друг на друга.

Давайте создадим экземпляр LSHMinHash класс. Мы должны передать ему размер векторов ввода – все векторы ввода должны иметь равный размер. Нам также необходимо указать, сколько хэш-ведер мы хотим и сколько этапов вычислений (итераций) LSH должны выполнять:

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

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

Уточняется, что все векторы, которые будут хэшированы алгоритмами, должны быть хэшированы среди десяти ведер. Мы также хотим иметь четыре итерации LSH для расчета хэшей.

Чтобы рассчитать хэш для каждого вектора, мы перешагом вектор в хэш () метод:

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]

Глядя на каждый выходной массив, мы можем увидеть значения хэша, рассчитанные на каждой из четырех итераций для соответствующего вектора ввода. Первая строка показывает результаты хэширования для первого вектора, второй строки для второго вектора и третьей строки для третьего вектора.

После четырех итераций LSH дал результаты, как мы ожидали – LSH вычислил одно и то же значение хэша (8) для второго и третьего векторов, которые были похожи друг на друга, и другое хэш-значение (0) для первого вектора, которое отличалось от второго и третьего векторов.

LSH это алгоритм, основанный на вероятности, поэтому мы не можем быть уверены, что два одинаковых вектора приземлятся в одном и том же хэш-ведре. Тем не менее, когда у нас достаточно большое количество векторов ввода, алгоритм дает результаты, которые будут иметь высокую вероятность для назначения аналогичных векторов в те же ведра .

Когда мы имеем дело с массивными наборами данных, LSH может быть удобным алгоритмом.

5. Заключение

В этой быстрой статье мы рассмотрели применение алгоритма хэширования Локальных и показали, как использовать его с помощью Java-lsh библиотека.

Реализация всех этих примеров и фрагментов кода можно найти в Проект GitHub – это проект Maven, поэтому его нужно легко импортировать и запускать в том же объеме.