Лемматизатор (Lemmatizer)

Изображение пользователя Michael72.

Вступление
…Основное и единственное назначение лемматизатора — вернуть для исходного слова его базовую словарную форму. Например, для русских существительных это форма именительного падежа единственного числа, для глаголов — форма инфинитива. (Компьютерная грамматика)

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

Итак, что я ищу. Мне нужен ивритский лемматизатор. На данный момент мне удалось создать php-скрипт, в котором реализация лемматизатора для иврита построена на использовании программы hspell. Но качество его работы меня не устраивает, поэтому я продолжаю поиск. Но как бы там ни было, я желаю показать исходный код этого скрипта, может быть, кому-то он тоже поможет:

Внимание! Все исходные коды, приводимые в этой статье, необходимо сохранять в формате Windows ANSI с таблицей кодировки cp1251.

Как уже было сказано, реализация лемматизатора для иврита в этом коде построена на использовании программы hspell, для трёх других языков, – русского, английского и немецкого, – на использовании программы RML — известный лемматизатор Алексея Сокирко (проект aot.ru).

Загрузка и сборка из исходников RML
Для установки этой программы сделайте следующее:

1 Запустите Терминал. После запуска Терминала введите команду для загрузки исходников из репозитория RML:
svn co https://seman.svn.sourceforge.net/svnroot/seman/trunk/ RML
2 Перейдите в каталог, куда вы загрузили исходники программы:
cd RML
3 Установите пакет realpath:
sudo apt-get install realpathили пропишите путь к RML (в данный момент это текущий каталог) в переменной окружения RML:
export RML=$PWD
4 Проверьте, установлены ли у вас пакеты flex и bison, если нет — установите.

5 Для сборки программы запустите скрипт build.sh:
sh build.sh
Внимание! В вышеприведённом php-скрипте необходимо указать переменную $RML. Вместо
/home/michael/seman укажите настоящее название каталога, куда вы установили программу RML (в соответствии с вышеприведённой инструкцией — это каталог, куда вы загрузили исходники программы).

Передача данных PHP лемматизатору

Для начала нужно поместить у себя на локальном сервере, обычно это каталог /var/www, файл PHP лемматизатора с php-кодом, приведённым выше. После этого, самый простой способ посмотреть как выполняется лемматизация с помощью данного кода — создать небольшой HTML-файл следующего содержания:

Данный HTML-код предполагает, что исходный код PHP лемматизатора находится в файле lemmatizer.php. Из-за того, что символы, передаваемые PHP лемматизатору, должны быть в кодировке cp1251, запрос в виде
http://localhost/lemmatizer.php?TemplateFile=morph&langua=Russian&SearchText=WordToLemmatization
(где WordToLemmatization — слово-аргумент передаваемое лемматизатору), вводимый в адресной строке веб-браузера, не принесёт ожидаемого результата, поскольку в данном случае символы будут в кодировке utf-8. По этой причине для тестирования и потребовалось создавать такого рода HTML-файл.

При работе данного теста PHP лемматизатор возвращает лемму для слова-аргумента в объект IFRAME с именем Lemmas. При желании обработать полученный результат JavaScript'ом мы наткнёмся на препятствие, вызванное политикой безопасности, – доступ к информации из другого домена для веб-браузера невозможен. Чтобы преодолеть данное препятствие необходимо создать ещё один php-скрипт:

Поместите этот код в файл provider.php у себя на локальном сервере. Теперь запрос в лемматизатор будет выглядеть в следующем виде:
http://localhost/provider.php?url=http://localhost/lemmatizer.php?TemplateFile=morph&langua=Russian&SearchText=WordToLemmatization
Т.е. теперь слово-аргумент передаётся PHP лемматизатору не напрямую, а через этот промежуточный модуль, который возвращает результат в объект SCRIPT как выполняемый код на языке JavaScript.

Чтобы вы могли освоить работу этого механизма, создайте другой HTML-файл, который наглядно демонстрирует эту методику:

