soundex для русского языка


Русский metaphone() и soundex()

anufriy

Новичок

Русский metaphone() и soundex()

Реализую поиск на основе мануала из PHPinside7-2004, и хочу внедрить опцию «Возможно вы имели ввиду» как в гугле или Яндексе. Для этого в словарь ispell словоформ добавляем поле, содержащее metaphone() или soundex() ключ, а при поиске вычисляем ключи искомых слов, и если самих слов в базе словаря нет, вычисляем ключи для искомых слов и предлагаем похожее из базы.

Всё просто. пока не доходит до русского языка.
После выполнения операции «Юзай Гугл» картина следующая:

И это лучшее что мне удалось найти по этой теме.
Может быть ктото знает какие-либо более законченные решения русской реализации этой функции?

Soundex для русского языка

Soundex — is a phonetic algorithm for indexing names by sound, as pronounced in English. The goal is for names with the same pronunciation to be encoded to the same representation so that they can be matched despite minor differences in spelling. Soundex… … Wikipedia

Soundex — est un algorithme phonétique d indexation de noms par leur prononciation en anglais britannique. L objectif basique est que les noms ayant la même prononciation soient codés avec la même chaîne de manière à pouvoir trouver une correspondance… … Wikipédia en Français

Soundex — es un algoritmo fonético, un algoritmo para indexar nombre por su son >Wikipedia Español

Soundex — Algorithmus Soundex ist ein phonetischer Algorithmus zur Indizierung von Wörtern und Phrasen nach ihrem Klang in der englischen Sprache. Gleichklingende Wörter sollen dabei zu einer >Deutsch Wikipedia

Soundex — es un algoritmo fonético, un algoritmo para indexar nombre por su son >Enciclopedia Universal

Soundex — noun A phonetic algorithm for indexing names by their English pronunciation, based on the most probably significant consonants, so that a search for a misspelled name may find the desired one … Wiktionary

Soundex — ● np. m. ►PAO (++) … Dictionnaire d’informatique francophone

soundex — n. algorithm used to encode words in way that enables words with >English contemporary dictionary

Soundex — … Useful english dictionary

Daitch–Mokotoff Soundex — (D–M Soundex) is a phonetic algorithm invented in 1985 by Jewish genealogists Gary Mokotoff and Randy Daitch. It is a refinement of the Russell and American Soundex algorithms designed to allow greater accuracy in matching of Slavic and Y >Wikipedia


Фонетические алгоритмы: Soundex

При использовании алгоритмов текстового майнинга достаточно часто на практике возникают опечатки, один из способов борьбы с ними это использование триграмм. Недостаток этого подхода в том, что он плохо работает со словами короче 5-7 символов. Альтернативный способ — это применение фонетических алгоритмов, которые сопоставляют двум словам со схожим произношением одинаковые коды, что позволяет осуществлять сравнение и индексацию множества таких слов на основе их фонетического сходства.

Одним из таких алгоритмов является Soundex, который устанавливает одинаковый код вида D321 для слов, имеющих схожее звучание в английском языке. Soundex был разработан Робертом Расселом и Маргарет Кинг Оделл и запатентован в 1918 и 1922 годах. Этот алгоритм стал популярным в 1960-х годах, после того как стал темой нескольких статей в журналах «Communications of the Association for Computing Machinery» и «Journal of the Association for Computing Machinery» и был опубликован в книге Дональда Кнута.

Давайте разберемся как работает оригинальная версия алгоритма:

1. Запоминаем первую букву. Удаляем все ‘h’ и ‘w’, за исключением первой буквы слова;
2. Согласные заменяем на цифры от 1 до 6, причём похожим по звучанию буквам соответствуют одинаковые цифры:

3. Любая последовательность одинаковых цифр сокращается до одной такой цифры.
4. Удаляем все a, e, i, o, u, y, за исключением первой буквы слова.
5. Заменяем первый символ буквой, запомненной на шаге 1, делая её заглавной.
6. Итоговая строка обрезается до первых четырех символов. Если длина строки меньше требуемой, недостающие символы заменяются знаком 0.

Таким образом для слова Morphs алгоритм сгенерирует код M612. Несложно заметить, что после всех этих процедур остается меньше 10 тысяч различных вариаций такого кода, что влечет за собой множество совершенно ничем не похожих друг на друга слов, имеющих одинаковый Soundex-код. Таким образом, результат в большинстве случаев включает в себя большое количество ложных срабатываний.

