Как сделать нечеткий поиск в больших данных

Я новичок в этой области, и мне интересно, что такое современное состояние и где я могу прочитать об этом.

Предположим, что у меня есть только хранилище ключей/значений, и я каким-то образом определил (key1, key2) (не уверен, что он должен быть метрикой, т.е. если всегда должно выполняться неравенство треугольника).

То, что я хочу, это в основном функция поиска (ключа), которая возвращает мне все элементы с ключами до определенного расстояния до ключа поиска. Возможно, это ограничение расстояния настраивается. Может быть, это тоже ленивый итератор. Возможно, также может быть предел количества, а элемент (ключ, значение) с некоторой вероятностью P в возвращаемом наборе, где P = 1/расстояние (ключ, ключ поиска) или так (то есть идеальное совпадение, безусловно, будет в наборе и близких совпадениях, по крайней мере, с высокой вероятностью).


Одним примером приложения является сопоставление отпечатков пальцев в MusicBrainz. Они используют отпечаток AcoustId и определили эту функцию сравнения. Они используют индекс GG PostgreSQL, и я предполагаю (хотя я еще не полностью понял/прочитал код acoustid-server) GIN Partial Match Algorithm, но Я не совсем понимаю, о чем я просил и как он работает.


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

Но в любом случае, я также ищу более общее решение, если оно существует.

Ответ 1

Нет (быстрого) общего решения, для каждого приложения потребуется другой подход.

Ни один из двух примеров фактически не выполняет традиционный поиск ближайшего соседа. AcoustID (я автор) просто ищет точные соответствия, но он ищет в очень большом количестве хэшей в надежде, что некоторые из них будут соответствовать. В примере фонетического поиска используется метафон для преобразования слов в их фонетическое представление и также ищет только точные соответствия.

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

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

Btw, вы ищете специально для текстового поиска, самый простой способ сделать это: разделить свой вклад на N-граммы и индексировать их. В зависимости от того, как определена функция расстояния, это может привести к правильным совпадениям кандидатов без особых усилий.

Ответ 2

Я предлагаю вам взглянуть на FLANN Быстро приблизить ближайших соседей. Нечеткий поиск в больших данных также известен как приблизительные ближайшие соседи.

Эта библиотека предлагает вам другую метрику, например, Евклид, Хэмминг и различные методы кластеризации: LSH или k-средства, например.

Поиск всегда выполняется в 2 этапа. Сначала вы загружаете систему данными для обучения алгоритму, это потенциально занимает много времени в зависимости от ваших данных. Я успешно сгруппировал 13 миллионов данных менее чем за минуту (используя LSH).

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

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

Shazam использует специальную технику с геометрическими проекциями, чтобы быстро найти вашу песню. В компьютерном зрении мы часто используем BOW: Bag of words, который первоначально появился в текстовом поиске.

Если вы можете видеть ваши данные в виде графика, существуют другие методы приближенного сопоставления, например, с использованием теории спектрального графа.

Сообщите нам.

Ответ 3

В зависимости от того, каков ваш ключ/значения, может помочь алгоритм Левенштейна (также называемый Edit-Distance). Он вычисляет наименьшее количество операций редактирования, необходимых для изменения одной строки для получения другой строки.