2016-05-03 1 views
1

Один узел может иметь более двух детей в дереве синтаксического анализа, полученном из анализатора Стэнфорда, например, englishPCFG.ser.gz Как получить двоичное дерево разбора с информацией по пометке POS на каждом узле? Есть ли какие-либо параметры, которые должны быть заполнены в синтаксический анализатор для достижения этого?Как получить бинаризованный синтаксический анализ из Stanford Parser?

ответ

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> 
+0

На самом деле есть класс в CoreNLP набор, который, как это предлагается по комментариям в коде, реструктурирует дерево, как голова дополняют бинарные узлы: https: // GitHub. com/stanfordnlp/CoreNLP/blob/master/src/edu/stanford/nlp/parser/lexparser/TreeBinarizer.java Я еще не пробовал. –

+0

Спасибо! Я сделал это, как было предложено в комментарии, в другом вопросе http://stackoverflow.com/questions/36941881/how-to-parse-sentence-that-is-multilingual/36999618?noredirect1_comment61556189_36999618 – Matthew

+0

Хорошо, я попробовал TreeBinarizer, и он работает - по крайней мере, на одном примере, который я пробовал :) –