Для уменьшения ложных срабатываний был создан улучшенный алгоритм Soundex, который в отличие от оригинального использует следующую таблицу кодирования символов:

Таким образом число кодов увеличивается почти до 19 тысяч. Более того снимается ограничение на длину кода (код не дополняется символами 0 и не удаляются все символы после 4-ого).

С применение улучшенного алгоритма Soundex слово Morphs будет закодировано в M913.

Soundex хорошо работает с английским языком, остается вопрос можно ли его использовать для русского языка. Оказывается можно. Для этого перед вычислением кода оригинальным или улучшенным алгоритмом нужно выполнить транслитерацию исходного слова на русском языке.

Пример реализации оригинального алгоритма на perl-e:

В статье использовались материалы из википедиии.

Soundex

Soundex — это алгоритм для кодирования имён собственных. Его создали в 1918–1922 гг. в США Роберт Расселл и Маргарет Кинг Оделл, чтобы облегчить поиск похоже звучащих фамилий. В середине XX века Soundex широко использовался в США при анализе результатов переписей населения 1890–1920 гг. Ниже дан пример карточки с данными переписи населения 1910 г. Здесь вы видите, что код Soundex для фамилии Wilson выглядит как W425:

Задача

Дан список фамилий и соответствующих им кодов Soundex в перепутанном порядке. Некоторые символы пропущены:

S312, T␣6␣, ␣5␣3, C42␣, T520, L␣42, A536, C155, ␣623, S356, ␣252, ␣152, ␣330, A251, A400, L2␣0


Задание 1. Опишите пошагово, как генерируется код Soundex.

Задание 2. Установите соответствия между фамилиями и кодами Soundex и вставьте пропущенные символы.

Задание 3. Постройте коды Soundex для следующих фамилий: Ferguson, Fitzgerald, Hamnett, Keefe, Maxwell, Razey, Shaw, Upfield.

Подсказка

Каждый код состоит из буквы и трёх цифр. Буква повторяет первую букву фамилии, а цифры кодируют согласные, которые содержатся в этой фамилии дальше.

Решение

Все коды Soundex состоят из латинской буквы и трёх цифр. Нетрудно догадаться, почему код для фамилии Wilson начинается на W: потому что это первая буква этой фамилии.

После того как стало ясно, что первая буква сохраняется, задача распадается на шесть небольших задач с перепутанными соответствиями:

Илон Маск рекомендует:  Иконки веб-шрифтов альтернатива изображениям

Chapman, Colquhoun
C42␣, C155

Stanmore, Stubbs
S312, S356

Buckingham, Evans, Fairwright, Kingscott, Whytehead
␣5␣3, ␣623, ␣252, ␣152, ␣330

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

Эти группы таковы:

bpv(f) cgjkqs(xz) dt l mn r
1 2 3 4 5 6

Классификация букв в Soundex более или менее соответствует классификации звуков по тому, как они произносятся: в группу 1 входят согласные, произносимые с участием губ; в группу 2 — согласные, произносимые с помощью задней части языка, и свистящие; в группу 3 — переднеязычные смычные (d и t); в группу 5 — носовые. Исходя из этого, можно распределить по группам и те буквы, которые мы не видели в условии (в таблице они даны в скобках). Буква f попадёт в группу 1 к губным согласным (там уже находится v, пара f по глухости-звонкости), а x и z — в группу 2 (x состоит из k и s, которые находятся в группе 2, а z — звонкая пара к s). Буквы h и w в эту таблицу не вошли: они при генерации кода Soundex игнорируются. То же касается буквы y, которая в английском языке считается гласной.

Можно заметить, что сочетаниям согласных из одной группы соответствует только одна цифра в коде. Например, из данных в условии кодов фамилии Kingscott может соответствовать только ␣5␣3, в котором 5 отвечает за n, 3 — за t, а цифра в середине должна отвечать за g, s и c (очевидно, это будет цифра 2).

Нули в коде соответствуют случаям, когда согласных не хватило на то, чтобы заполнить три позиции. Например, можно установить, что Allaway — это A400, где двум l соответствует 4, а a, w, a и y в кодировании не участвуют.

Ответ на задание 1. Обобщая все эти наблюдения, можно построить алгоритм кодирования. Важно обратить внимание на порядок операций, чтобы он позволил получить все коды без ошибок.


