Частичное совпадение - PullRequest
       6

Частичное совпадение

2 голосов
/ 10 февраля 2012

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

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

Marry
John
Steve
Steven
Stewie

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

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

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

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

Не встроенные методы

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

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

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

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

Вероятно, в качестве основной подсказки:

  • Если у вас много уникальных терминов для сравнения, не используйте Similar_text или флешку Levensthein со звуковыми алгоритмами
  • Если у вас довольно маленький набор, используйте Levensthein.
1 голос
/ 10 февраля 2012

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

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

...