- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
有这个:
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')
通过他们的online tool 进行测试给出相同的结果; quick
、brown
和 fox
应该是形容词而不是名词。
最佳答案
简而言之:
NLTK is not perfect. In fact, no model is perfect.
注意:
从 NLTK 3.1 版开始,默认的 pos_tag
函数不再是 old MaxEnt English pickle .
现在是 @Honnibal's implementation 中的 感知器标记器 ,见 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),例如:
使用来自 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')]
使用斯坦福词性标注器:
$ 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_tag
在 stackoverflow 上的准确性包括:
关于 NLTK HunPos 的问题包括:
NLTK 和斯坦福词性标注器的问题包括:
关于Python NLTK pos_tag 未返回正确的词性标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30821188/
我正在使用 SpaCy 进行文本分析,但我无法理解词性 (POS) 和句法依赖分析之间的区别。两者都根据单词的作用在句子中标记单词。但它们究竟有何不同? 最佳答案 我们使用词性标注来标记句子中的标记,
我正在使用 SpaCy 进行文本分析,但我无法理解词性 (POS) 和句法依赖分析之间的区别。两者都根据单词的作用在句子中标记单词。但它们究竟有何不同? 最佳答案 我们使用词性标注来标记句子中的标记,
我正在使用 openNLP 来标记 POS(词性)。 InputStream inputStream = new FileInputStream("C:/en-pos-max
抱歉,我是 Pandas 和 NLTK 的新手。我正在尝试构建一组自定义返回的 POS。我的数据内容: comment 0 [(have, VERB), (you, PRO
我正在尝试执行词性标记,并且我对任何基于 Java 的标记器持开放态度(当前使用 OpenNLP)。有没有办法“强制”标记器将特定术语(或单词组合)识别为特定标签,并据此对其他术语进行分类?有点允许标
我想将 nltk.pos_tag 返回的词性 (POS) 用于 sklearn 分类器,如何将它们转换为向量并使用它?例如 sent = "这是 POS 示例" tok=nltk.tokenize.w
我是一名优秀的程序员,十分优秀!