Hunspell

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

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

Словарь прирос на 4,5 Мб и ≈166000 словоформ. Можно скачивать, он определённо стал лучше, и теперь в нём есть слова «ниже» и «пониже».

Ну и вкратце расскажу про сам формат hunspell. Рассказывать буду на примере того, как выглядит словарь, который мне пришлось разбирать, т. к. вообще-то могут быть некоторые девиации. У меня не было цели написать полный конвертер для всех языков и словарей.

Словарь hunspell состоит из двух файлов: словаря (.dic) и аффиксов, т. е. префиксов или суффиксов (.aff). В собственно словаре (.dic) содержатся слова в начальной форме и список правил для аффиксов, которые к этому слову применяются. Например:

низкий/CCCDCo

Тут у нас три двухбуквенных аффикса: CC, CD и Co. Дальше смотрим в файл аффиксов, чтобы понять, что все это значит. Тут я приведу только кусочек, связанный с нашим словом «низкий».

SFX CC ий ого [гкх]ий #низкий --> низкого (е.ч.м.р.р.п.)
SFX CC ий ому/Ss [гкх]ий #низкий --> низкому (е.ч.м.р.д.п.)
SFX CC ий им ий #низкий --> низким (е.ч.м.р.т.п. и мн.ч.о.р.д.п.)
SFX CC ий ом [гкх]ий #низкий --> низком (е.ч.м.р.п.п.)
SFX CC ий ая [гкхжчшщ]ий #низкий --> низкая (е.ч.ж.р.и.п.)
SFX CC ий ой [гкх]ий #низкий --> низкой (е.ч.ж.р.р.п.+д.п.+т1.п.+п.п.)
SFX CC ий ую [гкхжчшщ]ий #низкий --> низкую (е.ч.ж.р.в.п.)
SFX CC ий ою [гкх]ий #низкий --> низкою (е.ч.ж.р.т2.п.)
SFX CC ий ое [гкх]ий #низкий --> низкое (е.ч.с.р.и.п.)
SFX CC ий ие ий #низкий --> низкие (мн.ч.о.р.и.п.)
SFX CC ий их ий #низкий --> низких (мн.ч.о.р.р.п.+п.п.)
SFX CC ий ими ий #низкий --> низкми (мн.ч.о.р.т.п.)

SFX CD кий ок [^аеиоуыэюяжчшщйь]кий #низкий --> низок (кр.ф.е.ч.м.р.)
SFX CD ий а [^нраеиоуыэюя]ий #низкий --> низка (кр.ф.е.ч.ж.р.)
SFX CD ий о [^нржчшщаеиоуыэюя]ий #низкий --> низко (кр.ф.е.ч.с.р.)
SFX CD ий и ий #низкий --> низки (кр.ф.мн.ч.о.р.)

SFX Co зкий же/Sr низкий #низкий --> ниже (ср.ст)

Итак, у нас есть много строчек с правилами, которые нужно применить. Блоки в правиле разделяются пробелами. Список блоков:

  1. SFX для суффикса и PFX для префикса.
  2. Имя аффикса.
  3. Что искать.
  4. На что заменять.
  5. Условие в виде регулярного выражения, когда можно применить это правило.
  6. (Опционально) # + комментарий

Т. е. мы просто проходимся по всем правилам, проверяем условия и заменяем одну подстроку на другую.

Иногда в четвёртом блоке может встречаться ещё названия аффиксов. Это означает, что эти аффиксы тоже можно применить. В нашем случае это:

PFX Ss 0 по- . #приставка "по-" для наречий

PFX Sr 0 по . #приставка "по"

0 означает, что ничего удалять не надо, будем только добавлять.

Ликбез завершён. Возможно потом, если будет желание или потребность, добавлю поддержку других опций, которыми изобилуют файлы аффиксов для проверки других языков. Ну и буду продолжать поддерживать словарь русского языка, пока в этом есть необходимость.

UPD 22 декабря 2013: Словарь обновлён.

Словарь словоформ русского языка

Прошло полтора года с момента публикации предыдущей версии словаря. Но я про него не забыл: попробуй забыть одну из самых популярных записей, если судить по Google Analytics. И периодически я поглядывал на страницу проекта hunspell-ru в надежде увидеть там обновления, а их всё не было.

Но недавно новая версия таки была выпущена. Плюс к этому я переписал старый код конвертера из Hunspell в plain text. Старый код был написан на PHP в незапамятные времена. Разве можно было пройти мимо и оставить его таким как есть, а не переписать на каком-нибудь новом модном языке, например на Dart?

Нажимаем на одну из ссылок ниже и скачиваем архив. В архиве лежит единственный текстовый файл russian.dic, в котором перечислено большое количество русских слов во всех возможных формах, по одному слову в каждой строчке. Общее количество слов — 173975, словоформ — 2376434.

Дальше используете файл на своё усмотрение. Например, можно подключить его в качестве словаря в PhpStorm, IntelliJ IDEA или Eclipse.

Настройка PhpStorm

Знаю-знаю, писать комментарии к коду на русском языке не комильфо. Но ведь в IDE можно писать не только код. Я, например, пишу тексты для этого блога в PhpStorm (исходники блога на GitHub). Да и мало ли может быть применений! Но должен предупредить: файл словаря имеет размер 53 Мб, что не слишком благоприятно сказывается на объёме используемой IDE памяти.

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

UPD 18 декабря 2013: Словарь обновлён.
UPD 22 декабря 2013: Словарь обновлён.

Словарь словоформ русского языка

Этот пост устарел. Новая версия — тут

Обновил свой словарь для проверки русских слов в IntelliJ IDEA, PhpStorm, Eclipse и др. Должен подойти к любой программе, которая для проверки правописания использует файл со списком слов по одному в строке.

Всего в словаре 48 Мб и 2174526 словоформ, поэтому не удивляйтесь, когда IDE начнет есть больше памяти.

Исходный словарь в формате hunspell можно взять тут, скрипт для конвертирования на github.