Один узел может иметь более двух детей в дереве синтаксического анализа, полученном из анализатора Стэнфорда, например, englishPCFG.ser.gz Как получить двоичное дерево разбора с информацией по пометке POS на каждом узле? Есть ли какие-либо параметры, которые должны быть заполнены в синтаксический анализатор для достижения этого?Как получить бинаризованный синтаксический анализ из Stanford Parser?
1
A
ответ
0
Деревья не являются строго двоично-ветвящимися, потому что древесный банк Пенна, на котором тренировался парсер, не является. Это теоретическая проблема с (теперь древним) древовидным древом, которая продолжает бить вычислительных лингвистов!
Способ, которым я имел дело с этим, заключается в написании сложной логики преобразования дерева, которая реструктурирует результат анализатора элементов в виде двоично-ветвящихся структур, используя теоретические представления X-bar - в процессе, способствующем функциональному прогнозы по лексическим фразам, повышение кванторов и т. д.
[Обновить] Я пробовал класс TreeBinarizer. Он работал хорошо на одном примере, который я использовал. Я разбираю испанский язык и использую Clojure. Вот пример сеанса:
user=> (import edu.stanford.nlp.parser.lexparser.TreeBinarizer)
edu.stanford.nlp.parser.lexparser.TreeBinarizer
user=> (import edu.stanford.nlp.trees.international.spanish.SpanishTreebankLanguagePack)
edu.stanford.nlp.trees.international.spanish.SpanishTreebankLanguagePack
user=> (import edu.stanford.nlp.trees.international.spanish.SpanishHeadFinder)
edu.stanford.nlp.trees.international.spanish.SpanishHeadFinder
user=> ; I have a parsed tree:
user=> (.pennPrint t)
(sp
(prep (sp000 a))
(S
(infinitiu (vmn0000 decir))
(S
(conj (cs que))
(grup.verb (vaip000 hemos) (vmp0000 visto))
(sn
(spec (di0000 un))
(grup.nom (nc0s000 relámpago))))))
nil
user=> ; let's create a binarizer
user=> (def tb (TreeBinarizer/simpleTreeBinarizer (SpanishHeadFinder.) (SpanishTreebankLanguagePack.)))
#'user/tb
user=> ; now transform the tree above -- note that the second embedded S node has three children
user=> (.pennPrint (.transformTree tb t))
(sp
(prep (sp000 a))
(S
(infinitiu (vmn0000 decir))
(S
(conj (cs que))
(@S
(grup.verb (vaip000 hemos) (vmp0000 visto))
(sn
(spec (di0000 un))
(grup.nom (nc0s000 relámpago)))))))
nil
user=> ; the binarizer created an intermediate phrasal node @S, pushing the conjuction into <Spec, @S>
На самом деле есть класс в CoreNLP набор, который, как это предлагается по комментариям в коде, реструктурирует дерево, как голова дополняют бинарные узлы: https: // GitHub. com/stanfordnlp/CoreNLP/blob/master/src/edu/stanford/nlp/parser/lexparser/TreeBinarizer.java Я еще не пробовал. –
Спасибо! Я сделал это, как было предложено в комментарии, в другом вопросе http://stackoverflow.com/questions/36941881/how-to-parse-sentence-that-is-multilingual/36999618?noredirect1_comment61556189_36999618 – Matthew
Хорошо, я попробовал TreeBinarizer, и он работает - по крайней мере, на одном примере, который я пробовал :) –