Как сгладить дерево разбора и сохранить его в строку для дальнейших строковых операций python nltk
Я пытаюсь получить плоское дерево из древовидной структуры, как показано ниже.
Я хочу получить все это дерево в виде строки, как без ошибки Bad tree обнаружено:
( (S (NP-SBJ (NP (DT The) (JJ high) (JJ seven-day) )(PP (IN of) (NP (DT the) (CD 400) (NNS money) )))(VP (VBD was) (NP-PRD (CD 8.12) (NN %) )(, ,) (ADVP (RB down) (PP (IN from) (NP (CD 8.14) (NN %) ))))(. .) ))
3 ответа
Вы можете преобразовать дерево в строку, используя функцию str, затем разделить и объединить следующим образом:
parse_string = ' '.join(str(tree).split())
print parse_string
Python nltk предоставляет функцию для манипулирования деревом и извлечения узлов
from nltk.tree import Tree
for tr in trees:
tr1 = str(tr)
s1 = Tree.fromstring(tr1)
s2 = s1.productions()
Документация предоставляет pprint()
метод, который выравнивает дерево в одну строку.
Разбор этого предложения:
string = "My name is Ross and I am cool. What's going on world? I'm looking for friends."
А потом звоню pprint()
дает следующее:
u"(NP+SBAR+S\n (S\n (NP (PRP$ my) (NN name))\n (VP\n (VBZ is)\n (NP (NNP Ross) (CC and) (PRP I) (JJ am) (NN cool.))\n (SBAR\n (WHNP (WP What))\n (S+VP (VBZ 's) (VBG going) (NP (IN on) (NN world)))))\n (. ?))\n (S\n (NP (PRP I))\n (VP (VBP 'm) (VBG looking) (PP (IN for) (NP (NNS friends))))\n (. .)))"
С этого момента, если вы хотите удалить вкладки и новые строки, вы можете использовать следующие split
а также join
(см. здесь):
splitted = tree.pprint().split()
flat_tree = ' '.join(splitted)
Выполнение этого дает мне это:
u"(NP+SBAR+S (S (NP (PRP$ my) (NN name)) (VP (VBZ is) (NP (NNP Ross) (CC and) (PRP I) (JJ am) (NN cool.)) (SBAR (WHNP (WP What)) (S+VP (VBZ 's) (VBG going) (NP (IN on) (NN world))))) (. ?)) (S (NP (PRP I)) (VP (VBP 'm) (VBG looking) (PP (IN for) (NP (NNS friends)))) (. .)))"
NLTK предоставляет функциональные возможности для этого прямо сейчас:
flat_tree = tree._pformat_flat("", "()", False)
tree.pprint()
и
str(tree)
оба вызовут этот метод внутри себя, но при необходимости добавят дополнительную логику, чтобы разделить его на несколько строк.