【问题标题】:NLTK Thinks that Imperatives are NounsNLTK 认为命令式是名词
【发布时间】:2012-03-13 10:44:42
【问题描述】:

我在食谱上使用 pos_tagger。我遇到的一个问题是 pos_tagger 返回命令式中的单词是名词,它们不应该是动词吗? 例如:

输入:

combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder

输出是:

[('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',',      ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')]

这是我为此使用的代码:

    def part_of_speech(self,input_sentance):
        text = nltk.word_tokenize(input_sentance)
        return nltk.pos_tag(text)

不应该将“组合”标记为某种动词吗?这是nltk的错吗?还是我做错了什么?

【问题讨论】:

  • 您能告诉我们您目前使用什么代码来生成上述内容吗?
  • 虽然我对 nltk 一无所知,但一个不寻常的巧合是,本周一年一度的 NFL Scouting Combine 将在印第安纳波利斯举行,其中“combine”用作名词。

标签: python nltk


【解决方案1】:

试试Stanford POS tagger

我的运气更好。与默认的 NLTK 标注器相比,它已使用更多命令式句子进行训练。

也停靠在cuzzo/stanford-pos-tagger

例如

Follow us on Instagram
VB PRP IN NN

【讨论】:

  • 如何将 NLTK 标记器换成斯坦福的?
【解决方案2】:
>>> from nltk import pos_tag, word_tokenize
>>> def imperative_pos_tag(sent):
...     return pos_tag(['He']+sent)[1:]
... 
>>> sent1 = 'combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder'

>>> imperative_pos_tag(word_tokenize(sent1))
[('combine', 'VBD'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',', ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')]

另外,看看Python NLTK pos_tag not returning the correct part-of-speech tagNLTK identifies verb as Noun in Imperatives

【讨论】:

    【解决方案3】:

    对命令式语料库进行培训将是最佳选择。但是,如果您没有时间或认为付出的努力不值得,这里有一个简单的解决方案(更像是一个 hack):只需在每个句子前加上一个像“他们”这样的代词(你确定这是必要的) )。现在 nltk 使用默认标记器做得很好。

    【讨论】:

      【解决方案4】:

      您看到的是传统统计自然语言处理 (NLP) 中非常常见的问题。简而言之,您使用标记器的数据看起来不像是训练过的数据。 NLTK 没有记录细节,但据我所知,默认标记器是在华尔街日报文章、布朗语料库或两者的某种组合上训练的。这些语料库只包含很少的命令式,所以当你给它带有命令式的数据时,它不会做正确的事情。

      一个好的长期解决方案是纠正大量食谱的标签并在纠正后的数据上进行训练,这样可以解决训练和测试数据不匹配的问题。然而,这是一项巨大的工作。理想情况下,已经存在一个包含很多命令的语料库;我的研究小组对此进行了调查,但我们尚未找到合适的,尽管我们正在生产。

      我最近在一个需要正确理解命令式的项目中使用的一个更简单的解决方案是简单地记下你想要的命令式,并强制这些词的标签是正确的。

      所以在下面的例子中,我做了一个字典,说“组合”应该被视为动词,然后使用列表推导来更改标签。

      tagged_words = [('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')]
      force_tags = {'combine': 'VB'}
      new_tagged_words = [(word, force_tags.get(word, tag)) for word, tag in tagged_words]
      

      new_tagged_words 的内容现在具有原始标签,但在 force_tags 中有条目的地方发生了更改。

      >>> new_tagged_words
      [('combine', 'VB'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')]
      

      此解决方案确实需要您说出要强制动词使用的单词是什么。这远非理想,但没有更好的通用解决方案。

      【讨论】:

      • 我明白了。那么这是否意味着 POS 只是一个字符串匹配?还是我过于简单化了?
      • 标签通常至少考虑两种信息:标签之间的位置信息(即,名词跟在诸如“the”之类的限定词之后),以及关于每个单词可以采用的可能标签的信息(即, 'steer' 是动词或名词的频率)。在这种情况下,问题主要出在位置信息上,因为在训练数据中,句子几乎从不以动词开头。
      • 作为参考,我在使用 MatePosTagger 分析德语文本时遇到了同样的问题。
      【解决方案5】:

      “组合”到名词映射可能是因为它认为它是一个名词。以联合收割机为例。我的猜测是您应该为您的用例调整名词算法或更改/修改单词语料库。

      【讨论】:

      • 你是怎么做的?说到 NLTK,我完全是个菜鸟
      • 我有两本很棒的 nltk python 书。如果这对你来说是一件大事,那就让他们哈哈。否则,请提高您的赏金,我可能会为您编写一个示例。
      猜你喜欢
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      相关资源
      最近更新 更多