Введение

Фонетический алгоритм индексации слов

Метафон — это фонетический алгоритм, опубликованный Лоуренсом Филипсом в 1990 году, для индексации слов по их английскому произношению. Он значительно улучшает алгоритм Soundex, используя информацию о вариациях и нерегулярностях в английском написании и произношении для получения более точного кодирования, которое лучше сопоставляет слова и имена, звучащие похоже. Как и в случае с Soundex, слова со схожим звучанием должны иметь одинаковые ключи. Метафон доступен как встроенный оператор во многих системах. Позже Филипс разработал новую версию алгоритма, которую он назвал Double Metaphone. В отличие от исходного алгоритма, который применим только к английскому языку, эта версия учитывает особенности написания ряда других языков. В 2009 году Филипс выпустил третью версию, названную Metaphone 3, которая достигает точности примерно 99% для английских слов, неанглийских слов, знакомых американцам, а также для имён и фамилий, часто встречающихся в Соединенных Штатах, и была разработана в соответствии с современными инженерными стандартами на основе набора тестовых данных с заранее подготовленными правильными кодировками.

Процедура

Оригинальные коды Metaphone используют 16 согласных символов 0BFHJKLMNPRSTWXY. '0' представляет "th" (как ASCII-приближение к Θ), 'X' представляет "sh" или "ch", а остальные – их обычное английское произношение. Гласные AEIOU также используются, но только в начале кода. Эта таблица суммирует большинство правил в оригинальной реализации:

Удалять повторяющиеся соседние буквы, за исключением C. Если слово начинается с 'KN', 'GN', 'PN', 'AE', 'WR', удалять первую букву. Удалять 'B', если следует за 'M' в конце слова. 'C' преобразуется в 'X', если за ним следуют 'IA' или 'H' (если только в последнем случае это не часть 'SCH', тогда оно преобразуется в 'K'). 'C' преобразуется в 'S', если за ним следуют 'I', 'E' или 'Y'. В противном случае 'C' преобразуется в 'K'. 'D' преобразуется в 'J', если за ним следуют 'GE', 'GY' или 'GI'. В противном случае 'D' преобразуется в 'T'. Удалять 'G', если за ним следует 'H' и 'H' не стоит в конце слова или перед гласной. Удалять 'G', если за ним следуют 'N' или 'NED' и оно стоит в конце слова. 'G' преобразуется в 'J', если перед 'I', 'E' или 'Y', и это не 'GG'. В противном случае 'G' преобразуется в 'K'. Удалять 'H', если оно следует за гласной и не предшествует гласной. 'CK' преобразуется в 'K'. 'PH' преобразуется в 'F'. 'Q' преобразуется в 'K'. 'S' преобразуется в 'X', если за ним следуют 'H', 'IO' или 'IA'. 'T' преобразуется в 'X', если за ним следуют 'IA' или 'IO'. 'TH' преобразуется в '0'. Удалять 'T', если за ним следует 'CH'. 'V' преобразуется в 'F'. 'WH' преобразуется в 'W', если стоит в начале слова. Удалять 'W', если за ним не следует гласная. 'X' преобразуется в 'S', если стоит в начале слова. В противном случае 'X' преобразуется в 'KS'. Удалять 'Y', если за ним не следует гласная. 'Z' преобразуется в 'S'. Удалять все гласные, кроме первой. Эта таблица не является полным описанием оригинального алгоритма Metaphone, и алгоритм нельзя правильно закодировать, основываясь только на ней. Оригинальный Metaphone содержал множество ошибок и был заменен Double Metaphone, который, в свою очередь, вместе с оригинальным Metaphone был заменен Metaphone 3, исправляющим тысячи ошибок кодирования, которые возникали в первых двух версиях. Для реализации Metaphone без приобретения копии исходного кода Metaphone 3 можно использовать эталонную реализацию Double Metaphone. В качестве альтернативы, версия 2.1.3 Metaphone 3, более ранняя версия 2009 года, не содержащая ряда исправлений кодирования, внесенных в текущую версию 2.5.4, была опубликована под лицензией BSD через проект OpenRefine.

Двойной метафон

Алгоритм фонетического кодирования Double Metaphone является вторым поколением этого алгоритма. Его реализация была описана в июньском номере журнала C/C++ Users Journal. Он вносит ряд фундаментальных улучшений в конструкцию по сравнению с оригинальным алгоритмом Metaphone. Название "Double" (Двойной) он получил, потому что может возвращать как первичный, так и вторичный код для строки, что позволяет учитывать некоторые неоднозначные случаи, а также различные варианты фамилий с общим происхождением. Например, кодирование имени "Smith" дает первичный код SM0 и вторичный код XMT, а имя "Schmidt" – первичный код XMT и вторичный код SMT; оба имени имеют XMT в качестве общего кода. Double Metaphone стремится учитывать множество нерегулярностей в английском языке, обусловленных славянским, германским, кельтским, греческим, французским, итальянским, испанским, китайским и другими языковыми корнями. Таким образом, он использует гораздо более сложный набор правил кодирования, чем его предшественник; например, он проверяет около 100 различных контекстов использования только буквы C.

Метафон 3

Профессиональная версия была выпущена в октябре 2009 года и разработана тем же автором, Лоуренсом Филипсом. Это коммерческий продукт, продаваемый в виде исходного кода. Metaphone 3 дополнительно улучшает фонетическое кодирование слов английского языка, неанглийских слов, знакомых американцам, а также имён и фамилий, часто встречающихся в Соединенных Штатах. Особенно значительно улучшено кодирование имён собственных. Автор утверждает, что в целом точность кодирования для всех слов повышается с примерно 89% (для Double Metaphone) до 98%. Разработчики теперь также могут задавать параметры в коде, чтобы алгоритм кодировал ключи Metaphone 1) с учетом неначальных гласных и 2) кодировал звонкие и глухие согласные по-разному. Это позволяет более точно настроить набор результатов, если разработчик обнаруживает, что результаты поиска содержат слишком много слов, недостаточно близких к поисковому запросу. Metaphone 3 продается в виде исходного кода на C++, Java, C#, PHP, Perl и PL/SQL, а также обёрток для Ruby и Python, обращающихся к Java jar, и Metaphone 3 для испанского и немецкого произношения, доступного в виде исходного кода на Java и C#. Последняя версия алгоритма Metaphone 3 – v2.5.4, выпущенная в марте 2015 года. Исходный код Metaphone3 Java для более ранней версии 2.1.3, в которой отсутствует значительное количество исправлений кодирования, внесённых в текущую версию 2.5.4, был включён в проект OpenRefine и находится в открытом доступе.

Метафоны других языков

Метафон полезен для вариантов английского языка и других языков, часто предпочитаясь Soundex в ряде индоевропейских языков. С другой стороны, упрощенное фонетическое кодирование приводит к языковой зависимости — или, в случае языкового варианта, к зависимости от среднего носителя языка — особенно для неанглийских вариантов. Вероятно, первым примером успешной адаптации метафона для неанглийского языка стал бразильский португальский: он возник примерно в 2008 году как решение для базы данных в муниципалитете Варзеа-Паулиста в Бразилии и со временем развился в современный алгоритм metaphone ptbr.