Давайте сразу перейдем к вопросу: у вас есть бизнес-задача сопоставить похожие строковые значения. Алгоритм фонетического сопоставления может помочь вам в этом, однако с некоторыми ограничениями: они основаны на произношении и не нацелены на предоставление вам соответствующей оценки. Следовательно, что вам нужно сделать, так это применить алгоритм, а затем вычислить некоторую оценку соответствия для остатков (элементы без 100% совпадения). Это краткое изложение охватывает только обзор алгоритмов фонетического сопоставления. Стоит отметить, что фонетические алгоритмы наиболее актуальны для сопоставления имен и фамилий, потому что именно здесь возникает проблема с произношением, поэтому, если вам нужно сопоставить другие атрибуты, возможно, стоит попробовать другие методы.



Soundex

Этот алгоритм, созданный Робертом Расселом и Маргарет Кинг Оделл в 1918 году, предназначался для сопоставления имен и фамилий на основе основных правил английского произношения, поэтому похожие имена получают одинаковое значение. Это довольно просто, я представлю обобщенную схему исходного Soundex и его расширенной версии (это легко реализовать)



Фонетический код системы идентификации и разведки штата Нью-Йорк (NYSIIS)

Этот был разработан в 1970 году Центром идентификации и разведки штата Нью-Йорк (сюрприз, сюрприз). Идея та же, что и для Soundex: если есть омофоны, вы сопоставите их, назначив определенные индексы для определенных звуков. Что хорошего в его результатах: он более точен по сравнению с Soundex, так как возвращает меньше фамилий под тем же кодом.



Метафон

Метод Metaphone, разработанный Лоуренсом Филипсом в 1990 году, также более точен по сравнению с методом Soundex, поскольку он учитывает группы букв. Недостаток проявляется, когда вы применяете его для согласования строк, которые не на английском языке, поскольку он основан на правилах английского произношения. Логика следующая:

Вслед за Metaphone Philips разработала также Double Metaphone. Как следует из названия, он возвращает два кода, поэтому у вас больше шансов сопоставить элементы, однако в то же время это означает более высокую вероятность ошибки. Согласно алгоритму существует три уровня соответствия: первичный ключ к первичному ключу = самое сильное соответствие, вторичный ключ к первичному ключу = нормальное соответствие, вторичный ключ к вторичному ключу = самое слабое соответствие. Некоторое время спустя (9 лет, если быть точным) Philips представил свою жемчужину - Метафон 3 - расширенный алгоритм сопоставления, в основном предназначенный для сопоставления личной информации, такой как имена и фамилии, как и его предыдущие версии, однако со значительно более высокой степенью точности. Что замечательно, он адаптирован к различным языковым семьям (окончания жестко закодированы в коде), что позволяет ему соответствовать большинству европейских фамилий (включая, наверное, самые сложные - славянские). Вы можете ознакомиться с кодом, он очень подробный, красивый и не для бесплатного использования. Я бы даже очень рекомендовал проверить код всем, кто хоть немного интересуется сопоставлением строковых данных. Прочитав ее, вы сможете следовать логике автора, и это может привести вас к самым увлекательным открытиям, прямо к решению вашей бизнес-задачи!

Https://searchcode.com/codesearch/raw/2366000/



Каверфон

Если вы из Новой Зеландии или вам нужно соответствовать этим ребятам, вы можете следовать этому алгоритму.

Table 1:
From
+-------+-------+-------+--------+----+----+
| cough | rough | tough | enough | gn | mb |
To
+-------+-------+-------+--------+----+----+
| cou2f | rou2f | tou2f | enou2f | 2n | m2 |
+-------+-------+-------+--------+----+----+
Table 2:
From
+----+----+----+----+-----+---+---+---+---+
| cq | ci | ce | cy | tch | c | q | x | v |
To
+----+----+----+----+-----+---+---+---+---+
| 2q | si | se | sy | 2ch | k | k | k | f |
+----+----+----+----+-----+---+---+---+---+
From
+----+-----+-----+---+----+---+----+---+
| dg | tio | tia | d | ph | b | sh | z |
To
+----+-----+-----+---+----+---+----+---+
| 2g | sio | sia | t | fh | p | s2 | s |
+----+-----+-----+---+----+---+----+---+
Table 3:
From
+---+-----+----+---+------+----+
| j | ^y3 | ^y | y | 3gh3 | gh |
To
+---+-----+----+---+------+----+
| y | Y3  | A  | 3 | 3kh3 | 22 |
+---+-----+----+---+------+----+
From
+---+----+----+----+----+----+----+
| g | s+ | t+ | p+ | k+ | f+ | m+ |
To
+---+----+----+----+----+----+----+
| k | S  | T  | P  | K  | F  | M  |
+---+----+----+----+----+----+----+
From
+----+----+-----+----+---+----+
| n+ | w3 | wh3 | w$ | w | ^h |
To
+----+----+-----+----+---+----+
| N  | W3 | Wh3 |  3 | 2 | A  |
+----+----+-----+----+---+----+
From
+---+----+----+---+----+----+---+
| h | r3 | r$ | r | l3 | l$ | l |
To
+---+----+----+---+----+----+---+
| 2 | R3 |  3 | 2 | L3 |  3 | 2 |
+---+----+----+---+----+----+---+

* ^ обозначает начало строки, $ конец строки, s + соседние последующие символы

Система фонетического соответствия Бейдера-Морзе

Как заявили авторы, он предназначен для решения проблемы с большим количеством нерелевантных совпадений на основе языка, на котором написано имя, с применением правил произношения для конкретного языка. Здесь сложно объяснить даже часть правил, их 200. Однако основная идея заключается в том, что сначала вы определяете язык на основе правил. После этого слова переводятся в фонетические токены. После правил для конкретных языков должны применяться общие правила.

Смотрите полное описание здесь:





Вывод

Если вам нужно построить / использовать довольно простой алгоритм, выберите Soundex (все же, возможно, улучшенный), NYSIIS или Metaphone / Double Metaphone, однако рассмотрите более слабые результаты. То же верно и для конкретных случаев: Новая Зеландия - каверфон, славянский - Daitch-Mokotoff Soundex, немецкий - Cologne Phonetics.

Если вы ищете более сложную логику, вероятно, лучше всего будет либо фонетическое соответствие Бейдера-Морзе (бесплатно, сексуально) или Metaphone3 (не такое бесплатное, более сексуальное).

Практически все существующие алгоритмы в одной библиотеке (Python)



Полезный ресурс на русском языке (в том числе еще 2 алгоритма сопоставления русских имен)



Soundex, NYSIIS, двойной метафон на Python:



NYSIIS на C ++, Java, Python:



Библиотека NYSIIS на Python: