绘制带有NP块的扁平化NLTK解析树

3

我想使用NLTK来分析句子并将它们的块显示为一棵树。NLTK提供了tree.draw()方法来绘制树形图。下面的代码绘制了一个关于句子"the little yellow dog barked at the cat"的树形图:

import nltk 
sentence = [("the", "DT"), ("little", "JJ"), ("yellow", "JJ"), ("dog", "NN"), ("barked","VBD"), ("at", "IN"), ("the", "DT"), ("cat", "NN")]

pattern = "NP: {<DT>?<JJ>*<NN>}"
NPChunker = nltk.RegexpParser(pattern) 
result = NPChunker.parse(sentence)
result.draw()

结果是这棵树:

示例树

我如何获得一个多一层的树类似于这样?

更深的树


@alvas,你为什么把标题改成“Flatten”?我认为OP的问题不是关于压平的——两个示例中树的分支是相同的。相反,OP正在询问PoS标签的单独级别(顺便说一下:不仅适用于非NP词...)。 - lenz
@lenz,因为很可能这是他需要的。因为他使用的NP模式是人们用于术语提取、名词/实体提取等的模式。而.draw()纯粹是展示,所以它不会改变解析结果太多=)只是为了再次确认,@raxer,这是你要问的吗? - alvas
@alvas,我的目标是有另一个演示文稿。以“黄色”为例,它的词性标注是JJ。在第一张图片中,JJ与“黄色”处于同一层级。但在第二张图片中,“JJ”在“黄色”上方一层。我该如何像第二张图片那样显示它? - raxer
2个回答

4

你需要提高非专有名词的表达水平,以下是一个技巧:

import nltk 
sentence = [("the", "DT"), ("little", "JJ"), ("yellow", "JJ"), ("dog", "NN"), ("barked","VBD"), ("at", "IN"), ("the", "DT"), ("cat", "NN")]

pattern = """NP: {<DT>?<JJ>*<NN>}
VBD: {<VBD>}
IN: {<IN>}"""
NPChunker = nltk.RegexpParser(pattern) 
result = NPChunker.parse(sentence)
result.draw()

[out]:

在此输入图片描述



这是一张图片,无法直接翻译。

0

我知道回答有点晚了。但是这就是我是如何做到的。 思路是你需要将你的句子转换成一棵树。

import nltk
sentence = list(map(lambda sent: Tree(sent[1], children=[sent[0]]), sentence))

那你可以在之后进行分块。

NPChunker = nltk.RegexpParser(pattern) 
result = NPChunker.parse(sentence)
result.draw()

这是我的结果

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接