2016-07-25 2 views
0

Я использую SCP, чтобы получить синтаксический анализ дерева CFG для английских предложений.Использование Stanford CoreNLP Python Parser для конкретного вывода

from corenlp import * 
corenlp = StanfordCoreNLP() 
corenlp.parse("Every cat loves a dog") 

Мой ожидаемый выход дерева, как это:

(S (NP (DET Every) (NN cat)) (VP (VT loves) (NP (DET a) (NN dog)))) 

Но что я получил это:

(ROOT (S (NP (DT Every) (NN cat)) (VP (VBZ loves) (NP (DT a) (NN dog))))) 

Как изменить POS тег, как и ожидалось, и удалить узел ROOT?

Благодаря

+0

Откуда вы получаете ожидаемый результат? Теги POS не являются тегами [Penn Treebank] (http://www.comp.leeds.ac.uk/ccalas/tagsets/upenn.html), которые анализирует CoreNLP. –

ответ

1

Вы можете использовать nltk.tree модуль из NLTK.

from nltk.tree import * 

def traverse(t): 
    try: 
     # Replace Labels 
     if t.label() == "DT": 
      t.set_label("DET") 
     elif t.label() == "VBZ": 
      t.set_label("VT") 
    except AttributeError: 
     return 

    for child in t: 
     traverse(child) 

output_tree= "(ROOT (S (NP (DT Every) (NN cat)) (VP (VBZ loves) (NP (DT a) (NN dog)))))" 
tree = ParentedTree.fromstring(output_tree) 

# Remove ROOT Element 
if tree.label() == "ROOT": 
    tree = tree[0] 

traverse(tree) 
print tree 
# (S (NP (DET Every) (NN cat)) (VP (VT loves) (NP (DET a) (NN dog)))) 
+0

Спасибо, но как преобразовать вывод дерева в обычную строку (строка из 1 строки)? У меня есть дерево с многострочными и много избыточным пространством ... Спасибо! – suckerlynch

+0

Конечный вывод «print tree» выводится только в одной строке. вы можете проверить - new_tree = str (дерево); ИЛИ вы также можете использовать new_tree = re.sub ("[\ s] +", "", str (дерево)); – RAVI

Смежные вопросы