От" 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)
Быстрое и простое решение включает SOUNDEX или функции, подобные SOUNDEX.
Короче говоря, функция SOUNDEX изначально использовалась для устранения распространенных опечаток и альтернативных написаний для фамилии, и эта функция очень хорошо инкапсулирует многие распространенные орфографические ошибки (в английском языке). Из-за того, что исходная функция soundex сосредоточена на именах семейств, она может быть ограничивающей (например, кодирование прекращается после третьей или четвертой неповторяющейся согласной буквы), но алгоритм легко расширить.
Интерес этого типа Функция состоит в том, что она позволяет заранее вычислить единственное значение , которое может быть связано со словом. В этом отличие от функций строкового расстояния, таких как редактировать расстояние , например, Левенштейна , Hamming или даже Ratcliff / Obershelp ), которые предоставляют значение относительно пары строк .
By pre -вычисление и индексации значения SOUNDEX для всех слов в словаре, можно во время выполнения быстро выполнять поиск в словаре / базе данных на основе вычисленного [время выполнения] значения SOUNDEX для пользовательские условия поиска. Этот поиск Soundex может выполняться систематически, как дополнение к обычному поиску по ключевым словам, или выполняться только тогда, когда поиск по ключевым словам не дает удовлетворительного количества записей, тем самым обеспечивая подсказку, что, возможно, введенное пользователем ключевое слово (а) ) с ошибкой.
Совершенно другой подход, применимый только к пользовательским запросам, которые включают несколько слов , основан на выполнении нескольких запросов к словарю / базе данных, за исключением одного (или нескольких) ключевых слов, заданных пользователем. Списки результатов этих альтернативных запросов содержат список отдельных слов; Этот [сокращенный] список слов обычно достаточно мал, чтобы можно было применять парные функции расстояния для выбора в списке слов, которые ближе всего к слову (ям), написанному с ошибкой. Частота слов (в списках результатов) может использоваться как для ограничения количества слов (оценивать сходство только для слов, которые встречаются более x раз), так и для обеспечения веса, чтобы немного исказить измерения подобия (т. Е. отдавая предпочтение словам, найденным "в количестве" в базе данных, даже если измерение их сходства немного меньше).
Списки результатов этих альтернативных запросов содержат список отдельных слов; Этот [сокращенный] список слов обычно достаточно мал, чтобы можно было применять парные функции расстояния для выбора в списке слов, которые ближе всего к предположительно ошибочному слову (ям). Частота слов (в списках результатов) может использоваться как для ограничения количества слов (оценивать сходство только для слов, которые встречаются более x раз), так и для обеспечения веса, чтобы немного исказить измерения подобия (т. Е. отдавая предпочтение словам, найденным "в количестве" в базе данных, даже если измерение их сходства немного меньше). Списки результатов этих альтернативных запросов содержат список отдельных слов; Этот [сокращенный] список слов обычно достаточно мал, чтобы можно было применять парные функции расстояния для выбора в списке слов, которые ближе всего к предположительно ошибочному слову (ям). Частота слов (в списках результатов) может использоваться как для ограничения количества слов (оценивать сходство только для слов, которые встречаются более x раз), так и для обеспечения веса, чтобы немного исказить измерения подобия (т. Е. отдавая предпочтение словам, найденным "в количестве" в базе данных, даже если измерение их сходства немного меньше). слова, которые ближе к словам, предположительно написанным с ошибкой. Частота слов (в списках результатов) может использоваться как для ограничения количества слов (оценивать сходство только для слов, которые встречаются более x раз), так и для обеспечения веса, чтобы немного исказить измерения подобия (т. Е. отдавая предпочтение словам, найденным "в количестве" в базе данных, даже если измерение их сходства немного меньше). слова, которые ближе к словам, предположительно написанным с ошибкой. Частота слов (в списках результатов) может использоваться как для ограничения количества слов (оценивать сходство только для слов, которые встречаются более x раз), так и для обеспечения веса, чтобы немного исказить измерения сходства (т. Е. отдавая предпочтение словам, найденным "в количестве" в базе данных, даже если измерение их сходства немного меньше).На самом деле, я считаю, что функция Google "вы имели в виду" генерируется тем, что пользователи вводят в после того, как допустили опечатку. Тем не менее, это, очевидно, намного проще для них, поскольку у них невероятные объемы данных.
Вы можете использовать расстояние Левенштейна, как предлагали mgroves (или Soundex), но сохранять результаты в базе данных. Или запустите отдельные сценарии на основе распространенных ошибок написания и наиболее популярных поисковых запросов с ошибками.
Вам следует отслеживать распространенные орфографические ошибки, которые встречаются при поиске (или генерировать их самостоятельно с помощью генератора опечаток ), и сохранять орфографические ошибки и совпадающие слова в базе данных. . Затем, когда у вас нет ничего подходящего ни для одного результата поиска, вы можете свериться с таблицей орфографических ошибок и использовать предложенное слово.
Написание собственного решения займет довольно много времени и не гарантированно будет работать, если ваш набор данных недостаточно велик, поэтому я бы рекомендовал использовать API от поискового гиганта. например Yahoo . Результаты Yahoo не так хороши, как Google , но я не уверен, должны ли результаты Google быть общедоступными.
http://www.phpclasses.org/browse/package/4859.html
Вот уже готовый класс, который довольно легко реализовать и который требует минимального расстояния редактирования. Все, что вам нужно сделать, это иметь список всех слов, с которыми вы хотите работать, в виде токена (а не типа). Я предлагаю убедиться, что это полный список слов в вашем поисковом индексе и только в вашем поисковом индексе. Это помогает двумя способами:
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.