?

Log in

No account? Create an account

Компьютерная лингвистика

Новостная лента www.solarix.ru

Previous Entry Share Flag Next Entry
Bottomup парсер на чистом питоне
kelijah
Раз в два-три года я пробую делать какой-то новый парсер для русского языка. Последний раз это была неудачная попытка прикрутить 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 за чудеса автоматической отрисовки графов).
Иерархия составляющих:

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





  • 1
кстати, а пробовали сделать Earley с ленивым построением дерева/сверткой дерева в граф (чтобы оно не настолько экспоненциально было)? или GLR для свертки в граф удобнее?

вроде бы есть yargy, но не факт что там есть оптимизации имени Joop Leo/Guido Minnen et al

Edited at 2019-10-22 03:50 am (UTC)

кстати, а пробовали сделать Earley с ленивым построением дерева/сверткой дерева в граф (чтобы оно не настолько экспоненциально было)? или GLR для свертки в граф удобнее?


Я в этом же коде забабахал еще и нисходящий алгоритм Эрли, но очень тупо, depth-first. Тормозит, зараза, на длинных предложениях :( Надо будет потом подумать насчет breath-first спуска.


  • 1