Pull to refresh

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

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

Стемминг — это процесс нахождения основы слова для заданного исходного слова. Основа слова необязательно совпадает с морфологическим корнем слова. Алгоритм стемминга представляет собой давнюю проблему в области компьютерных наук. Данный процесс применяется в пои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');
?>
 


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

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

Можно критиковать и минусовать.
Tags:
Hubs:
+19
Comments16

Articles

Change theme settings