Здесь мы имеем два новых объекта:

  • Объект SCRIPT, создаваемый в функции FormSearch(). Служит для приёма данных из промежуточного модуля provider.php, которые тут же выполняются как JavaScript-код, в результате чего те данные, которые были получены от PHP лемматизатора, перебрасываются в другой объект с id: Translate_DivElement.
  • Объект DIV с id: Translate_DivElement. Служит для приёма данных, полученных от PHP лемматизатора.

Теперь данные, поступающие в объект Translate_DivElement, не являются данными, принадлежащими другому домену, и поэтому подлежат дальнейшей обработке. Запрос в лемматизатор происходит в тот момент, когда свойству src объекта Translate_DynScript присваивается значение переменной src, т.е. в строке: Translate_DynScript.src = src;
Функция OnTimer() ожидает, когда же в объекте Translate_DivElement появятся данные от PHP лемматизатора. Как только данные появились, начинается их обработка. При обработке с помощью функции LemmasCheck() происходит проверка — является ли каждая лемма уникальной, т.е. происходит фильтрация с отсевом повторяющихся лемм. Затем через окно alert выводится полученный результат — массив Lemmas, содержащий список лемм без наличия повторов. Таким образом демонстрируется тот факт, что данные, полученные от PHP лемматизатора действительно можно обрабатывать.

В целях упрощения от использования объекта FORM пришлось отказаться. Форма перезагружает страницу, и это не позволяет обработать полученные данные. Чтобы использовать форму, её необходимо поместить в другое окно/фрейм.

Как создать собственный словарь

А не создать ли нам теперь свой собственный HTML-словарь, содержащий функцию лемматизации? Попробуйте! Вот вам в помощь php-код, который позволит выполнять запрос в словарь DICT:

Ссылку для запроса при этом следует указать примерно в таком виде:
src="http://localhost/provider.php?url=http://localhost/dict.php?dbname=databasename&cp=cpxxxx&word=" + lemma; где <databasename> — кодовое имя словаря, "cpxxxx" — кодировка и lemma — слово в словарной форме (лемма). Пример: src="http://localhost/provider.php?url=http://localhost/dict.php?dbname=russian-hebrew-2006-11-08_luna&cp=cp1251&word=" + lemma;

Узнать список имён словарей DICT можно по команде:
dict -DВот, что вылетело мне в ответ на эту команду:
Databases available:
fd-eng-rus     English-Russian Freedict dictionary
temp           unknown
german_rus2    german_rus2
russian-hebrew-2006-11-08_luna russian-hebrew-2006-11-08_luna
Russian-Hebrew_Phrase_book Russian-Hebrew_Phrase_book
Hebrew-Russian Hebrew-Russian
Russian-Hebrew Russian-Hebrew

Поскольку перед данной статьёй не стоит задача создать профессиональный HTML-словарь, а всего лишь продемонстрировать основные возможности данной методики, то я сейчас не буду пытаться создать такое HTML-приложение, которое автоматически войдет в процесс конфигурирования и само создаст список со всеми доступными словарями. Этот список я создам самостоятельно. Итак, вот, что после недолгих раздумий получилось у меня:

Можно посмотреть видеоролик, который демонстрирует работу этого HTML-кода, или опробовать Он-Лайн версию этого словаря. См. также мою статью "HTML-словарь с функцией лемматизации".

Комментарии (2)

0
Гость - 7 Март, 2011 - 16:32

Почему ты не сказал что надо bison установить и flex?

0
Michael72 - 7 Март, 2011 - 21:15
Изображение пользователя Michael72.

Большое спасибо за комментарий. Сам я собрал RML давно, поэтому в журнале Терминала уже нет возможности посмотреть, какие действия мне пришлось делать при сборке. А инструкцию readme перевести с английского не умею. В ближайшее время подправлю статью с учётом этого замечания. Все ваши замечания и плюсики весьма дороги для меня, поскольку представляют собой источник вдохновения.

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры