Open bzaar opened 3 years ago
Update: Пока пишу грамматику для генератора парсеров. Уже разбираются более 99% всех статей. Удобство этого подхода в том, что генератор может генерировать парсеры на разных языках программирования, включая Python, Java, C. Хотя «развертывание» все равно придется писать на каком-то конкретном языке.
Зачем?
Способ представления грамматической информации, придуманный Зализняком, очень удобен для лексикографов: простым индексом вроде «св 2а» мы можем описать 120 форм глагола.
Но для автоматической обработки нужен более простой формат, содержащий как можно меньше исключений. Например, словарь OpenCorpora можно скачать в одном из двух форматов, текстовый и XML:
Мне лично симпатичен формат YAML, в котором ту же самую информацию можно представить гораздо проще:
По выразительной силе YAML сопоставим с JSON: в нем есть списки и объекты (aka массивы пар ключ-значение).
Задача
Нужно написать программу-конвертер из формата Зализняка в развернутый формат. Под «развернутым» имеется в виду, что словоформы выписаны явно. Так, например, из статьи
Иван мо 1а
получается вот такая портянка:Как превращать
Иван мо 1а
в портянки («строить все грамматические формы»), описано здесь:Как построить нужные формы слова
Данные, которые нужно преобразовать, находятся в данном репозитории, в каталоге dictionary.
Вот еще примеры, которые можно использовать как тесты для такого конвертера (TDD, да!):
https://gist.github.com/bzaar/9a75502bc9d6a4928a25aee51a355ffb
Формат этого файла:
И дальше все повторяется.
Конвертер желательно написать на C# (F#), так как предполагается встроить его в бэкенд сайта gramdict.ru, который написан на C#.
Среди настроек конвертера должна быть опция «ставить ударения». Если она отключена, то ударения не ставятся и варианты, различающиеся только ударением, объединяются в одну форму: кра́сно и красно́ → красно, собра́лись и собрали́сь → собрались.
Подробности устройства «развернутого» формата
Формы Р2 и П2 не указываются, если они равны Р и П соответственно. (См. Пометы Р2 и П2) Примеры, где эти формы нужны: дуб, кофеёк.
Форма сравнительной степени прилагательных (тег «сравн») указывается только одна. Остальные формы могут быть построены по следующему незамысловатому правилу:
Например, из темнее получается: темнее, темней, потемнее, потемней. Из тише только две формы (потому что тише не оканчивается на -ее) — тише, потише.
Все буквы в YAML — русские, чтобы не возникало сомнений: если видим, например, букву Р, то знаем, что она русская, а не латинская.