Введение
Фонетический алгоритм индексации слов
Метафон — это фонетический алгоритм, опубликованный Лоуренсом Филипсом в 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.
If the word begins with 'KN', 'GN', 'PN', 'AE', 'WR', drop the first letter. Drop 'B' if after 'M' at the end of the word. 'C' transforms to 'X' if followed by 'IA' or 'H' (unless in latter case, it is part of ' SCH ', in which case it transforms to 'K'). 'C' transforms to 'S' if followed by 'I', 'E', or 'Y'. Otherwise, 'C' transforms to 'K'. 'D' transforms to 'J' if followed by 'GE', 'GY', or 'GI'. Otherwise, 'D' transforms to 'T'. Drop 'G' if followed by 'H' and 'H' is not at the end or before a vowel. Drop 'G' if followed by 'N' or 'NED' and is at the end. 'G' transforms to 'J' if before 'I', 'E', or 'Y', and it is not in 'GG'. Otherwise, 'G' transforms to 'K'. Drop 'H' if after vowel and not before a vowel. 'CK' transforms to 'K'. 'PH' transforms to 'F'. 'Q' transforms to 'K'. 'S' transforms to 'X' if followed by 'H', 'IO', or 'IA'. 'T' transforms to 'X' if followed by 'IA' or 'IO'. 'TH' transforms to '0'. Drop 'T' if followed by 'CH'. 'V' transforms to 'F'. 'WH' transforms to 'W' if at the beginning. Drop 'W' if not followed by a vowel. 'X' transforms to 'S' if at the beginning. Otherwise, 'X' transforms to 'KS'. Drop 'Y' if not followed by a vowel. 'Z' transforms to 'S'. Drop all vowels unless it is the beginning. This table does not constitute a complete description of the original Metaphone algorithm, and the algorithm cannot be coded correctly from it. Original Metaphone contained many errors and was superseded by Double Metaphone, and in turn Double Metaphone and original Metaphone were superseded by Metaphone 3, which corrects thousands of miscodings that will be produced by the first two versions. To implement Metaphone without purchasing a (source code) copy of Metaphone 3, the reference implementation of Double Metaphone can be used. Alternatively, version 2.1.3 of Metaphone 3, an earlier 2009 version without a number of encoding corrections made in the current version, version 2.5.4, has been made available under the terms of the BSD License via the OpenRefine project.
Двойной метафон
Алгоритм фонетического кодирования 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.