AppEngine Приблизительный алгоритм сопоставления частичных строк - PullRequest
2 голосов
/ 13 октября 2011

Итак, я понимаю, что это охватывает широкий спектр тем, и их части были рассмотрены ранее в StackOverflow, например, этот вопрос . Точно так же, Частичное совпадение строк и Приблизительное совпадение строк , похоже, являются популярными алгоритмическими обсуждениями. Однако использование этих идей совместно для решения проблем, в которых необходимо обсудить обе эти проблемы, представляется крайне неэффективным. Я ищу способ эффективно объединить две проблемы в одно решение.

Сейчас я использую AppEngine с Java и Persistent DataStore. Это несколько раздражает, так как кажется, что в запросах нет никакого арифметического использования, чтобы упростить задачу, поэтому я в настоящее время рассматриваю возможность сделать некоторый предварительный расчет и сохранить его как дополнительное поле в базе данных. По сути, это идея, которая возникла у нас с другом о том, как, возможно, реализовать систему сопоставления, и я более или менее надеялся на предложения о том, как сделать ее более эффективной. Если это нужно отменить в пользу чего-то лучшего, что уже существует, я тоже могу с этим справиться.


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

Изолирующий слой ржет принципала под вашим лицемерным мусором.

Если пользователь выполняет поиск по

isalatig pri

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

A: 2        B: 3        C: 5
D: 7        E: 11       F: 13
...

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

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

distance("isalatig", "isolating") == 2
distance("pri", "principal") == 0 // since principal has a starting 
                                  // substring of pri it passes

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


Это основная идея алгоритма, хотя, поскольку я впервые имею дело с таким сценарием, я понимаю, что, возможно, упускаю что-то очень важное (или вся моя идея может быть ошибочной). Каков наилучший способ справиться с текущей ситуацией, которую я пытаюсь реализовать. Точно так же, если есть какие-либо утилиты, которые AppEngine в настоящее время предлагает для борьбы с тем, что я пытаюсь сделать, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 17 октября 2011

Прежде всего, уточнение: App Engine не допускает арифметику в запросах, потому что нет эффективного способа запроса результата произвольного арифметического выражения. Когда вы делаете это в базе данных SQL, планировщик вынужден выбирать неэффективный план запроса, который обычно включает в себя сканирование всех записей кандидатов по одной.

Ваша схема не будет работать по той же причине: нет способа индексировать целое число так, чтобы вы могли эффективно запрашивать все числа, которые делятся на ваше целевое число. Другие потенциальные проблемы включают слова, которые переводятся в числа, которые слишком велики для того, чтобы хранить их в целочисленных значениях фиксированной длины, и которые не могут различить «напрокат», «выученный» и «рога».

Если на данный момент мы отбрасываем ваше требование сопоставления произвольных префиксов строк, то вы ищете полнотекстовую индексацию, которая обычно реализуется с использованием инвертированного индекса и stemming . Поддержка полнотекстового поиска включена в план действий App Engine, но еще не выпущена; тем временем ваш лучший вариант выглядит как SearchableModel или с использованием внешней поисковой системы, такой как Google Site Search.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...