1. Оставить первую букву неизменной.

3. Заменить все согласные на цифры (буквы, наиболее частые чтения которых похожи, объединяются в группы):

bfpv cgjkqsxz dt l mn r
1 2 3 4 5 6

4. Две или более одинаковых цифры подряд сократить до одной.

6. Оставить только первые три цифры или дописать нули справа, чтобы длина кода составила одну букву и три цифры.

Ответ на задание 2 (восстановленные символы подчёркнуты).

Ответ на задание 3.

Ferguson: F622, Fitzgerald: F326, Hamnett: H530, Keefe: K100, Maxwell: M240, Razey: R200, Shaw: S000, Upfield: U143.

Послесловие

Задача, для решения которой использовался (и порой продолжает использоваться в наши дни) алгоритм Soundex, в общем виде называется нечётким поиском (approximate string matching, fuzzy string searching).

Умение понимать, что два языковых выражения эквивалентны, — важная часть владения человеческим языком. Это умение может проявляться на разных уровнях. Например, на уровне семантики (значений слов) и синтаксиса (связей между словами в словосочетании и предложении) носитель русского языка легко понимает, что фразы Стометровую дистанцию он проплыл кролем за 45 секунд, На сто метров кролем у него ушло 45 секунд и Стометровку он проплыл кролем за ¾ минуты (Апресян 1995: I, 12) значат одно и то же. Точно так же и на уровне букв мы легко понимаем, что Муравьёва и Муравьева — это одна и та же фамилия, а Наталия и Наталья — одно и то же имя (хотя в ситуациях, когда хочется придраться, мы можем притворно говорить что-то вроде «Ну как же, здесь написано Наталья Муравьева, а у вас в паспорте — Наталия Муравьёва»). Но автоматизировать такое базовое для нас умение — понимать эквивалентность не совпадающих точно слов и выражений — задача очень сложная.

Такие несовпадения на практике встречаются регулярно. Soundex изначально придумывался именно для сопоставления имён собственных, поскольку в начале XX века вариативность в написании имён собственных была гораздо выше, чем сейчас, — но и сейчас она не совсем сведена к нулю. Так, в книге (Lisbach, Meyer 2013: 15) приводится пример двух вариантов записи информации об одном и том же человеке — например, со слуха в колл-центре и при переписывании с документов с разделением на поля:

Kate Suzanne Jankowiz
Belrive Str. 20, 65920 Frankfurt am Main (Germany)
Catherine Susan Jennifer Yankovits-Brunner
20 Bellerivestrasse Frankfurt/M 65920 DE

Важное достоинство Soundex, которое во многом и обеспечило его популярность, — лёгкость в реализации: в частности, для этого алгоритма не нужен словарь. Soundex упоминается в классическом пособии «Искусство программирования» Дональда Кнута (Knuth 1998: 395–396). Правда, в первом издании (Knuth 1973: 391–392) автор ещё не учёл все тонкости и предлагал одновременно выкидывать гласные, h и w; тогда, например, Chapman даёт не Chapman → Capman → Ca15a5 → C155, а Chapman → Cpmn → C155 → C15 → C150.

Soundex реализован в десятках языков программирования. Например, встроенная функция SOUNDEX есть в системе управления базами данных MySQL. А на Python 3 можно записать всё содержание этой задачи в нескольких строчках (автор кода — Иван Держанский):

Недостатки Soundex лежат на поверхности. Иногда этот алгоритм неспособен обнаружить сходство между очень близкими фамилиями: например, Levinson получит код L152, а Lewinson — код L525. Кроме того, Soundex плохо работает в ситуациях, когда произношение сильно расходится с написанием, что в английском языке бывает нередко. Например, шотландская фамилия Colquhoun, данная в условии, читается примерно как Кэхун, а его код Soundex C425 отражает непроизносимые l (4) и q (2). Другой вариант этой фамилии — Colhoun (вспомним капитана Кассия Колхауна из «Всадника без головы» Майн Рида) — имеет другой код: получится C450. Впрочем, в таком написании обычно произносится л (Колхун), так что разные коды в данном случае — это не так уж и плохо.


Для решения задачи нечёткого поиска нередко используются и более продвинутые алгоритмы. Это могут быть как фонетические алгоритмы наподобие Soundex (например, Metaphone), так и совсем другие подходы — например, связанные с редакционным расстоянием, задача про которое уже публиковалась на нашем сайте.

