【问题标题】:POS tagging - NLTK thinks noun is adjective词性标注 - NLTK 认为名词是形容词
【发布时间】:2012-11-11 20:52:07
【问题描述】:

在下面的代码中,为什么 nltk 认为 'fish' 是形容词而不是名词?

>>> import nltk
>>> s = "a woman needs a man like a fish needs a bicycle"
>>> nltk.pos_tag(s.split())
[('a', 'DT'), ('woman', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('man', 'NN'), ('like', 'IN'), ('a', 'DT'), ('fish', 'JJ'), ('needs', 'NNS'), ('a', 'DT'), ('bicycle', 'NN')]

【问题讨论】:

标签: python nltk


【解决方案1】:

我不确定解决方法是什么,但您可以在此处查看源代码https://nltk.googlecode.com/svn/trunk/nltk/nltk/tag/

与此同时,我尝试了您的句子,但方法略有不同。

>>> s = "a woman needs a man. A fish needs a bicycle"
>>> nltk.pos_tag(s.split())
[('a', 'DT'), ('woman', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('man.', NP'), ('A','NNP'),   ('fish', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('bicycle', 'NN')]

这导致鱼为“NN”。

【讨论】:

  • 我认为这是因为短句通常会获得更高的准确性。
【解决方案2】:

如果您首先使用NLTK book, chapter 5 中描述的查找标记器(例如使用 WordNet 作为查找参考),您的标记器将已经“知道”fish 不能是形容词。对于具有多个可能 POS 标签的所有单词,您可以使用统计标记器作为退避标记器。

【讨论】:

  • 你能举一个你在答案末尾引用的统计标记器的例子吗?
  • NLTK 中的大多数词性标注器都使用单词/特征组合的统计信息。例如,TNTNaive Bayes
【解决方案3】:

这是因为您希望a woman needs a man like a fish needs a bicycle 为这样的“解析”获取 POS 标签:

[ [[a woman] needs [a man]] like [[a fish] needs [a bicycle]] ]

但是 NLTK 默认的 pos 标记器不够聪明,并为您提供了 POS 标记以进行此类解析:

[ [[a woman] needs [a man]] like [a fish needs] [a bicycle] ]

【讨论】:

    【解决方案4】:

    这取决于词性标注器是如何获得输入的。例如对于句子: “女人需要男人,就像鱼需要自行车一样”

    如果您使用默认的 nltk 词分词器和正则表达式分词器,则值将不同。

    import nltk 
    from nltk.tokenize import RegexpTokenizer
    
    TOKENIZER = RegexpTokenizer('(?u)\W+|\$[\d\.]+|\S+')
    
    s = "a woman needs a man like a fish needs a bicycle"
    
    regex_tokenize = TOKENIZER.tokenize(s)
    default_tokenize = nltk.word_tokenize(s)
    
    regex_tag = nltk.pos_tag(regex_tokenize)
    default_tag = nltk.pos_tag(default_tokenize)
    
    print regex_tag
    print "\n"
    print default_tag
    

    输出如下:

      Regex Tokenizer: 
    
    [('a', 'DT'), (' ', 'NN'), ('woman', 'NN'), (' ', ':'), ('needs', 'NNS'), (' ', 'VBP'), ('a', 'DT'), (' ', 'NN'), ('man', 'NN'), (' ', ':'), ('like', 'IN'), (' ', 'NN'), ('a', 'DT'), (' ', 'NN'), ('fish', 'NN'), (' ', ':'), ('needs', 'VBZ'), (' ', ':'), ('a', 'DT'), (' ', 'NN'), ('bicycle', 'NN')]
    
     Default Tokenizer: 
    
    [('a', 'DT'), ('woman', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('man', 'NN'), ('like', 'IN'), ('a', 'DT'), ('fish', 'JJ'), ('needs', 'NNS'), ('a', 'DT'), ('bicycle', 'NN')]
    

    在正则表达式分词器中,鱼是名词,而在默认分词器中,鱼是形容词。 根据使用的分词器,解析不同导致解析树结构不同。

    【讨论】:

      【解决方案5】:

      如果您使用 Stanford POS tagger (3.5.1),则该短语被正确标记:

      from nltk.tag.stanford import POSTagger
      st = POSTagger("/.../stanford-postagger-full-2015-01-30/models/english-left3words-distsim.tagger",
                     "/.../stanford-postagger-full-2015-01-30/stanford-postagger.jar")
      st.tag("a woman needs a man like a fish needs a bicycle".split())
      

      产量:

      [('a', 'DT'),
       ('woman', 'NN'),
       ('needs', 'VBZ'),
       ('a', 'DT'),
       ('man', 'NN'),
       ('like', 'IN'),
       ('a', 'DT'),
       ('fish', 'NN'),
       ('needs', 'VBZ'),
       ('a', 'DT'),
       ('bicycle', 'NN')]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 2013-07-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多