-
【说话处理惩罚与Python】5.4主动标注
添加时间:2013-5-26 点击量:在这里有不合的体式格式来给文本主动添加词性标识表记标帜。
一个词的标识表记标帜,要依附于这个词和它在句子中的高低文。
所以:我们将处理惩罚句子层次而不是词汇层次的数据。
下面的所有代码示例中都以这些代码为根蒂根基:
>>> nltk.corpusimport brown
>>>brown_tagged_sents= brown.tagged_sents(categories=news)
>>>brown_sents= brown.sents(categories=news)
默认标注器
#把最有可能的标识表记标帜进行标注
tags=[tag for (word,tag) in brown.tagged_words(categories=’news’)]
nltk.FreqDist(tags).max()
‘NN’
#如今应用将所有词都标注成NN的标注器
>>>raw = I donot like greeneggs and ham,I donot like them SamI am!
>>>tokens = nltk.word_tokenize(raw)
>>>default_tagger =nltk.DefaultTagger(NN)
>>>default_tagger.tag(tokens)
[(I, NN), (do, NN), (not, NN), (like, NN), (green, NN),
(eggs, NN), (and, NN), (ham, NN), (,, NN), (I, NN),
(do, NN), (not, NN), (like, NN), (them, NN), (Sam, NN),
(I, NN), (am, NN), (!, NN)]
其实,大师也有感触感染,这种体式格式并不会很好,可以经由过程下面这个函数,测评一下标注的成果。
>>>default_tagger.evaluate(brown_tagged_sents)
0.13089484257215028
正则表达式标注器
>>>patterns= [
... (r.ing¥, VBG), #gerunds
... (r.ed¥, VBD), #simple past
... (r.es¥, VBZ), #3rdsingular present
... (r.ould¥, MD), #modals
... (r.\s¥, NN¥), #possessivenouns
... (r.s¥, NNS), #plural nouns
... (r^-?[0-9]+(.[0-9]+)?¥, CD), #cardinal numbers
... (r., NN) #nouns(default)
... ]
#不过要重视,正则表达式是按次序匹配的,匹配上第一个后面的就不会在匹配
>>>regex p_tagger = nltk.RegexpTagger(patterns)
>>>regex p_tagger.tag(brown_sents[3])
[(``, NN), (Only, NN), (a, NN), (relative, NN), (handful, NN),
(of, NN), (such, NN), (reports, NNS), (was, NNS), (received, VBD),
("", NN), (,, NN), (the, NN), (jury, NN), (said, NN), (,, NN),
(``, NN), (considering, VBG), (the, NN), (widespread, NN), ...]
#经由过程检测,这种体式格式正确率进步了
>>>regex p_tagger.evaluate(brown_tagged_sents)
0.20326391789486245
查询标注器
#找出100个最频繁的词,存储他们最有可能的标识表记标帜。
#然后应用这些信息作为查询标注器的模型
fd=nltk.FreqDist(brown.words(categories=news))
cfd=nltk.ConditionalFreqDist(brown.tagged_words(categories=news))
most_freq_words=fd.keys()[:100]
likely_tags=dict((word,word,cfd[word].max()) for word in most_freq_words)
baseline_tagger=nltk.UnigramTagger(model=likely_tags)
baseline_tagger.evaluate(brown_tagged_sents)
经由过程对这个标注器进行评价,可以看到评价的成果,正确率又提拔了:0.45578495136941344
若是我们拿这个标注器在一些未标注的文本长进行标注,会呈现一些None的标签,这是因为它们不再100个最频繁的词汇傍边。
#在如许的景象下,我们可以应用 回退,当查询标注器无法工作的时辰,回退到另一个标注器进行工作。
>>>baseline_tagger =nltk.UnigramTagger(model=likely_tags,
... backoff=nltk.DefaultTagger(NN))