Литература:
1. Ю. Д. Апресян. Избранные труды. Т. I. // Лексическая семантика. М.: Языки русской культуры, 1995.
2. Donald Knuth. The art of computer programming. Vol. 3: Sorting and searching // Reading (Mass.), 1973.
3. Donald Knuth. The art of computer programming. Vol. 3: Sorting and searching. 2 nd ed. // Reading (Mass.), 1998.
4. Bertrand Lisbach & Victoria Meyer. Linguistic identity matching // Wiesbaden: Springer, 2013.

Задача использовалась на XIII Международной олимпиаде по лингвистике в 2015 году в Благоевграде (Болгария).

soundex()

Синтаксис:

Поддерживается следующими версиями PHP:

Описание функции:

Функции soundex() вычисляет и возвращает soundex ключ для строки.

Илон Маск рекомендует:  Ваше время на странице

Похоже произносящиеся слова имеют одинаковый soundex ключ.

Чаще всего функция soundex() применяется для поиска слов в базе данных , когда известно только их звучание.

Аналогом функции soundex() является функция metaphone(). Считается, что функция metaphone() дает более точные результаты.

Обязательный аргумент. Строка soundex ключ которой необходимо вычислить

Примеры:

Пример 1:

В этом примере совершенно два разных слова green (зеленый) и grin (усмешка) дадут один и тот же soundex ключ, потому что произносятся одинаково.

soundex — Возвращает ключ soundex для строки

(PHP 4, PHP 5, PHP 7)

soundex — Возвращает ключ soundex для строки


Описание

Возвращает ключ soundex для строки str .

Двум словам, имеющим схожее произношение, соответствует один и тот же ключ soundex. Это свойство может быть использовано, например, при поиске по базе данных, когда известно произношение слова и неизвестно его написание. Данная функция возвращает строку из 4 символов, начинающуюся с буквы.

Данная реализация функции soundex описана Дональдом Кнутом (Donald Knuth) в книге «The Art Of Computer Programming, vol. 3: Sorting And Searching», Addison-Wesley (1973), стр. 391-392.

Список параметров

Возвращаемые значения

Возвращает ключ soundex в виде строки.

Примеры

Пример #1 Примеры soundex

Смотрите также

  • levenshtein() — Вычисляет расстояние Левенштейна между двумя строками
  • metaphone() — Возвращает ключ metaphone для строки
  • similar_text() — Вычисляет степень похожести двух строк

Sound Forge Pro 13.0.0.124 русская версия

Sound Forge — известный на сегодняшний день аудиоредактор, который создала компания Sony. На сегодняшний день программа имеет 11 версий. Приложение достаточно привлекательное для того, чтобы создать электронную музыку. Sound Forge предназначен для диджеев, саунд продюсеров и для тех пользователей, которые работают с музыкальными композициями.

Программа является надежным помощником для тех пользователей, которые по роду своей профессиональной деятельности имеют дело с аудиофайлами. Sound Forge предназначен для редактирования и обработки аудио файла, записи разных звуков, нанесения эффектов на композицию и многое другое.

Пароль ко всем архивам: 1progs

Главные возможности программы:

  • Дизайн и монтаж аудио файла.
  • Очистка записи от шумов.
  • Редактирование: смешивание, вырезка, наложение.
  • Поддержка многих форматов файлов.
  • Импортация файлов.
  • Редактор видеофайла.


Данная программа работает с микрофонами, что позволяет записывать музыку, захватывать голос и прочее. Кроме этого, Sound Forge позволяет переносить музыкальную композицию с компакт-диска для редактирования.

Важно отметить, что данное приложение распространяется в условно-бесплатной версии. Если пользователь хочет использовать все функциональные возможности без ограничений, то нужно скачать лицензионный ключ Sound Forge.

Активация Sound Forge позволяет пользоваться всеми функциями этой замечательной программы. Без ограничений будут доступны:

  • Инструменты для профессиональной записи музыкальной композиции.
  • Быстрое редактирование музыкальной композиции.
  • Набор специальных эффектов, которые предназначены для обработки аудио файлов.
  • Запись CD дисков на быстрой скорости.
  • Средства, которые обеспечивают оригинальность звучания для музыкальной композиции.
  • Инструменты для разработки видеоролика и аудиозаписи.

