2012-02-10 3 views
2

Есть ли встроенная функция или функция, которую кто-то уже написал, которая может соответствовать именам, не будучи точным?Частичное соответствие

К примеру, у меня есть:

Marry 
John 
Steve 
Steven 
Stewie 

Если кто-то типа "тушат" функция будет возвращать Стьюи.
Или, если кто-то наберет «ry», функция вернет Marry.
Или, если кто-то ошибочно называет «Женится», функция все равно вернет Marry. (из-за того, что они самые похожие из них)
Если поставляется «Ste», он может вернуть значение false, но для меня это не имеет большого значения.

Кто-нибудь знает, как написать такую ​​функцию или узнать о том, что уже написано? Видя, что это, вероятно, обычная вещь, я бы так и предполагал.

Спасибо.

+0

Вы имеете в виду «пока пользователь вводит, он показывает соответствующие имена», например автозаполнение? –

+0

нет, я не это имею в виду. Просто функция php, которая вернет строку. Я предполагаю, что это может быть использовано как автозаполнение, но я не думаю, что это была бы php forte. – dukevin

+0

Не могли бы вы использовать модуль PSpell, а список слов, который вы ему поставляете, - это имена? –

ответ

2

На самом деле есть несколько способов для достижения этой цели:

Встроенные методы

Не построен в методах

  • LCS Наибольшая общая подпоследовательность
  • Письмо N-грамм (иногда используется для проверки орфографии)
  • Levensthein automaton
  • Списки слов (только для полноты)

Один из них должен помочь вам решить вашу проблему.

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

Как правило, существуют про-минусы между алгоритмами расстояния и звука. Звуковые специфические алгоритмы менее точны (около 33% точности). Но быстро. Levensthein намного точнее, но медленнее. По крайней мере, реализация php. Существуют другие системы, в которых Levensthein быстрее с большим отрывом (см., Например, Levensthein Automata. Но этот алгоритм автоматов не встроен в php).

Вероятно, основной намек:

  • Если у вас есть много уникальных условий для сравнения не использовать similar_text или Levensthein придерживаться алгоритмов Sound
  • Если у вас есть довольно небольшой набор использовать Levensthein.
+0

hmm, есть ли способ написать функцию, чтобы использовать все это сразу? – dukevin

+0

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

+0

Спасибо за отличный пост fyr. Последний вопрос: как это будет обрабатывать специальные символы, такие как «@»? – dukevin

1

звучит как soundex() или metaphone() - это то, что вы ищете. используя их, вы можете вычислить «ключ», который представляет, как звучит слово, - делая это для всех строк, которые вы можете сравнить, если два слова звучат одинаково (оптимизированы для английского языка).

Другая возможность была бы levenshtein(), которая непосредственно вычисляет разницу между двумя строками, поэтому вы можете сравнить все строки и показать 5 лучших ударов или что-то в этом роде.

Смежные вопросы