【问题标题】:Finding Proper Nouns using NLTK WordNet使用 NLTK WordNet 查找专有名词
【发布时间】:2013-07-14 05:52:43
【问题描述】:

有没有办法使用 NLTK WordNet 找到专有名词?即,我可以使用 nltk Wordnet 标记所有格名词吗?

【问题讨论】:

    标签: python nltk wordnet


    【解决方案1】:

    我认为您不需要 WordNet 来查找专有名词,我建议使用词性标注器 pos_tag

    要查找专有名词,请查找NNP 标签:

    from nltk.tag import pos_tag
    
    sentence = "Michael Jackson likes to eat at McDonalds"
    tagged_sent = pos_tag(sentence.split())
    # [('Michael', 'NNP'), ('Jackson', 'NNP'), ('likes', 'VBZ'), ('to', 'TO'), ('eat', 'VB'), ('at', 'IN'), ('McDonalds', 'NNP')]
    
    propernouns = [word for word,pos in tagged_sent if pos == 'NNP']
    # ['Michael','Jackson', 'McDonalds']
    

    您可能不太满意,因为MichaelJackson 被拆分为 2 个标记,那么您可能需要更复杂的东西,例如名称实体标记器。

    正如penntreebank 标签集所记录的那样,对于所有格名词,您可以简单地查找POS 标签http://www.mozart-oz.org/mogul/doc/lager/brill-tagger/penn.html。但是当它是NNP 时,标记器通常不会标记POS

    要查找所有格名词,请查找 str.endswith("'s") 或 str.endswith("s'"):

    from nltk.tag import pos_tag
    
    sentence = "Michael Jackson took Daniel Jackson's hamburger and Agnes' fries"
    tagged_sent = pos_tag(sentence.split())
    # [('Michael', 'NNP'), ('Jackson', 'NNP'), ('took', 'VBD'), ('Daniel', 'NNP'), ("Jackson's", 'NNP'), ('hamburger', 'NN'), ('and', 'CC'), ("Agnes'", 'NNP'), ('fries', 'NNS')]
    
    possessives = [word for word in sentence if word.endswith("'s") or word.endswith("s'")]
    # ["Jackson's", "Agnes'"]
    

    或者,您可以使用 NLTK ne_chunk,但除非您担心从句子中得到什么样的专有名词,否则它似乎并没有多大作用:

    >>> from nltk.tree import Tree; from nltk.chunk import ne_chunk
    >>> [chunk for chunk in ne_chunk(tagged_sent) if isinstance(chunk, Tree)]
    [Tree('PERSON', [('Michael', 'NNP')]), Tree('PERSON', [('Jackson', 'NNP')]), Tree('PERSON', [('Daniel', 'NNP')])]
    >>> [i[0] for i in list(chain(*[chunk.leaves() for chunk in ne_chunk(tagged_sent) if isinstance(chunk, Tree)]))]
    ['Michael', 'Jackson', 'Daniel']
    

    使用ne_chunk 有点冗长,它不会让你掌握所有格。

    【讨论】:

    • 感谢您提供此解决方案,我去年 11 月将其作为控制台脚本实现 - github.com/dereckson/extract-proper-nouns - 并成功导入了小​​说中的专有名称列表。
    • 很高兴答案有帮助,很高兴看到您为尝试执行相同任务的其他人提供现成的解决方案 =)
    • 是否可以使用 nltk 从一些 非结构化 文本中提取专有名词,例如日志文件,其中专有名词带有 混合大小写,文本是语法不完全正确?谢谢
    • @user2436428 并非如此,但尝试并没有什么坏处。有不恰当的专有名词有点讽刺。你需要的是更像命名实体识别的东西,见stackoverflow.com/questions/34439208/…
    • @alvas nltk 要求我执行 nltk.download() 以使用它。但它给出错误 HTTP 405 Not allowed?
    【解决方案2】:

    我认为你需要的是一个标注器,一个词性标注器。此工具为句子中的每个单词分配一个词性标签(例如专有名词、所有格代词等)。

    NLTK 包括一些标记器: http://nltk.org/book/ch05.html

    还有Stanford Part-Of-Speech Tagger(也是开源的,性能更好)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 2015-09-10
      • 2016-03-31
      相关资源
      最近更新 更多