Bottomup парсер на чистом питоне

Oct 19, 2019 16:01

Раз в два-три года я пробую делать какой-то новый парсер для русского языка. Последний раз это была неудачная попытка прикрутить reinforcement learning для shift-reduce парсера, обучаемого на корпусе эталонных разборов.

В этот раз за полтора месяца сделан прототип восходящего вероятностного парсера на чистом питоне.

Морфология - внешняя сменяемая, сейчас это pymorphy2. К ней у меня масса претензий, так что видимо буду менять на свою оптимизированную ruword2tags. Чтобы было веселее, токенизация тоже вероятностная, поэтому парсер может попутно убирать лишние разрывы слов или слившиеся слова, работая еще и как spellchecker. Впрочем, для эффективной обработки длинных предложений в чатботе надо будет перед парсером делать частеречную разметку и снимать все морфологические неоднозначности.

Правила разбора задаются в текстовом файле, например так:

# ЗЛАЯ СОБАКА ЛАЕТ
# ^^^^^^^^^^^
NP('прил + сущ') ~1.2 ->
a=AP[case] # так как сущ. может быть в локативе или партитиве, то наружу вытолкнем падеж прилагательного
+ n=NP[number, gender, 3per, gen_slot]
agr: adj_n(a, n)
;

По задумке веса правил будут автоматически подбираться по эталонному tree bank'у с помощью какой-то реализации expectation-maximization алгоритма.

Результаты выглядят так (спасибо питоновской обертке для Graphviz за чудеса автоматической отрисовки графов).
Иерархия составляющих:


Дерево зависимостей:


bottomup parser, синтаксис, dependency parser, синтаксический разбор, парсер, синтаксический анализатор, восходящий разбор, glr

Previous post Next post
Up