【问题标题】:ne_chunk without pos_tag in NLTKNLTK 中没有 pos_tag 的 ne_chunk
【发布时间】:2017-10-29 10:39:12
【问题描述】:

我正在尝试在 nltk 中使用 ne_chunk 和 pos_tag 对句子进行分块。

from nltk import tag
from nltk.tag import pos_tag
from nltk.tree import Tree
from nltk.chunk import ne_chunk

sentence = "Michael and John is reading a booklet in a library of Jakarta"
tagged_sent = pos_tag(sentence.split())

print_chunk = [chunk for chunk in ne_chunk(tagged_sent) if isinstance(chunk, Tree)]

print print_chunk

结果如下:

[Tree('GPE', [('Michael', 'NNP')]), Tree('PERSON', [('John', 'NNP')]), Tree('GPE', [('Jakarta', 'NNP')])]

我的问题,是否可以不包括 pos_tag(如上面的 NNP)而只包括 Tree 'GPE'、'PERSON'? “GPE”是什么意思?

提前致谢

【问题讨论】:

    标签: python tree tags nltk chunking


    【解决方案1】:

    命名实体分块器将为您提供一个包含块和标签的树。你不能改变它,但你可以把标签拿出来。从你的tagged_sent开始:

    chunks = nltk.ne_chunk(tagged_sent)
    simple = []
    for elt in chunks:
        if isinstance(elt, Tree):
            simple.append(Tree(elt.label(), [ word for word, tag in elt ]))
        else:
            simple.append( elt[0] )
    

    如果您只想要块,请省略上面的 else: 子句。您可以调整代码以任何您想要的方式包装块。我使用 nltk Tree 将更改保持在最低限度。请注意,某些块由多个单词组成(尝试在您的示例中添加“New York”),因此块的内容必须是一个列表,而不是单个元素。

    PS。 “GPE”代表“地缘政治实体”(显然是一个大块头的错误)。可以在nltk书here中看到“常用标签”的列表。

    【讨论】:

    • 感谢它的工作!但是我怎样才能训练一些特殊的NE?比如 Michael 必须是 'PERSON' 而不是 'GPE' 因为它是一个人名。
    • 阅读 nltk 书。如果您仍然想知道,那么在这里提出一个新问题。简短的回答,你可以添加一个人名字典来覆盖统计线索,但总的来说你无能为力。你试图手动修复太多,你破坏的比你修复的多。 (例如,“伊丽莎白”是新泽西州的人还是城市?。)
    【解决方案2】:

    很可能需要对https://stackoverflow.com/a/31838373/610569 上的代码稍作修改,并带有标签。

    是否可以不包括 pos_tag(如上面的 NNP)而只包括 Tree 'GPE'、'PERSON'?

    是的,只需遍历 Tree 对象 =) 见 How to Traverse an NLTK Tree object?

    >>> from nltk import Tree, pos_tag, ne_chunk
    >>> sentence = "Michael and John is reading a booklet in a library of Jakarta"
    >>> tagged_sent = ne_chunk(pos_tag(sentence.split()))
    >>> tagged_sent
    Tree('S', [Tree('GPE', [('Michael', 'NNP')]), ('and', 'CC'), Tree('PERSON', [('John', 'NNP')]), ('is', 'VBZ'), ('reading', 'VBG'), ('a', 'DT'), ('booklet', 'NN'), ('in', 'IN'), ('a', 'DT'), ('library', 'NN'), ('of', 'IN'), Tree('GPE', [('Jakarta', 'NNP')])])
    
    >>> from nltk.sem.relextract import NE_CLASSES
    >>> ace_tags = NE_CLASSES['ace']
    
    >>> for node in tagged_sent:
    ...     if type(node) == Tree and node.label() in ace_tags:
    ...         words, tags = zip(*node.leaves())
    ...         print node.label() + '\t' +  ' '.join(words)
    ... 
    GPE Michael
    PERSON  John
    GPE Jakarta
    

    “GPE”是什么意思?

    GPE 意为“地缘政治实体”

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 2018-11-18
      • 2014-10-24
      • 1970-01-01
      • 2018-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多