Программа является мощным программным обеспечением, которое может похвастаться превосходным качеством звука и различными инструментами для монтажа музыкальных композиций. Каждый пользователь сможет скачать на этом сайте бесплатно программу.

  1. Большой ассортимент поддерживаемых форматов.
  2. Точное редактирование аудиофайла.
  3. Поддержка русского языка.
  4. Понятный интерфейс.
  5. Большая коллекция спецэффектов.
  6. Звуковые эффекты.
  1. Лицензионная версия имеет высокую цену.

Аналоги программы

Похожие программы смотрите в наших подборках программ

Sound Forge Pro скачать бесплатно на русском языке

Sound Forge Pro – профессиональная среда для редактуры звука в реальном времени.

Продвинутый функционал приложения дает возможность специалистам в работе с музыкой проводить манипуляции с аудио, применять разнообразные спецэффекты и фильтры, а также пользоваться опциями мультиформатного конвертера.

Софт состоит из набора программного обеспечения, предназначенного для работы со звуком. Доступна поддержка более двух десятков форматов аудио для конвертации и сохранения, большой арсенал эффектов и работа с многоканальными файлами.


Возможности:

  • набор инструментов для обработки звука;
  • поддержка большого числа форматов;
  • редактура многоканальных данных;
  • работа с DirectX, VST и ASIO;
  • «drag-and-drop»;
  • редактирование видеоматериала;
  • более двух сотен вспомогательных аудио эффектов.

Саунд Форж предоставляет точную правку звука, считается отличной прогой в своей категории и поможет юзеру легко обработать трек, наложить интересные фильтры и эффекты. Простота интерфейса и незамысловатое управление помогут новичку быстро разобраться в возможностях ПО.

Предлагаем sound forge pro скачать русская версия бесплатно и попробовать себя в роли диджея или саунд-продюсера. Платная версия стоит немалых денег, поэтому создатели предоставили 30 дней на изучение преимуществ проги.

Скачать Sound Forge Pro

Обзор Sound Forge

Практически каждому звукорежиссеру знакомо название редактора Sound Forge Pro. Это приложение завоевало популярность благодаря удобному интерфейсу, большому количеству интегрированных эффектов и совместимости с различными устройствами аудиозахвата. Программа позволяет как вести запись звука, так и обрабатывать готовые аудиодорожки, работать с фрагментами звуковых файлов.

К редактору можно подсоединить различные надстройки-плагины, среди которых следует выделить виртуальный маршрутизатор MIDI — Sony Sonic Foundry MIDI Router.

Несмотря на принадлежность к категории аудиоредакторов, программа может не только открывать звуковые файлы в распространенных форматах, но и извлекать аудиопотоки из видеофайлов.

Интересно, что за время существования, Саунд Фордж поменял несколько разработчиков. До 2003 года продукт принадлежал компании Sonic Foundry, после перешел «под крыло» Sony Creative Software. В 2020 году медиагигант устроил большую распродажу своих программных решений, в результате которой SoundForge был куплен компанией MAGIX.


Особенности

Профессиональная программа для редактирования аудиодорожек. Применяется для работы с отрезками музыкальных композиций, устранения дефектов в аудиозаписях и захвата звука с различных источников. Приложение позволяет подключать различные модули, накладывать собственные и добавлять VST3-эффекты. Sound Forge Pro можно использовать для мастеринга, реставрации аудио и повторного рендеринга.

Удобство

Эталонный гибкий интерфейс, не перегруженный сторонними элементами

Звукозапись

Захват аудио с различных источников сигнала

Эффекты

Контейнер настраиваемых эффектов, возможность интеграции новых VST3-эффектов

Универсальность

Обработка аудиопотоков, извлеченных с звуковых файлов, видеозаписей

В тренде

Поддержка 64-битной архитектуры для использования всего потенциала компьютера

ru_soundex()

// (cc) me, 23/08/2007-27/08/2007

$str = «к скалам бурым» ;
print «ru_soundex($str) = » . ru_soundex ( $str ). «
\r\n» ;

$str = «с каламбуром» ;
print «ru_soundex($str) = » . ru_soundex ( $str ). «
\r\n» ;;

function ru_soundex ( $source )
<
$res = » ;

$literal = array();
// ассоциативный массив букв
// параметры звуков гласный / согласный


