вторник, 2 июня 2015 г.

Aspell. Как получить список "всех" слов русского языка.

Иногда возникает необходимость получить список всех слов русского (или какого-нибудь другого) языка. На помощь может прийти утилита aspell (основное предназначение которой - исправлять ошибки при наборе текста). Например, у меня на ноутбуке стоит Ubuntu, нужно поставить пакеты aspell и aspell-ru для русских словарей. В Windows я использовал Cygwin, хотя скорей всего можно и просто под Windows собрать.

Чтобы увидеть список всех словоформ из словаря Aspell нужно выполнить такую команду:

aspell -l ru dump master | aspell -l ru expand > russianwords.txt

В файле russianwords.txt мы увидим вот такую простыню текста:

обезличение обезличением обезличением обезличению обезличении обезличения
обезличенный обезличенные обезличенных обезличенным обезличенными обезличенная обезличенною обезличенное обезличенного обезличенной обезличенном обезличенному обезличенную обезличен обезличена обезличена обезличено обезличено обезличены обезличены обезличенна обезличенно обезличенны
обезличенность обезличенностью обезличенности
обезличивание обезличиванием обезличиванием обезличиванию обезличивании обезличивания


На самом деле как правило каждой строке словоформы одного и того же слова, причём первый вариант (первое слово в строке) содержит словарную форму, а дальше идут изменения. Это наводит на мысль использовать файл для приведения слов к словарной форме.
Но, к сожалению, картина проста лишь в первом приближении. Посмотрим на формы слова "британец"

...
британцем
британцев
британец британцах британцами британцам британцы британце британцу британца

...

Мы видим, что слово "британец" породило формы "британцах", "британцами" и.т.д., а слова "британцем", "британцев" и "британца" стоят отдельно. То есть с точки зрения словаря aspell слова "британцев" и "британцем" рассматриваются не как формы слова "британец", а как отдельные независимые слова! Что ж, для основной цели aspell, исправления опечаток, это совершенно некритично. Но если мы хотим приводить словоформу "к основной" форме, например, для полнотекстового индексирования/поиска, то для этих слов такой механизм будет работать недостаточно хорошо.

Команда aspell -l ru dump master  выводит словарь в неразвёрнутом формате.
В этом "неразвёрнутом" словаре изменение слова британец определяется таким правилом:

британец/O
...
британцев
британцем

...

Правило /O сформулировано примерно таким образом: если слово заканчивается на "ец", откусить "ец", и добавлять "цах", "цами" и.т.д. для образования форм "британцах", "британцами"...

Со словом "испанец" та же ситуация:

...
испанец/O
...
испанцев
испанцем

...

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

конец/O
...
концов
...
концом


Изменение слова "Данаиды" тоже регулируется правилом "/O".

Данаиды/O

В общем, aspell - отличный инструмент со своими ограничениями, о котором стоит знать. Он может помочь при решении многих задач обработки текста.