当前位置: 首页 > 面试题库 >

Python NLTK pos_tag未返回正确的词性标签

许涵容
2023-03-14
问题内容

有这个:

text = word_tokenize("The quick brown fox jumps over the lazy dog")

并运行:

nltk.pos_tag(text)

我得到:

[('The', 'DT'), ('quick', 'NN'), ('brown', 'NN'), ('fox', 'NN'), ('jumps', 'NNS'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'NN'), ('dog', 'NN')]

这是不正确的。quick brown lazy句子中的标签应为:

('quick', 'JJ'), ('brown', 'JJ') , ('lazy', 'JJ')

通过他们的在线工具测试得出相同的结果。quickbrown并且fox应该是形容词而不是名词。


问题答案:

简而言之

NLTK并不完美。实际上,没有任何模型是完美的。

注意:

从NLTK版本3.1开始,默认pos_tag功能不再是旧的MaxEnt English pickle。

现在它是 感知恶搞 从@
Honnibal的实现
,见nltk.tag.pos_tag

>>> import inspect
>>> print inspect.getsource(pos_tag)
def pos_tag(tokens, tagset=None):
    tagger = PerceptronTagger()
    return _pos_tag(tokens, tagset, tagger)

还是更好,但并不完美:

>>> from nltk import pos_tag
>>> pos_tag("The quick brown fox jumps over the lazy dog".split())
[('The', 'DT'), ('quick', 'JJ'), ('brown', 'NN'), ('fox', 'NN'), ('jumps', 'VBZ'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN')]

在某些时候,如果有人想要TL;DR解决方案,请参见https://github.com/alvations/nltk_cli

总而言之

尝试使用其他标记器(请参阅
https://github.com/nltk/nltk/tree/develop/nltk/tag
),例如

  • Hanbao
    Stanford POS
    Senna leaf

使用NLTK的默认MaxEnt POS标记器,即nltk.pos_tag

>>> from nltk import word_tokenize, pos_tag
>>> text = "The quick brown fox jumps over the lazy dog"
>>> pos_tag(word_tokenize(text))
[('The', 'DT'), ('quick', 'NN'), ('brown', 'NN'), ('fox', 'NN'), ('jumps', 'NNS'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'NN'), ('dog', 'NN')]

使用斯坦福POS标记器

$ cd ~
$ wget http://nlp.stanford.edu/software/stanford-postagger-2015-04-20.zip
$ unzip stanford-postagger-2015-04-20.zip
$ mv stanford-postagger-2015-04-20 stanford-postagger
$ python
>>> from os.path import expanduser
>>> home = expanduser("~")
>>> from nltk.tag.stanford import POSTagger
>>> _path_to_model = home + '/stanford-postagger/models/english-bidirectional-distsim.tagger'
>>> _path_to_jar = home + '/stanford-postagger/stanford-postagger.jar'
>>> st = POSTagger(path_to_model=_path_to_model, path_to_jar=_path_to_jar)
>>> text = "The quick brown fox jumps over the lazy dog"
>>> st.tag(text.split())
[(u'The', u'DT'), (u'quick', u'JJ'), (u'brown', u'JJ'), (u'fox', u'NN'), (u'jumps', u'VBZ'), (u'over', u'IN'), (u'the', u'DT'), (u'lazy', u'JJ'), (u'dog', u'NN')]

使用HunPOS (注意:默认编码为ISO-8859-1而不是UTF8):

$ cd ~
$ wget https://hunpos.googlecode.com/files/hunpos-1.0-linux.tgz
$ tar zxvf hunpos-1.0-linux.tgz
$ wget https://hunpos.googlecode.com/files/en_wsj.model.gz
$ gzip -d en_wsj.model.gz 
$ mv en_wsj.model hunpos-1.0-linux/
$ python
>>> from os.path import expanduser
>>> home = expanduser("~")
>>> from nltk.tag.hunpos import HunposTagger
>>> _path_to_bin = home + '/hunpos-1.0-linux/hunpos-tag'
>>> _path_to_model = home + '/hunpos-1.0-linux/en_wsj.model'
>>> ht = HunposTagger(path_to_model=_path_to_model, path_to_bin=_path_to_bin)
>>> text = "The quick brown fox jumps over the lazy dog"
>>> ht.tag(text.split())
[('The', 'DT'), ('quick', 'JJ'), ('brown', 'JJ'), ('fox', 'NN'), ('jumps', 'NNS'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN')]

使用Senna (请确保您拥有最新版本的NLTK,并对API进行了一些更改):

$ cd ~
$ wget http://ronan.collobert.com/senna/senna-v3.0.tgz
$ tar zxvf senna-v3.0.tgz
$ python
>>> from os.path import expanduser
>>> home = expanduser("~")
>>> from nltk.tag.senna import SennaTagger
>>> st = SennaTagger(home+'/senna')
>>> text = "The quick brown fox jumps over the lazy dog"
>>> st.tag(text.split())
[('The', u'DT'), ('quick', u'JJ'), ('brown', u'JJ'), ('fox', u'NN'), ('jumps', u'VBZ'), ('over', u'IN'), ('the', u'DT'), ('lazy', u'JJ'), ('dog', u'NN')]

或者尝试构建更好的POS标记器

  • Ngram Tagger:http://streamhacker.com/2008/11/03/part-of-speech-tagging-with-nltk-part-1/
  • Affix / Regex Tagger:http://streamhacker.com/2008/11/10/part-of-speech-tagging-with-nltk-part-2/
  • 构建自己的Brill(阅读代码,这是一个非常有趣的标记器,http: //www.nltk.org/_modules/nltk/tag/brill.html ),请参阅http://streamhacker.com/2008/12/03/使用nltk-part-3进行语音标记的部分/
  • Perceptron Tagger:https://honnibal.wordpress.com/2013/09/11/a-good-part-of-speechpos-tagger-in-about-200-lines-of-python/
  • LDA Tagger:http://scm.io/blog/hack/2015/02/lda-intentions/


 类似资料:
  • 我很清楚关于这个话题有多个问题,但我就是弄不懂它的意思。问题似乎是没有将新值添加到@cacheable列表中。 调试完问题后,我发现问题似乎出在钥匙上。 下面是代码片段 所以当我调用save方法时,用于缓存的关键字是incrementing integer,或者1,2,3...但是当我尝试获取所有文档时,缓存使用SimpleKey[]作为键。如果我尝试为@Cacheable使用相同的键,我会得到S

  • 我是PHP库phpQuery内容解析器的忠实粉丝(因为它很像jQuery,同时使用PHP DOMDocument提取标记),但我注意到快速关闭事件 和< code>phpQuery中。 我编写了一个简单的类PhpContentDocument来转储一个简单的html文档。 结果如你所料... 但是当使用saveHTML调用文档时 它返回... 我遇到的主要问题是,当我在元素上使用简单XML元素时(

  • 我们有一个关于MySQL中返回错误整数值的函数的问题。我们已经检查了“booked_passeters”是否包含正确的值0,并且当移除该变量时,它可以正常工作,也就是说只返回整数40。但是,当我们试图从它中减去“booked_passeters”(最终仍应返回40)时,它就不起作用了。 包括下面的代码。 提前道谢!:-)

  • 我有一个测试类包含测试方法和两个服务类和。我正在为类中的方法编写JUnit测试,该类包括对类方法的调用。在我写的测试方法中 因此,当调用时,它应该返回大小为1,但不返回此列表,返回的是一个大小为0的列表。

  • 我目前正在为一个即将开始的项目制作自己的关卡创建器(地图)。一切都很好,除了我在添加放大和缩小选项时遇到了一个问题。我有一个处理所有输入和渲染的类,因为我才刚刚开始。 如您所见,此类扩展了InputAdapter并实现了Application ationListener。 照相机是正字法照相机。cameraHelper是我做的一个助手类。我把摄像机的位置设在这里。cameraHelper.setP

  • 以下是我的疑问.... 我没有结果。 另外,我正在使用这个插件来生成请求正文。 我的查询如下所示.. null 感谢您到目前为止的阅读,如果有人能帮助我找出如何使这一工作,我将非常感谢。