// для гласных переход буквы в звук(и), редуцированный/нет, предполагаемые правила ударения исходя из кол-ва слогов (stressed syllable)
// реализована проверка предполагаемого ударения

// для согласных переход букв[ы] в звук(и), редуцируемый/нет, правила редуцирования

// vowel
$literal [ ‘А’ ] = array( ‘status’ => ‘гласный’ , ‘sound’ => ‘а’ , ‘stressed’ => ‘а’ ); // никогда не меняется
$literal [ ‘Е’ ] = array( ‘status’ => ‘гласный’ , ‘sound’ => ‘и’ , ‘stressed’ => ‘э’ , ‘АаЕеЁёИиОоУуЭэЮюЯяЬьЫыЪъ’ => ‘йэ’ ); // — особые правила, для этой буквы, стоящей после указанных, а также в начале слов
$literal [ ‘Ё’ ] = array( ‘status’ => ‘гласный’ , ‘sound’ => ‘о’ , ‘stressed’ => ‘о’ , ‘АаЕеЁёИиОоУуЭэЮюЯяЬьЫыЪъ’ => ‘йо’ );
$literal [ ‘И’ ] = array( ‘status’ => ‘гласный’ , ‘sound’ => ‘и’ , ‘stressed’ => ‘и’ );
$literal [ ‘О’ ] = array( ‘status’ => ‘гласный’ , ‘sound’ => ‘а’ , ‘stressed’ => ‘о’ );
$literal [ ‘У’ ] = array( ‘status’ => ‘гласный’ , ‘sound’ => ‘у’ , ‘stressed’ => ‘у’ );
$literal [ ‘Ы’ ] = array( ‘status’ => ‘гласный’ , ‘sound’ => ‘ы’ , ‘stressed’ => ‘ы’ );
$literal [ ‘Э’ ] = array( ‘status’ => ‘гласный’ , ‘sound’ => ‘э’ , ‘stressed’ => ‘э’ );
$literal [ ‘Ю’ ] = array( ‘status’ => ‘гласный’ , ‘sound’ => ‘у’ , ‘stressed’ => ‘у’ , ‘АаЕеЁёИиОоУуЭэЮюЯяЬьЫыЪъ’ => ‘йу’ );
$literal [ ‘Я’ ] = array( ‘status’ => ‘гласный’ , ‘sound’ => ‘а’ , ‘stressed’ => ‘а’ , ‘АаЕеЁёИиОоУуЭэЮюЯяЬьЫыЪъ’ => ‘йа’ ); // заяц произносится как [зайец]
$v_pattern = ‘АаЕеЁёИиОоУуЭэЮюЯяЬьЫыЪъ’ ;

Илон Маск рекомендует:  Что такое код asp description

// кстати, надо добавить выкусывание гласных из концов слов, заканчивающихся на согласный-гласный-звонкий согласный (-ром, -лем, итд) гласная очень часто сглатывается
// зы: это здесь не реализовано %)
// проверено: soundex и сам с этим неплохо справляется

// звонкие согласные редуцируются при удвоении.
// звонкие согласные переходят в парный глухой перед глухим
// глухие редуцируются полностью перед глухими.

// consonant
// в отличие от гласных, для согласных условие «стоит перед указанной или в конце слова»
$literal [ ‘Б’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘б’ , ‘КкПпСсТтФфХхЦцЧчШшЩщ’ => ‘п’ );
$literal [ ‘В’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘в’ , ‘КкПпСсТтФфХхЦцЧчШшЩщ’ => ‘ф’ );
$literal [ ‘Г’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘Г’ , ‘КкПпСсТтФфХхЦцЧчШшЩщ’ => ‘к’ );
$literal [ ‘Д’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘д’ , ‘КкПпСсТтФфХхЦцЧчШшЩщ’ => ‘т’ );
$literal [ ‘Ж’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘ж’ , ‘КкПпСсТтФфХхЦцЧчШшЩщ’ => ‘ш’ );
$literal [ ‘З’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘з’ , ‘КкПпСсТтФфХхЦцЧчШшЩщ’ => ‘с’ );
$literal [ ‘Й’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘й’ );
$literal [ ‘К’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘к’ , ‘КкПпСсТтФфХхЦцЧчШшЩщ’ => » );
$literal [ ‘Л’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘л’ );
$literal [ ‘М’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘м’ );
$literal [ ‘Н’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘н’ );
$literal [ ‘П’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘п’ , ‘КкПпСсТтФфХхЦцЧчШшЩщ’ => » );
$literal [ ‘Р’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘р’ );
$literal [ ‘С’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘с’ ); // а вот С не хочет редуцироваться, на первый взгляд.
$literal [ ‘Т’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘т’ , ‘КкПпСсТтФфХхЦцЧчШшЩщ’ => » );
$literal [ ‘Ф’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘ф’ , ‘КкПпСсТтФфХхЦцЧчШшЩщ’ => » ); // спорно
$literal [ ‘Х’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘х’ );
$literal [ ‘Ц’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘ц’ );
$literal [ ‘Ч’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘чь’ ); // всегда мягкий
$literal [ ‘Ш’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘ш’ );
$literal [ ‘Щ’ ] = array( ‘status’ => ‘согласный’ , ‘sound’ => ‘щь’ );

