- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个严重的问题:我已经下载了最新版本的 NLTK我得到了一个奇怪的 POS 输出:
import nltk
import re
sample_text="start please with me"
tokenized = nltk.sent_tokenize(sample_text)
for i in tokenized:
words=nltk.word_tokenize(i)
tagged=nltk.pos_tag(words)
chunkGram=r"""Chank___Start:{<VB|VBZ>*} """
chunkParser=nltk.RegexpParser(chunkGram)
chunked=chunkParser.parse(tagged)
print(chunked)
[输出]:
(S start/JJ please/NN with/IN me/PRP)
我不知道为什么“start”被标记为
JJ
和“请”为NN
?
最佳答案
默认的 NLTK pos_tag
已经以某种方式了解到 please
是一个名词。在正确的英语中,这几乎在任何情况下都是不正确的,例如
>>> from nltk import pos_tag
>>> pos_tag('Please go away !'.split())
[('Please', 'NNP'), ('go', 'VB'), ('away', 'RB'), ('!', '.')]
>>> pos_tag('Please'.split())
[('Please', 'VB')]
>>> pos_tag('please'.split())
[('please', 'NN')]
>>> pos_tag('please !'.split())
[('please', 'NN'), ('!', '.')]
>>> pos_tag('Please !'.split())
[('Please', 'NN'), ('!', '.')]
>>> pos_tag('Would you please go away ?'.split())
[('Would', 'MD'), ('you', 'PRP'), ('please', 'VB'), ('go', 'VB'), ('away', 'RB'), ('?', '.')]
>>> pos_tag('Would you please go away !'.split())
[('Would', 'MD'), ('you', 'PRP'), ('please', 'VB'), ('go', 'VB'), ('away', 'RB'), ('!', '.')]
>>> pos_tag('Please go away ?'.split())
[('Please', 'NNP'), ('go', 'VB'), ('away', 'RB'), ('?', '.')]
以WordNet为基准,不应该出现please
是名词的情况。
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('please')
[Synset('please.v.01'), Synset('please.v.02'), Synset('please.v.03'), Synset('please.r.01')]
但我认为这很大程度上是由于用于训练PerceptronTagger
的文本造成的。而不是标记器本身的实现。
现在,我们来看看预训练的 PerceptronTragger
里面有什么,我们发现它只知道 1500 多个单词:
>>> from nltk import PerceptronTagger
>>> tagger = PerceptronTagger()
>>> tagger.tagdict['I']
'PRP'
>>> tagger.tagdict['You']
'PRP'
>>> tagger.tagdict['start']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'start'
>>> tagger.tagdict['Start']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Start'
>>> tagger.tagdict['please']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'please'
>>> tagger.tagdict['Please']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Please'
>>> len(tagger.tagdict)
1549
你可以做的一个技巧是破解标记器:
>>> tagger.tagdict['start'] = 'VB'
>>> tagger.tagdict['please'] = 'VB'
>>> tagger.tag('please start with me'.split())
[('please', 'VB'), ('start', 'VB'), ('with', 'IN'), ('me', 'PRP')]
但最合乎逻辑的做法是简单地重新训练标记器,请参阅 http://www.nltk.org/_modules/nltk/tag/perceptron.html#PerceptronTagger.train
<小时/>如果您不想重新训练标注器,请参阅 Python NLTK pos_tag not returning the correct part-of-speech tag
最有可能的是,使用 StanfordPOSTagger
可以满足您的需求:
>>> from nltk import StanfordPOSTagger
>>> sjar = '/home/alvas/stanford-postagger/stanford-postagger.jar'
>>> m = '/home/alvas/stanford-postagger/models/english-left3words-distsim.tagger'
>>> spos_tag = StanfordPOSTagger(m, sjar)
>>> spos_tag.tag('Please go away !'.split())
[(u'Please', u'VB'), (u'go', u'VB'), (u'away', u'RB'), (u'!', u'.')]
>>> spos_tag.tag('Please'.split())
[(u'Please', u'VB')]
>>> spos_tag.tag('Please !'.split())
[(u'Please', u'VB'), (u'!', u'.')]
>>> spos_tag.tag('please !'.split())
[(u'please', u'VB'), (u'!', u'.')]
>>> spos_tag.tag('please'.split())
[(u'please', u'VB')]
>>> spos_tag.tag('Would you please go away !'.split())
[(u'Would', u'MD'), (u'you', u'PRP'), (u'please', u'VB'), (u'go', u'VB'), (u'away', u'RB'), (u'!', u'.')]
>>> spos_tag.tag('Would you please go away ?'.split())
[(u'Would', u'MD'), (u'you', u'PRP'), (u'please', u'VB'), (u'go', u'VB'), (u'away', u'RB'), (u'?', u'.')]
对于 Linux:请参阅 https://gist.github.com/alvations/e1df0ba227e542955a8a
对于 Windows:请参阅 https://gist.github.com/alvations/0ed8641d7d2e1941b9f9
关于python - 为什么NLTK中的pos_tag将 "please"标记为NN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35737099/
我正在尝试在 NLTK 中使用语音标记并使用了以下命令: >>> text = nltk.word_tokenize("And now for something completely differe
使用 pos_tag 后我必须遵循以下结果: list = [('a',` '1'), ('b', '2'), ('c', '3'), ('d', '4')] 现在,我必须像下面这样重建: a b c
这个问题在这里已经有了答案: wordnet lemmatization and pos tagging in python (8 个答案) 关闭 7 年前。 我构建了一个纯文本语料库,下一步是对我
这个问题在这里已经有了答案: How to extract nouns using NLTK pos_tag()? (4 个答案) 关闭 4 年前。 我正在尝试使用 nltk.pos_tag() 从
我希望能够以这种方式一个接一个地获取句子的 POS-Tags: def __remove_stop_words(self, tokenized_text, stop_words): sente
nltk.pos_tag() 是如何工作的?它是否涉及任何语料库的使用?我找到了一个源代码(nltk.tag - NLTK 3.0 文档),上面写着 _POS_TAGGER = 'taggers/ma
有这个: text = word_tokenize("The quick brown fox jumps over the lazy dog") 并运行: nltk.pos_tag(text) 我明白
我用过这个代码: # Step 1 : TOKENIZE from nltk.tokenize import * words = word_tokenize(text) # Step 2 : POS
我正在为任何将创建的输入文本创建一个Python模板 每个单词的 XML 条目及其所属的 POS(词性)。 我使用 nltk 中的 pos_tag,但是当我获取单词并尝试对其进行标记时,它会标记每个字
我一直在试图弄清楚如何使用词性标记的“标记”结果。目前我有这个测试代码: 当我运行它时,它会返回以下内容: 这一切都很好。但我希望能够使用这个结果,但我不知道如何使用。如何检查“test”变量是否包含
我正在尝试对以下文本进行 pos_tag: text = """5.1 Basic Wage: £350.00 per week payable by monthly instalments in a
我有这段代码可以在句子中查找名词和动词。 # -*- coding: utf-8 -*- from nltk.corpus import wordnet as wn from nltk import
我是 python 的新手。我无法找出错误。我想使用 NLTK 提取名词。 我写了下面的代码: import nltk sentence = "At eight o'clock on Thursday
所以我试图在列表中标记一堆单词(确切地说是词性标记),如下所示: pos = [nltk.pos_tag(i,tagset='universal') for i in lw] 其中 lw 是单词列表(
这里我有一个 Pandas Dataframe,其中包含包含文本的“body”列。 body 0 David Beckham's dreams of kick starting
我正在尝试使用 nltk 中的 ne_chunk 和 pos_tag 对句子进行分块。 from nltk import tag from nltk.tag import pos_tag from n
我需要对多种语言的文本进行名称实体提取:西类牙语、葡萄牙语、希腊语、捷克语、中文。 是否有这两个功能的所有支持语言的列表?是否有使用其他语料库的方法,以便可以包含这些语言? 最佳答案 默认情况下,这两
我有一个使用 NLTK 查找名词和动词的代码。 from nltk.corpus import wordnet as wn from nltk import pos_tag import nltk s
我有一个句子列表列表,用单词标记,然后进行 pos 标记,所以结果显然是一个包含元素的列表: [(w1,pos_tag1)(w2,pos_tag2)] [(w3,pos_tag3),(w4,pos_t
嗨文本挖掘冠军, 我在 Windows 10 上使用带有 NLTK v3.2 的 Anaconda。(客户端环境) 当我尝试使用 POS 标记时,我不断收到 URLLIB2 错误: URLError:
我是一名优秀的程序员,十分优秀!