Подтвердить что ты не робот

PHP - Как предложить термины для поиска, "вы имели в виду...?"

При поиске в db с условиями, которые не получают результатов, я хочу разрешить предложение "вы имели в виду..." (например, Google). Например, если кто-то ищет "jquyer", ", он выводит" did you mean jquery? "

Конечно, результаты предложения должны быть сопоставлены с значениями внутри db (я использую mysql).

Знаете ли вы библиотеку, которая может это сделать? Я искал это, но не нашел отличных результатов. Или, может быть, у вас есть идея, как построить это самостоятельно?

4b9b3361

Ответ 1

Быстрое и простое решение включает SOUNDEX или SOUNDEX-подобные функции.

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

Интерес этого типа функции заключается в том, что он позволяет вычислять заблаговременно одно значение, которое может быть связано со словом. Это не похоже на функции длины строки, такие как редактировать расстояние (например, Levenshtein, Хэмминг или даже Ratcliff/Obershelp), которые обеспечивают значение по отношению к паре строк.

Предварительно вычисляя и индексируя значение SOUNDEX для всех слов в словаре, во время выполнения можно быстро найти словарь/базу данных на основе расчетного значения SOUNDEX [времени выполнения] пользовательского поиска сроки. Этот поиск Soundex может выполняться систематически, как дополнение к поиску простого ключевого слова, или выполняется только тогда, когда поиск по ключевым словам не дает удовлетворительного количества записей, следовательно, дает подсказку, что, возможно, пользовательское ключевое слово ) с ошибкой.


Совершенно другой подход, применимый только к пользовательским запросам, включающим несколько слов, основан на запуске нескольких запросов к словарю/базе данных, исключая одно (или несколько) ключевых слов, предоставленных пользователем. Эти списки альтернативных запросов содержат список отдельных слов; Этот [сокращенный] список слов, как правило, достаточно мал, чтобы функции расстояния на основе пар могли применяться для выбора в списке слов, которые ближе к слову (-ам) с ошибками. Частота слов (в списках результатов) может использоваться как для ограничения количества слов (только для оценки подобия для слов, которые встречаются более чем х раз), так и для обеспечения веса, чтобы немного исказить измерения подобия (т.е. пользуясь словами, найденными "в количестве" в базе данных, даже если их измерение подобия немного меньше).

Ответ 3

На самом деле, я считаю, что функция Google "вы имели в виду" генерируется тем, что пользователи вводят после того, как они сделали опечатку. Тем не менее, это явно намного легче для них, поскольку у них невероятные объемы данных.

Вы можете использовать расстояние Левенштейна, как предлагалось (или Soundex), но хранить результаты в базе данных. Или, запустите отдельные скрипты, основанные на распространенных ошибках и наиболее популярных поисковых запросах с ошибками.

Ответ 4

http://www.phpclasses.org/browse/package/4859.html

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

  • Специфичность домена помогает избежать ошибочных вероятностей от обгона вашей реализации
    • Ex: "Memoize" может быть исправлена ​​по заклинаниям "Запомниться" для большинства готовых словарей, но это совершенно отличный термин для поиска по компьютерной науке.
  • Собственные имена, доступные в вашем индексе поиска, теперь учитываются.
    • Ex: Если вы Dell, и кто-то ищет "inspiran", нет абсолютно никаких шансов, что функция, зависящая от заклинания, будет знать, что вы имеете в виду "inspiron". Вероятно, это будет правильно написано "вдохновляющим" или чем-то более распространенным, и, опять же, менее специфичным для домена.

Ответ 5

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

Ответ 6

Написание собственного пользовательского решения займет довольно много времени и не будет гарантировано работать, если ваш набор данных недостаточно велик, поэтому я бы рекомендовал использовать API от поискового гиганта, такого как Yahoo. результаты Yahoo не так хороши, как Google, но Я не уверен, что Google должен быть публичным.

Ответ 8

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

Если кто-то искал jQuery, я бы построил select-statement, который отправился

SELECT Word, 1 AS Relevance 
FROM keywords 
WHERE Word IN ('qjuery','juqery','jqeury' etc)  

UNION 

SELECT Word, 2 AS Relevance 
FROM keywords 
WHERE Word LIKE 'j_query' OR Word LIKE 'jq_uery' etc etc 
ORDER BY Relevance, Word  

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