2014-11-21 3 views
0

Я хочу упростить свои деревья деревьев синтаксического анализа, т. Е. Учитывая узел, я избавляюсь от первого дефиса и всего, что приходит после этого дефиса. Например, если узел NP-TMP-FG, я хочу сделать его NP, и если это SBAR-SBJ, я хочу сделать его SBAR и так далее. Это пример одного дерева разбора, которое у меня естьКак перебирать все узлы дерева?

((S (S-TPC-2 (NP-SBJ (NP (DT The) (NN asbestos) (NN fiber)) (, ,) 
(NP (NN crocidolite)) (, ,)) (VP (VBZ is) (ADJP-PRD (RB unusually) (JJ resilient)) 
(SBAR-TMP (IN once) (S (NP-SBJ (PRP it)) (VP (VBZ enters) (NP (DT the) (NNS lungs))))) 
(, ,) (PP (IN with)(S-NOM (NP-SBJ (NP (RB even) (JJ brief) (NNS exposures)) (PP (TO to) 
(NP (PRP it)))) (VP (VBG causing) (NP (NP (NNS symptoms)) (SBAR (WHNP-1 (WDT that)) 
(S (NP-SBJ (-NONE- *T*-1)) (VP (VBP show) (PRT (RP up)) (ADVP-TMP (NP (NNS decades)) 
(JJ later))))))))))) (, ,) (NP-SBJ (NNS researchers)) (VP (VBD said)(SBAR (-NONE- 0) 
(S (-NONE- *T*-2)))) (. .))) 

Это мой код, но он не работает.

import re 
import nltk 
from nltk.tree import * 
tree = Tree.fromstring(line) // Each parse tree is stored in one single line 
for subtree in tree.subtrees(): 
    re.sub('-.*', '', subtree.label()) 
print tree 

Edit:

Я думаю, проблема в том, что subtree.label() показывает узлы, но он не может быть изменен, так как она является функцией. Выход печати subtree.label() является:

S 
S-TPC-2 
NP-SBJ 
NP 
DT 
NN 
, 

и так далее ...

ответ

1

Я придумал это:

for subtree in tree.subtrees(): 
    s = subtree.label() 
    subtree.set_label(re.sub('-.*', "", s)) 
3

Вы можете сделать что-то подобное:

for subtree in tree.subtrees(): 
    first = subtree.label().split('-')[0] 
    subtree.set_label(first) 
Смежные вопросы