PHP - Как предложить условия для поиска, “Вы имели в виду …?”

От" IPv6 regex":

(\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,6}\Z)|
(\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}\Z)|
(\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}\Z)|
(\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}\Z)|
(\A([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}\Z)|
(\A([0-9a-f]{1,4}:){1,6}(:[0-9a-f]{1,4}){1,1}\Z)|
(\A(([0-9a-f]{1,4}:){1,7}|:):\Z)|
(\A:(:[0-9a-f]{1,4}){1,7}\Z)|
(\A((([0-9a-f]{1,4}:){6})(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)|
(\A(([0-9a-f]{1,4}:){5}[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)|
(\A([0-9a-f]{1,4}:){5}:[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,3}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,2}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,1}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A(([0-9a-f]{1,4}:){1,5}|:):(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
(\A:(:[0-9a-f]{1,4}){1,5}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)

12
задан Gal 11 December 2009 в 14:58
поделиться

7 ответов

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

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

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

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


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

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

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

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

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

8
ответ дан 2 December 2019 в 06:26
поделиться

Как насчет функции levenshtein или Similar_text ?

7
ответ дан 2 December 2019 в 06:26
поделиться

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

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

3
ответ дан 2 December 2019 в 06:26
поделиться

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

1
ответ дан 2 December 2019 в 06:26
поделиться

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

1
ответ дан 2 December 2019 в 06:26
поделиться

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

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

  • Специфичность предметной области помогает избежать вводящей в заблуждение вероятности перехвата вашей реализации.
    • Пример: "Memoize" может быть исправлено на "Запоминание" для большинства стандартных словарей, но это идеальный поисковый запрос для страницы по информатике.
  • Существительные собственные, которые доступны в вашем поисковый индекс теперь учитывается.
    • Пример: если вы Dell и кто-то ищет «inspiran», нет абсолютно никаких шансов, что функция коррекции орфографии узнает, что вы имеете в виду «inspiron». Вероятно, он будет корректировать орфографию до «вдохновляющего» или чего-то более распространенного и, опять же, менее зависящего от предметной области.
3
ответ дан 2 December 2019 в 06:26
поделиться

When I did this a couple of years ago, I already had a custom built index of words that the search engine used. I studied what kinds of errors people made the most (based on logs) and sorted the suggestions based on how common the mistake was.

If someone searched for jQuery, I would build a select-statement that went

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  

The resulting words were my suggestions and it worked really well.

0
ответ дан 2 December 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: