由于你标记了这个nltk,让我们使用NLTK的树解析器来处理你的树.我们将在每棵树上阅读,然后简单地打印出树叶.完成.
>>> text ="(CLAUSE (NP Jack/NNP) (VP stayed/VBD) (NP in/IN London/NNP))"
>>> tree = nltk.Tree.fromstring(text, read_leaf=lambda x: x.split("/")[0])
>>> print(tree.leaves())
['Jack', 'stayed', 'in', 'London']
lambda表单拆分每个单词/标签对并丢弃标签,只保留单词.
多棵树
我知道,你会问我如何处理整个文件的价值这些树,其中一些需要不止一行.这是NLTK的BracketParseCorpusReader的工作,但它希望终端的形式(POS字)而不是字/ POS.我不会这样做,因为它更容易欺骗Tree.fromstring()来读取你所有的树,就像它们是一棵树的分支一样:
allmytext = """
(CLAUSE (NP Jack/NNP) (VP loved/VBD) (NP Peter/NNP))
(CLAUSE (NP Jack/NNP) (VP stayed/VBD) (NP in/IN London/NNP))
(CLAUSE (NP Tom/NNP) (VP is/VBZ) (NP in/IN Kolkata/NNP))
"""
wrapped = "(ROOT "+ allmytext + " )" # Add a "root" node at the top
trees = nltk.Tree.fromstring(wrapped, read_leaf=lambda x: x.split("/")[0])
for tree in trees:
print(tree.leaves())
如您所见,唯一的区别是我们在文件内容周围添加了“(ROOT”和“)”,并使用for循环生成输出.循环为我们提供了顶级节点的子节点,即实际的树.