【问题标题】:Drawing a flatten NLTK Parse Tree with NP chunks使用 NP 块绘制扁平的 NLTK 解析树
【发布时间】:2015-08-11 07:46:49
【问题描述】:

我想用 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”?我不会说 OPs 的问题是关于扁平化的——在两个例子中树的分支是相同的。相反,OP 要求为 PoS 标签设置一个单独的级别(顺便说一句:不仅适用于非 NP 词......)。
  • @lenz,因为很可能这就是他所需要的。因为他使用的 NP 模式是人们对术语提取、名词/实体提取等所做的事情。.draw() 纯粹是呈现,所以它不会改变很多解析结果 =) 只是为了仔细检查,@ raxer,这就是你要的吗?
  • @alvas,我的目标是再做一次演示。以黄色这个词为例。它有 pos 标签JJ。在第一张图片中,JJ 与黄色位于同一层。但是在第二张图片上JJ 在黄色这个词上面有一层。我怎样才能在第二张图片上显示它?

标签: python tree nlp draw nltk


【解决方案1】:

你需要“升级”你的非 NP 词,这里有一个技巧:

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()

[出]:


【讨论】:

    【解决方案2】:

    我知道现在回答为时已晚。但这是我的做法。 这个想法是你需要将你的句子转换成一棵树。

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

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

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

    这是我的结果Tree

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 2019-12-09
      • 2018-07-10
      • 1970-01-01
      相关资源
      最近更新 更多