Как сделать нечеткое совпадение названий компаний в MYSQL с PHP для автозаполнения?
мои пользователи будут импортировать через вырезать и вставить большую строку, которая будет содержать названия компании.
У меня есть существующая и растущая база данных MYSQL имен компаний, каждая с уникальным company_id.
Я хочу иметь возможность анализировать строку и назначать каждому из имен компании, введенных пользователем, нечеткое совпадение.
прямо сейчас, просто делая прямой матч строки, также медленно. ** Будет ли индексирование Soundex быстрее? Как я могу дать пользователю некоторые варианты, как они печатают? **
например, кто-то пишет:
Microsoft -> Microsoft Bare Essentials -> Bare Escentuals Polycom, Inc. -> Polycom
Я нашел следующие темы, которые кажутся похожими на этот вопрос, но плакат не одобрил, и я не уверен, применим ли их вариант использования:
как найти лучшее нечеткое совпадение для строки в большой Строковой базе данных
7 ответов
вы можете начать с помощью SOUNDEX()
, это, вероятно, будет делать то, что вам нужно (я представляю окно автоматического предложения уже существующих альтернатив для того, что пользователь набирает).
недостатки SOUNDEX()
являются:
- ее неспособность различать более длинные строки. Учитываются только первые несколько символов, более длинные строки, расходящиеся в конце, генерируют одно и то же значение SOUNDEX
- тот факт, что первая буква должна будь таким же, или тебе будет нелегко найти совпадение. SQL Server имеет функцию DIFFERENCE (), чтобы сказать вам, сколько два значения SOUNDEX разделены, но я думаю, что MySQL не имеет ничего подобного встроенного.
- для MySQL, по крайней мере, согласно документы, SOUNDEX сломан для ввода unicode
пример:
SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')
/* all of these return 'M262' */
для более продвинутых потребностей, я думаю, вам нужно взглянуть на Levenshtein расстояние (также называется "редактировать расстояние") из двух строки и работа с порогом. Это более сложное (=медленное) решение, но оно обеспечивает большую гибкость.
Основным недостатком является то, что вам нужны обе строки для расчета расстояния между ними. С SOUNDEX вы можете сохранить предварительно рассчитанный SOUNDEX в своей таблице и сравнить/сортировать/группу/фильтр на этом. С расстоянием Левенштейна вы можете обнаружить, что разница между "Microsoft" и "Nzcrosoft" составляет всего 2, но для достижения этого результата потребуется гораздо больше времени.
в любом случае, пример функции расстояния Левенштейна для MySQL можно найти в codejanitor.com: расстояние Левенштейна как хранимая функция MySQL (февраль. 10-й 2007,).
SOUNDEX является ОК алгоритм для этого, но были последние достижения в этой теме. Другой алгоритм был создан под названием Metaphone, и позже он был пересмотрен до двойного алгоритма Метафоны. Я лично использовал Java Apache commons реализацию двойной метафоны, и это настраиваемый и точный.
у них есть реализации на многих других языках на странице Википедии для него тоже. Этот вопрос уже отвечал, но вы должны найти выявленные проблемы с SOUNDEX, появляющиеся в вашем приложении, приятно знать, что есть варианты. Иногда он может генерировать один и тот же код для двух очень разных слова. Двойная метафона была создана, чтобы помочь решить эту проблему.
украдено из Википедии:http://en.wikipedia.org/wiki/Soundex
как ответ на недостатки в Алгоритм Soundex, Лоуренс Филипс разработан алгоритм Metaphone для та же цель. Компания Philips позже разработано улучшение для Metaphone, которое он называл двойным метафона. Двойная метафона включает в себя многое больший набор правил кодирования, чем его предшественник, обрабатывает подмножество нелатинские символы и возвращает a первичное и вторичное кодирование для учет различных произношений одного слова на английском.
в нижней части страницы double metaphone у них есть реализации для всех видов языков программирования: http://en.wikipedia.org/wiki/Double-Metaphone
реализация Python & MySQL:https://github.com/AtomBoy/double-metaphone
во-первых, я хотел бы добавить, что вы должны быть очень осторожны при использовании любой формы алгоритма фонетического/нечеткого соответствия, поскольку такая логика именно такая, нечеткая или, проще говоря, потенциально неточная. Особенно верно, когда используется для сопоставления названий компаний.
хороший подход-искать подтверждение от других данных, таких как адрес, почтовый индекс, номер тел, координаты и т. д. Это поможет подтвердить вероятность того, что ваши данные точно подобраны.
есть целый ряд вопросов, связанных с B2B данных соответствия слишком много, чтобы быть рассмотрены здесь, я написал больше о Название Компании Matching в моем блоге, но в целом ключевые вопросы:
- смотреть на всю строку бесполезно как самая важная часть название компании не обязательно в начале компании Имя. например, "Проктор энд Гэмбл Компани" или " Федерал Юнайтед Стейтс Резерв ‘
- сокращения являются общим местом в названиях компаний, т. е. HP, GM, GE, P&G, D&B etc..
- некоторые компании намеренно пишут свои имена неправильно как часть их брендинг и отличать себя от других компаний.
сопоставление точных данных легко, но сопоставление неточных данных может быть гораздо более трудоемким, и я бы предложил вам рассмотреть вопрос о том, как вы будете проверять неточные совпадения, чтобы убедиться, что они приемлемы качество.
прежде чем мы построили Match2Lists.com раньше мы тратили нездоровое количество времени на проверку нечетких совпадений. В Match2Lists мы включили мощный инструмент визуализации, позволяющий нам просматривать неточные матчи, это оказалось настоящим игровым чейнджером с точки зрения проверки соответствия, снижения наших затрат и позволяет нам доставлять результаты гораздо быстрее.
удачи!!
вот ссылка на обсуждение php функций soundex в mysql и php. Я бы начал оттуда, а затем расширил бы ваши другие не очень четко определенные требования.
ваша ссылка ссылается на методологию Левенштейна для сопоставления. Две проблемы. 1. Это более подходит для измерения разницы между двумя известными словами, а не для поиска. 2. В нем обсуждается решение, предназначенное для обнаружения таких вещей, как ошибки проверки (используя "Levenshtien" для "Levenshtein"), а не орфографические ошибки (где пользователь не знает, как пишется, скажите" Levenshtein "и введите"Levinstein". Обычно я связываю это с поиском фразы в книге, а не ключевого значения в базе данных.
EDIT: в ответ на комментарий--
- можете ли вы, по крайней мере, заставить пользователей поместить имена компаний в несколько текстовых полей; 2. или используйте однозначный разделитель имен( скажем, обратную косую черту); 3. исключить статьи ("The") и общие сокращения (или вы можете фильтровать для них); 4. Squoosh пробелы и совпадают для этого также (так Micro Soft => microsoft, Bare Essentials => bareessentials); 5. Отфильтровать препинания; 6. Делайте " или " поиск по словам ("голым "или" существенным") - люди неизбежно оставят иногда то или другое.
тест как сумасшедший и использовать цикл обратной связи от пользователей.
лучшей функцией для нечеткого сопоставления является levenshtein. он традиционно используется шашками заклинаний, так что это может быть путь. для этого есть UDF, доступный здесь:http://joshdrew.com/
недостатком использования levenshtein является то, что он не будет масштабироваться Очень хорошо. лучше всего сбросить всю таблицу в пользовательский файл словаря проверки орфографии и сделать предложение с уровня приложения вместо уровня базы данных.
этот ответ приводит к индексированному поиску почти любого объекта с использованием ввода 2 или 3 символов или более.
в основном, создайте новую таблицу с 2 столбцами, словом и ключом. Запустите процесс в исходной таблице, содержащей столбец для нечеткого поиска. Этот процесс извлекает каждое отдельное слово из исходного столбца и записывает эти слова в таблицу слов вместе с исходным ключом. Во время этого процесса обычно встречающиеся слова, такие как"the", " and " и т. д., должны быть отброшенный.
затем мы создаем несколько индексов в таблице word следующим образом...
- нормальный, строчный индекс на word + key
- индекс со 2-го по 5-й символ + клавиша
-
индекс с 3-го по 6-й символ + Ключ
в качестве альтернативы создайте индекс SOUNDEX () в столбце word.
Как только это будет на месте, мы берем любой пользовательский ввод и поиск, используя обычное слово = input или как вход.% Мы никогда не делаем как %ввода, так как мы всегда ищем совпадение на любом из первых 3 символов, которые все индексируются.
если исходная таблица массивна, вы можете разбить таблицу слов на куски алфавита, чтобы убедиться, что ввод пользователя немедленно сужается до строк-кандидатов.
может быть слишком поздно, но это может помочь другим. Проверьте эту ссылку.Он использует метрики расстояния Левенштейна, но намного быстрее. http://narenonit.blogspot.com/2012/07/fuzzy-matching-autocomplete-library.html