// спецсимволы
$literal [ ‘Ъ’ ] = array( ‘status’ => ‘знак’ , ‘sound’ => ‘ ‘ ); // только разделительный. делит жёстко
$literal [ ‘Ь’ ] = array( ‘status’ => ‘знак’ , ‘sound’ => ‘ь’ ); // даже если делит, то мягко

$literal [ ‘ТС’ ] = array( ‘status’ => ‘сочетание’ , ‘sound’ => ‘ц’ );
$literal [ ‘ТЬС’ ] = $literal [ ‘ТС’ ];
$literal [ ‘ШЬ’ ] = array( ‘status’ => ‘сочетание’ , ‘sound’ => ‘ш’ ); // всегда твёрдый. и это не единстенный рудимент языка

$literal [ ‘СОЛНЦ’ ] = array( ‘status’ => ‘сочетание’ , ‘sound’ => ‘сонц’ );
$literal [ ‘ЯИЧНИЦ’ ] = array( ‘status’ => ‘сочетание’ , ‘sound’ => ‘еишниц’ );
$literal [ ‘КОНЕЧНО’ ] = array( ‘status’ => ‘сочетание’ , ‘sound’ => ‘канешно’ );
$literal [ ‘ЧТО’ ] = array( ‘status’ => ‘сочетание’ , ‘sound’ => ‘што’ );
$literal [ ‘ЗАЯ’ ] = array( ‘status’ => ‘сочетание’ , ‘sound’ => ‘зайэ’ ); // да-да. не только [зайэц], но и [зайэвльэнийэ]

$sound = str_to_upper ( $source );

// сначала сочетания
foreach( array_filter ( $literal ,
create_function ( ‘$item’ , ‘if( $item[«status»] === «сочетание») return true; return false;’ ))
as $sign => $translate )
$sound = str_replace ( $sign , $translate [ «sound» ], $sound );

// потом знаки
foreach( array_filter ( $literal ,
create_function ( ‘$item’ , ‘if( $item[«status»] === «знак») return true; return false;’ ))
as $sign => $translate )
$sound = str_replace ( $sign , $translate [ «sound» ], $sound );

// разделяем на слова, определяем кол-во слогов, заменяем ударный/безударный гласный (единственный или предполагая второй в двух-трёхсложном слове, предпредпоследний — в остальных)

‘ , $sound , — 1 , PREG_SPLIT_NO_EMPTY );

// гласные
foreach( array_filter ( $literal ,
create_function ( ‘$item’ , ‘if( $item[«status»] === «гласный») return true; return false;’ ))
as $sign => $translate )
<
// для каждого слова
foreach( $words as & $word )
<
// кол-во гласных
$vowel = preg_match_all ( «

» , $word , $del_me );
// готовим
$cur_pos = 0 ;
$cur_vowel = 0 ;
while( false !== $cur_pos = strpos ( $word , $sign , $cur_pos ) )
<
$cur_vowel ++;
// print $cur_pos.’ = ‘.$sound[$cur_pos].»
\r\n»;
if( sizeof ( $translate )== 4 && ( $cur_pos === 0 || strpos ( $v_pattern , $word [ $cur_pos — 1 ] )))
<
$word = substr_replace ( $word , $translate [ $v_pattern ], $cur_pos , 1 );
>
elseif( 1 == $vowel )
$word = substr_replace ( $word , $translate [ «stressed» ], $cur_pos , 1 ); //
elseif( 2 == $vowel && 1 == $cur_vowel )
$word = substr_replace ( $word , $translate [ «stressed» ], $cur_pos , 1 ); // предполагаем, что в двухсложных словах первый слог ударный
elseif( 3 $vowel && $cur_vowel == $vowel — 2 )
$word = substr_replace ( $word , $translate [ «stressed» ], $cur_pos , 1 ); // предполагаем, что слог ударный предпредпоследний
else
$word = substr_replace ( $word , $translate [ «sound» ], $cur_pos , 1 );
$cur_pos ++;
>
>
>

$sound = implode ( $words , ‘ ‘ ); // клеим обратно

// согласные
foreach( array_filter ( $literal ,
create_function ( ‘$item’ , ‘if( $item[«status»] === «согласный») return true; return false;’ ))
as $sign => $translate )
<
// готовим
$cur_pos = 0 ;
while( false !== $cur_pos = strpos ( $sound , $sign , $cur_pos ) )
<
// print $cur_pos.’ = ‘.$sound[$cur_pos].»
\r\n»;
if( sizeof ( $translate )== 3 )
<
$x = array_pop ( array_keys ( $translate )); // снимаем третий элемент
if( strpos ( $x , $sound [ $cur_pos + 1 ] ) || $cur_pos === strlen ( $sound ) )
<
$sound = substr_replace ( $sound , $translate [ $x ], $cur_pos , 1 );
> elseif ( $sound [ $cur_pos ] === $sound [ $cur_pos + 1 ] )
$sound = substr_replace ( $sound , $translate [ «sound» ], $cur_pos , 2 ); // все двойные редуцируются
else
$sound = substr_replace ( $sound , $translate [ «sound» ], $cur_pos , 1 );

> else
<
$sound = substr_replace ( $sound , $translate [ «sound» ], $cur_pos , 1 );
>

$cur_pos ++;
>
>
// алес. фонемы привели к одному виду
// дальше используем любой алгоритм для вычисления числового эквивалента

// но остаётся сомнение. очень хочется расстаться с глухими предлогами перед глухими согласными («к скалам»)

// print $sound;
// print str_to_translit($sound);
// print soundex(str_to_translit($sound));

$res = str_to_upper ( $source [ 0 ]). substr ( soundex ( str_to_translit ( $sound )), 1 );

// (c) http://ru2.php.net/manual/en/function.strtoupper.php#74574
//Russian
function str_to_upper ( $str ) <
return strtr ( $str ,
«abcdefghijklmnopqrstuvwxyz» .
«\xE0\xE1\xE2\xE3\xE4\xE5» .
«\xb8\xe6\xe7\xe8\xe9\xea» .
«\xeb\xeC\xeD\xeE\xeF\xf0» .
«\xf1\xf2\xf3\xf4\xf5\xf6» .
«\xf7\xf8\xf9\xfA\xfB\xfC» .
«\xfD\xfE\xfF» ,
«ABCDEFGHIJKLMNOPQRSTUVWXYZ» .
«\xC0\xC1\xC2\xC3\xC4\xC5» .
«\xA8\xC6\xC7\xC8\xC9\xCA» .
«\xCB\xCC\xCD\xCE\xCF\xD0» .
«\xD1\xD2\xD3\xD4\xD5\xD6» .
«\xD7\xD8\xD9\xDA\xDB\xDC» .
«\xDD\xDE\xDF» );
>

function str_to_translit ( $str ) <
return strtr ( $str ,
«abcdefghijklmnopqrstuvwxyz» .
«\xE0\xE1\xE2\xE3\xE4\xE5» .
«\xb8\xe6\xe7\xe8\xe9\xea» .
«\xeb\xeC\xeD\xeE\xeF\xf0» .
«\xf1\xf2\xf3\xf4\xf5\xf6» .
«\xf7\xf8\xf9\xfA\xfB\xfC» .
«\xfD\xfE\xfF» ,
«abcdefghijklmnopqrstuvwxyz» .
«abvgde» .
«?*ziik» .
«lmnopr» .
«stufhc» .
«4ww\»y`» .
«eua» );
>
?>

upd: ps: хотелось бы отметить, что приведённый код служит, скорее, для иллюстрации алгоритма, чем для применения на практике. практическую реализацию можно сделать в другой форме

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL