Я продолжаю разбираться со словарём словоформ (морфологический словарь, 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.