Xpoint
   [напомнить пароль]

Работа с русской морфологией при помощи словаря ispell

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

Ispell — программа проверки орфографии для платформы Unix. В своей работе она использует словари в определённом формате. Этот формат несложен, и словари вполне могут использоваться и сами по себе, помимо программы ispell. Наиболее известным (и полным) ispell-словарём является словарь, составленный Александром Лебедевым (http://scon155.phys.msu.su/~swan/). Последнюю версию словаря можно скачать с сайта автора: http://scon155.phys.msu.su/~swan/orthography.html.

В архиве содержатся файлы словарей различных тематик с именами вида base.koi, computer.koi и т.п., а также файл правил преобразования слов russian.aff.koi. Как видно из имён файлов, их кодировка — КОИ-8.

Файлы словарей состоят из записей вида:

...
винчестер/K
вокодер/K
восьмеричный/A
гигабайт/K
гиперсвязь/N
гипертекстовый/A
градиентный/A
графопостроитель/K
...

Записи в файле правил имеют вид:

flag *N:
#
# Третье склонение: существительные ж.р. на -ь
#
    Ь    >  -Ь,И    # степь > степи (р.п.)
    Ь    >  Ю    # степь > степью (т.п.)
    Ь    >  -Ь,ЕЙ    # степь > степей (мн,р.п.)
    [ЖЧШЩ] Ь  >  -Ь,АМ    # ночь > ночам (мн,д.п.)
    [^ЖЧШЩ] Ь  >  -Ь,ЯМ    # степь > степям (мн,д.п.)
    [ЖЧШЩ] Ь  >  -Ь,АМИ    # ночь > ночами (мн,т.п.)
    [^ЖЧШЩ] Ь  >  -Ь,ЯМИ    # степь > степями (мн,т.п.)
...

Формат файла словаря очевиден — исходная форма + флаг, указывающий как именно данное слово изменяется. В файле правил для каждого из таких флагов расписаны варианты преобразований в следующем формате:

окончание_слова > (-что_заменять,) [чем_заменять|-]

"Окончание_слова" имеет формат, похожий на формат регулярных выражений — в нём используются группировки [...] и [^...]. Т.е. [ЖЧШЩ] Ь означает, что последняя буква слова — мягкий знак, а предпоследняя — Ж, Ч, Ш или Щ. [^ЖЧШЩ] Ь означает, что последняя буква слова — мягкий знак, а предпоследняя — не Ж, Ч, Ш или Щ.

В частности, в приведённом выше отрывке словаря мы видим слово "гиперсвязь". Оно преобразуется согласно флагу N. Для исходной формы подходят следующие правила (из вышеперечисленных):

Ь    >  -Ь,И            # степь > степи (р.п.)
Ь    >  Ю               # степь > степью (т.п.)
Ь    >  -Ь,ЕЙ           # степь > степей (мн,р.п.)
[^ЖЧШЩ] Ь  >  -Ь,ЯМ     # степь > степям (мн,д.п.)
[^ЖЧШЩ] Ь  >  -Ь,ЯМИ    # степь > степями (мн,т.п.)

Значит, возможные словоформы слова "гиперсвязь" следующие:

гиперсвязи
гиперсвязью
гиперсвязей
гиперсвязям
гиперсвязями

Таким образом можно построить словоформы для любого слова из словаря.

Поиск основной формы слова без словаря

Файл правил преобразования слов позволяет реализовать и ещё одну интересную функцию — поиск основной формы слова. Интересно тут то, что слово не обязано быть в словаре! Аналогичную функциональность имеет, например, Яндекс:

Алгоритмы морфологического анализа и синтеза, основанные на базовом словаре, умеют нормализовать слова, то есть находить их начальную форму, а также строить гипотезы для слов, не содержащихся в базовом словаре.
http://company.yandex.ru/technology/programs_tech.xml

Принцип тут примерно тот же, по которому действует наш мозг при анализе фраз типа «глокая куздра будланула бокра…». Слова «будланула» в русском языке нет, но любой русскоговорящий человек без труда восстановит его исходную форму — «будлануть».

Для нахождения вариантов исходной формы произвольного слова следует перебрать все возможные окончания словоформ в списке правил. Например, у нас есть слово "кракозяблами". Окончание подходит под следующие правила ispell-а:

[^ЕЙОЬ]  >  АМИ         # дом > домами (мн,т.п.)
[ЖЦШЩ] Е  >  -Е,АМИ     # жилище > жилищами (мн,т.п.)
О    >  -О,АМИ          # облако > облаками (мн,т.п.)
[ЖЧШЩ] Ь  >  -Ь,АМИ     # ночь > ночами (мн,т.п.)
[^Ь]  >  АМИ            # голос > голосами (мн,т.п.)
Е Л    >  -ЕЛ,ЛАМИ      # дятел > дятлами (мн,т.п.)
[^АБДЕИЛНОРСТЬ] И  >  -И,АМИ    # щи > щами (т.п.)
Ы    >  -Ы,АМИ          # бусы > бусами (т.п.)
... и т.д.

Отсюда получаем возможные исходные формы слова:

[^ЕЙОЬ]  >  кракозябл
[ЖЦШЩ] Е  >  кракозябле *
О    >  кракозябло
[ЖЧШЩ] Ь  >  кракозябль *
[^Ь]  >  кракозябл
Е Л    >  кракозябел
[^АБДЕИЛНОРСТЬ] И  >  кракозябли *
Ы    >  кракозяблы
...

Однако варианты, отмеченные звёздочками, не подходят по шаблонам окончания слов. Значит, в качестве возможных исходных форм слова остаются только:

кракозябл
кракозябло
кракозябел
кракозяблы
...

Разумеется, при подобном анализе произвольного слова, не все варианты исходных форм будут правильными. Но поскольку в реальных документах могут встретиться только словоформы правильных вариантов, то неправильные варианты не дадут никакого вклада в результат поиска.

Powered by POEM™ Engine Copyright © 2002-2005