Как стать автором
Обновить

Комментарии 35

Отличная статья!
Юзал Soundex правда не помню какой именно.
Но реально очень удобно.
Удобно. Радует что есть поддержка Soundex'a MySQL'ом, но нет поддержки русских произношений…
Ой, а я как-то её делал, надо поискать в скриптах, пару лет назад было дело.
Да можно… Но хотелось бы чтобы это было на уровне MySQL.
Да об этом я и не мечтал :-)
Поиск без Soundex (или его аналогов) просто издевательство.
НЛО прилетело и опубликовало эту надпись здесь
Раньше не встречала таких алгоритмов, очень интересно было почитать, спасибо.
В логике этих алгоритмов нет ничего сложного, и они легко реализуются в виде хранимых подпрограмм (или каких-либо других расширений) для большинства СУБД.

Вообще, не совсем понятно, почему во многих системах используется именно Soundex, ведь он по многим параметрам уступает остальным алгоритмом, тому же Metaphone, например. Да, его реализация немного проще, но это — ничто по сравнению с качеством результатов.
Что же вы забыли n-grams! В отличие от всех рассмотренных алгоритмов, n-граммы поддерживают индексный поиск. Мы написали для постгреса такой модуль, который доступен в дистрибутиве, а совсем недавно, этот же индекс ускоряет *pattern*!
Вы немного путаете области — метод n-грамм (если говорить о подстроках фиксированной длины n) относится к нечеткому поиску, который обычно не затрагивает фонетических аспектов, и больше основывается на понятиях метрик (Левенштейна, например).

Кроме того, все представленные алгоритмы позволяют проводить индексирование по значению кода как по обычным словам, а индексирование в методе n-грамм — совершенной иной процесс.
Извините, не обратил внимание на топик :) Но, можно было бы упомянуть, что помимо фонетических алгоритмов есть и другие.
Напишите статью, я думаю не только я буду благодарен.
Уже пишу!
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
На первом курсе писал курсовую работу, в которой реализовывал компьютера-собеседника. Использовал Soundex для сравнения слов со словарем. Русский текст просто транслитерировал латиницей и применял алгоритм. Результат получался довольно неплохим.
Занятно, что ни один из алгоритмов не учитывает ударения. В результате русские фамилии на -ин от армянских отличит только русский Metaphone. Интересно, этого сознательно добивались?
обоже!
это вот именно то, что генерит «Возможно, вы имели в виду: Шварценеггер»?
«Зачитываю по буквам — сы-цы-хы-варзенеггер» )
Любопытные алгоритмы.
А вот ещё более интересная реализация (алгоритм вряд ли имеет название ибо самопальный).
Например:
nanohertz.net/?word=%D1%85%D1%80%D0%BE%D0%BD%D0%BE%D1%84%D0%B0%D0%B7%D0%B8%D1%82%D1%80%D0%BE%D0%BD

Если будете играться, то примите во внимание, что система обучена русским и английским словам, но не знает ни имён ни ругательств.
Если система выдаёт казалось бы бредовый результат, перед тем как писать «автор — козёл, код не работает» проверьте наличие искомого слова в БД путём ввода корректного написания этого слова.
На Хабре публиковалась реализация daitch-mokotoff на php
Использую в своих проектах, по сравнению с soundex просто небо и земля.
Подумал, что может быть интересно для чего :)
Я использую daitch-mokotoff для исправления опечаток в поисковых запросах.
Вкратце реализовано это так: есть таблица, в которой хранятся слова в базовой форме (используется словарь морфологии) и их фонетический вид по daitch-mokotoff
При поиске для каждого слова пытаемся словарем найти базовую форму. Если такой нет, предполагаем, что человек ошибся, получаем фонетический вид поискового слова и выбираем из таблицы все слова с таким же видом. После чего для поискового слова и слова из запроса вычисляется расстояние по Левенштайну (минимальное количество вставок, замен и удалений символов, необходимое для преобразования str1 в str2) и находим самое близкое слово.
Плохо работает для имен собственных, но на общеупотреблительных фразах — весьма, весьма.
А нет ли ошибки в примерах для Daitch-Mokotoff Soundex?

095747 → Архипцев, Архипцов, Архипычев, Арцыбасов, Арцыбашев, Арчибасов
095757 → Архипков, Архипцев, Архипцов, Архипычев

Одна фамилия (например. Архипцев) соответствует двум кодам.
Daitch-Mokotoff Soundex может сопоставлять одному слову несколько кодов, если возможно альтернативное произношение (такие альтернативы приведены в описании).
Однако если захочется найти именно «Швардсенеггера», придется попотеть. Гугл со своими фонетизмами некоторые фразы (даже с кавычками) отказывается искать. Например: «operator+ C++» (пример из головы).
Этот находит, а вот «operator[] c++» уже нет. Показывает общую информацию по операторам (не только по операторам operator).
Такой вопрос:
Существуют ли какие-то фонетические алгоритмы (или реализации описанных), которые могут измерять расстояние между словами? Иногда хотелось бы проводить ранжирование слов по схожести произношения…
Если я не ошибаюсь, специализированных алгоритмов для этого нет. Однако, можно попытаться приспособить уже существующие алгоритмы к подсчету количества преобразований, необходимых для приведения одного слова ко второму, правда я не очень хорошо себе представляю, как это возможно за оптимальное время сделать.
Исходя из вашего текста наиболее точно (в случае англоязычных фамилий) попадает NYSIIS — не смотря на то, что он не самый новый. Или я не правильно оцениваю результаты?
Сложно сказать. Нужно проводить тестирование, сравнение, и, опять же, без участия человека сложно выяснить, насколько точным является результат. По примерам также нельзя объективно оценить качество.

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

Одно ясно точно — будь NYSIIS наилучшим вариантом, не стали бы изобретать новые алгоритмы.
НЛО прилетело и опубликовало эту надпись здесь
Сделал небольшой форк примера из статьи.
За прошедшее время в apache commons codec появилась своя реализация NYSIIS

Если вдруг захочется дополнить реализациями на разных языках
https://github.com/Betawolf/Phonetics.jl


Это библиотека на Julia


Soundex
— Fuzzy Soundex
— Phonex
— Phonix
— The New York State Identification and Intelligence System (NYSIIS)
— The Census Modified Statistics Canada procedure
— The Match Rating Approach
— Lein
— Caverphone
— Roger Root
— Metaphone
— Double Metaphone
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории