Да, саундекс отличная штука. Позволяет не геморроиться со всякими там стеммерами и прочими морфологическими приблудами.
Вообще мне вот интересно, как, допустим, яндекс режет приставки, падежи и т.д., наверняка же где-то есть и эти алгоритмы. Стеммер Портера не предлагать :)
Про яндекс то я в курсе, просто это некая программулина, а не набор скриптов, соответственно на шаред хостинге не факт, что заработает как надо. А вот за вторую ссылку спасибо, почитаю.
Если я не ошибаюсь, то на яндексе есть и сорс всего этого, и порты под разные системы. Тем более, сделать обработчик готовой проги не так сложно. Она ж там на си написана.
Еще раз повторюсь: не уверен в том, что только что написал, надо скачать и смотреть. Просто с годик назад качал и запускал на хостинге спокойно
да, вы правы, для виртуального проще использовать работу со словарями прямо в mysql, примерно как это описано у вас во второй ссылке. так тоже работали ) пока не понадобился украинский. с ним больше проблем из-за морфологического изменения корня слова в существительных.
поиск по фразе есть, насколько помню, но лучше посмотреть документацию, как именно это делается.
Поясню, что спросил об этом не случайно. Этот вопрос для меня действительно сейчас актуален. Вот в том поиске, который с версии 8.3 вшит в Postgres, нету поиска фраз. Я уже посмотрел в мануале, есть в нем фразовый поиск, да. Это гуд.
Ну, самый простой и прямой вариант перевесить на мускул - считать коды на пхп, а в мускул пихать fulltext-индекс, затем искать binary fulltext в виде match (fulltext_key) against ('+845747 +773644' in boolean mode)
а если совсем хочется глубоко закопаться - можно на процедурах сделать
Не. Я придумал иначе. Сделаю отдельную таблицу, в которой будет айдишник итема и коды названия (ну типа один итем ко многим кодам).
И генерить коды при добавлении нового итема.
Ясность изложения говорит о большом понимании автором.
А то вечно напишут что-то запутанное, а потом делают вид, что шарят :)
Побольше бы таких замечательных статей!
Раз уж статья опубликована в разделе PHP, то, думаю, едва ли можно обидеть вниманием такую замечательную встроенную PHP-функцию, как metaphone() - собственно, реализация уже упомянутого алгоритма Metaphone. Есть еще такая реализация, как double metaphone (можно взять на http://swoodbridge.com/DoubleMetaPhone/). Она хоть и точнее, но работает, правда, помедленнее. Сама же функция metaphone - весьма шустрая, предназначена, к сожалению, только для латиницы, так что, без транслита все же не обойтись :(
спасибо большое за интересную и простую подачу такого, казалось бы, туманного алгоритма.
кто набрался смелости посчитать циферки для чака норриса — отпишитесь. страшно запускать.
респектище! вот только возник вопрос, а что с умляутами? там в таблице только пару букв с закорючками. я так понимаю, должна быть где-то табличка замены всех этих буковок с точками/черточками на стандартную латиницу?
Да, есть некоторые исключения, но это легко подогнать под задачу - чуть усовершенствовать функцию транслитерации, чтобы двойной звук "й" после гласной не кодировать - из звучащего в транслите nokija/нокийа должно получится nokia/нокиа. Оставляю тюнинг на усмотрение тех, кто захочет попробовать этот поиск. )
Для Perl есть готовый модуль Text::Phonetic::DaitchMokotoff
Так вот там, результат не код, а массив кодов (потому что "Some strings in the Daitch-Mokotoff algorithm produce ambigous results"). Для транслитерированного "нокия" результат - 2 кода: 654000 и 650000.
Да, можно выдавать оба возможных варианта - если кому-то захочется, можно приписать пару строк. Мне проще работать с теми языками, на которых я умею говорить, поэтому сделал, как сделал.
Ну, честно говоря непонятно, почему вы при транслитерации меняете Й на J, а далее как русский аналог J у вас выступает DZH. Правильнее тогда-бы пожалуй было транслитерировать Й в другую букву (последовательность букв).
Так я о том и написал четырьмя коментами выше. Почему - потому что мне на тот момент было выгоднее, чтобы Johnson == Джонсон, а не Johnson == Йонсон. Т.е. надо или тюнить транслит, или сами коды, или выдавать несколько возможных вариантов (последнее - правильный подход, но учитывая, что такой поиск используется, как фолбэк, когда нет точных совпадений, все в меру разумно... и Bill/Paul по той же причине я не рассматривал, потому что по таким вещам обычно не опечатываются и редко ищут - короткий запрос. А вот по MacCartnie, McCartney, Маккартни, Мокартни - самое то )). Спасибо за коменты, радует то, что многим все-таки не лень разобраться в теме.
Johnson = Джонсон - вопросов нет:) Если вариант с несколькими кодами не прокатывает, то тюнить надо функцию транслит. Я у себя кроме й->j еще кое какие варианты затюнил.
По поводу Bill/Paul это еще что, я вот на повеселее вариант наткнулся.
Есть такая актриса Zawieruszanka (479465). Так вот Schwarzenegger (479465) ее фонетический родственник:)
По правилам такие слова кодируются, как если бы они были без пробела, но потребуется внести дополнительные изменения, чтобы получить ожидаемый результат для Вашего конкретного случая использования.
Блин =)
Привинтил к поиску на сайте. Решил поискать.
Набрал, естественно, слово «хуй». Вылетел эксэпшон.
Методом научного тыка установил, что функция работает, если строка содержит пять или больше символов.
Сейчас попробую разобраться, почему так.
От четырех символов, если быть точным. Большинство слов до 4 символов не нуждаются в поддержке со стороны такого поиска, потому что либо достаточно коротки, чтобы быть написанными без опечаток, либо попадают в разряд "stopwords" (артикли, предлоги, местоимения и всякие другие короткие слова). В принципе, все это можно тюнинговать, там в коде эти ограничения видны. Ваше, в частности, надо поменять в preg_replace
а я уже сам догадался
к тому же все короткие слова очень похожи ) поэтому ищешь «хуй», а находишь «мел»
Ну это грубо говоря.
А вообще ещё раз спасибо. Весь день сижу и играюсь: ищу всякое )
Вы меня, конечно, извините. Но я не понял как вы осуществили поиск? Не добавили же дополнительные поля в DB, где весь текст был в кодах, и по нему осуществлялся бы поиск.
Никогда бы не догадался, респект :) Но, судя по комментом, много косяков? :) Интересно, как на Yandex и др. сервисах пашет фича "Возможно вы имели ввиду".
Фонетический поиск