Вероятностный морфологический анализатор русского и украинского языков на PHP

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

    Стемминг — это процесс нахождения основы слова для заданного исходного слова. Основа слова необязательно совпадает с морфологическим корнем слова. Алгоритм стемминга представляет собой давнюю проблему в области компьютерных наук. Данный процесс применяется в поиcковых системах для обобщения поискового запроса пользователя.
    Конкретные реализации стемминга называются алгоритм стемминга или просто стеммер.



    Недавно мне понадобился стеммер для русcкого и украинского языка с приличным качеством, копаясь на просторах интернетов на сайте Андрея Коваленко я нашел очень интересный стеммер. Описание стеммера.

    Он был реализован на C++, что меня очень сильно расстроило. Расстроило меня не то что он на Си написан, а то что я из-за специфики (только PHP) несмогу его использовать. Я не смирился с этим и вооружившись дебагером портировал это приложение на PHP.

    На сайте есть более производительный стеммер в виде модуля к PHP, но для меня не очень важно сколько слов в секунду он обработает 12 тысяч или 2–3 тысячи, мне достаточно будет и одной тысячи (тестирование скорости не производил)

    Код портированного класса (stemka.php)

    Как заставить его работать:

    Качаем оригинальную библиотеку Оригинальная библиотека из папки library забираем словари fuzzy*.inc

    Приводим словари в вид удобный для PHP. Я сконвертировал данные в бинарный файл и загружал его с помощью функции file_get_contents.

    Перед конвертацией необходимо отредактировать C++ файлы со словарями.
    1. Добавить в начало файла тег "<?php"
    2. Добавить в конец файла "?>"
    3. Заменить "{" на "$fuzzy = array("
    4. Заменить "}" на ");"

    После этого выполнить скрипт конвертации и файлы будут сконвертированы.
    <?php
        include "fuzzyuk.inc";
        $fp = fopen('fuzzyuk.dat', 'w');
        foreach ($fuzzy as $v)
        fwrite($fp, chr($v));
        fclose($fp);
        include "fuzzyru.inc";
        $fp = fopen('fuzzyru.dat', 'w');
        foreach ($fuzzy as $v)
        fwrite($fp, chr($v));
        fclose($fp);
    ?>


    Если нет желания конвертировать — вот уже сконвертированные словари fuzzyuk.dat (243 КБ) fuzzyru.dat (403 КБ)

    Стеммер готов к работе. Пример использования:

    <?php
        include "stemka.php";
        $stemka = new stemka();
        $str = 'перевірка';
        echo $stemka->GetStemCrop($str, 'uk');
    ?>
     


    или Демоверсия

    Не претендую на полноту освещения темы, просто решил поделится кодом, а вдруг комуто пригодится…

    Можно критиковать и минусовать.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 16

      0
      для украинского — не адекват, по крайней мере демо
        0
        хотя не, гоню
          0
          Можно поподробнее. Насколько я знаю для украинского мало нормальных стеммеров :( По крайней мере стеммер Портера в украинской версии выглядит очень убого.
            0
            кажется для украинского таки неадекват
            уже только по
            var $vowels = "аеиоуыэюя";
            это понятно
            ибо еще нужно ведь їіє
          0
          Не подскажите где можно для других языков скачать словари?
            0
            Насколько я знаю, для других языков отсутствуют словари :(
              0
              Судя по описанию программа ориентирована прежде всего на славянские языки, для германских (английский, немецкий, ...) и романских (итальянский, испанский, французский, ...) в том же описании есть ссылки на более эффективные алгоритмы
              0
              дема у Вас как-то с утф-ом плохо работает
                0
                cp1251??? Вас из прошлого кто-то сюда телепортировал?
                  0
                  Да именно cp1251. И я в этом не вижу проблемы, до сих пор для украинского языка нет нормального стеммера без огромных баз. А перекодировать с одной кодировки в другую очень просто.
                    0
                    Допустим, что пофиг. Но указать на страничке можно было кодировку? Нормальные браузеры по умолчанию считают UTF-8, если не указано. У вас не указано, поэтому нифига не работает.
                    (домашня)
                      0
                      Прошу прощения. Исправил.
                  0
                  Однозначно в закладки. Спасибо.
                    0
                    Самолётом -> Самолётом
                    Самолетом -> Самолет
                      0
                      Кстати чуть-чуть покопал в этом вопросе, накопал вот такую штуку: программа морфологического анализа текста на русском языке
                      Очень мне помогла =) Хотя грузит систему оччень хорошо :(
                        0
                        Текс, ссыль зарезалась, а комментировать чаще раза в 5 минут не могу, ну что за напасть?
                        company.yandex.ru/technology/mystem/

                        Only users with full accounts can post comments. Log in, please.