Я продолжаю разбираться со словарём словоформ (морфологический словарь, spellcheck). Полтора года лежал и всё было замечательно, а тут столько всего и сразу.
Разбирательство началось с того, что в результирующем файле я не обнаружил слова «ниже», а закончилось перечитыванием документации по формату файлов hunspell и переписыванием ядра конвертера.
Словарь прирос на 4,5 Мб и ≈166000 словоформ. Можно скачивать, он определённо стал лучше, и теперь в нём есть слова «ниже» и «пониже».
- Скачать russian.diс.tar.bz2 (6 Мб)
- Скачать russian.dic.zip (6,7 Мб)
Ну и вкратце расскажу про сам формат 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 низкий #низкий --> ниже (ср.ст)
Итак, у нас есть много строчек с правилами, которые нужно применить. Блоки в правиле разделяются пробелами. Список блоков:
- SFX для суффикса и PFX для префикса.
- Имя аффикса.
- Что искать.
- На что заменять.
- Условие в виде регулярного выражения, когда можно применить это правило.
- (Опционально)
#
+ комментарий
Т. е. мы просто проходимся по всем правилам, проверяем условия и заменяем одну подстроку на другую.
Иногда в четвёртом блоке может встречаться ещё названия аффиксов. Это означает, что эти аффиксы тоже можно применить. В нашем случае это:
PFX Ss 0 по- . #приставка "по-" для наречий
PFX Sr 0 по . #приставка "по"
0
означает, что ничего удалять не надо, будем только добавлять.
Ликбез завершён. Возможно потом, если будет желание или потребность, добавлю поддержку других опций, которыми изобилуют файлы аффиксов для проверки других языков. Ну и буду продолжать поддерживать словарь русского языка, пока в этом есть необходимость.
UPD 22 декабря 2013: Словарь обновлён.
Хочется что-то добавить или сказать? Я всегда рад обсудить. Пишите на me@dikmax.name.