自然语言处理 |结合 NGram 标记器
NgramTagger 有 3 个子类
- 一元标记器
- BigramTagger
- 三元标记
BigramTagger 子类使用前一个标签作为其上下文的一部分
TrigramTagger 子类使用前两个标签作为其上下文的一部分。
ngram – 它是 n 个项目的子序列。
NgramTagger 子类的想法:
- 通过查看之前的单词和词性标签,可以猜出当前单词的词性标签。
- 每个标注器都维护一个上下文字典(ContextTagger父类用来实现它)。
- 该字典用于根据上下文猜测该标签。
- 在 NgramTagger 子类的情况下,上下文是一些先前标记的单词。
代码 #1:Bigram 标记器的工作
# Loading Libraries
from nltk.tag import DefaultTagger
from nltk.tag import BigramTagger
from nltk.corpus import treebank
# initializing training and testing set
train_data = treebank.tagged_sents()[:3000]
test_data = treebank.tagged_sents()[3000:]
# Tagging
tag1 = BigramTagger(train_data)
# Evaluation
tag1.evaluate(test_data)
输出 :
0.11318799913662854
代码 #2:Trigram 标注器的工作
# Loading Libraries
from nltk.tag import DefaultTagger
from nltk.tag import TrigramTagger
from nltk.corpus import treebank
# initializing training and testing set
train_data = treebank.tagged_sents()[:3000]
test_data = treebank.tagged_sents()[3000:]
# Tagging
tag1 = TrigramTagger(train_data)
# Evaluation
tag1.evaluate(test_data)
输出 :
0.06876753723289446
代码#3:共同使用 Unigram、Bigram 和 Trigram 标注器。
# Loading Libraries
from nltk.tag import TrigramTagger
from tag_util import backoff_tagger
from nltk.corpus import treebank
# initializing training and testing set
train_data = treebank.tagged_sents()[:3000]
test_data = treebank.tagged_sents()[3000:]
backoff = DefaultTagger('NN')
tag = backoff_tagger(train_sents,
[UnigramTagger, BigramTagger, TrigramTagger],
backoff = backoff)
tag.evaluate(test_sents)
输出 :
0.8806820634578028
这个怎么运作 ?
- backoff_tagger函数创建每个标注器类的实例。
- 它提供了先前的标记器和 train_sents 作为退避。
- 标注器类的顺序很重要:在上面的代码中,第一个类是 UnigramTagger,因此,它将首先被训练并给出初始的退避标注器(DefaultTagger)。
- 然后这个标注器成为下一个标注器类的退避标注器。
- 返回的最终标注器将是最后一个标注器类的实例——TrigramTagger 。
代码#4:证明
print (tagger._taggers[-1] == backoff)
print ("\n", isinstance(tagger._taggers[0], TrigramTagger))
print ("\n", isinstance(tagger._taggers[1], BigramTagger))
输出 :
True
True
True