Hunspell
Среда, 18 декабря 2013

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

← Словарь словоформ русского языкаМузыка по воскресеньям — 16 →

Хочется что-то добавить или сказать? Я всегда рад обсудить. Пишите на me@dikmax.name.