📅  最后修改于: 2020-10-14 09:21:56             🧑  作者: Mango
顾名思义,unigram标记器是一种仅使用单个单词作为其上下文来确定POS(词性)标记的标记器。简单来说,Unigram Tagger是基于上下文的标记器,其上下文是单个单词,即Unigram。
NLTK为此提供了一个名为UnigramTagger的模块。但是在深入研究其工作原理之前,让我们借助下图了解层次结构-
从上图可以看出, UnigramTagger继承自NgramTagger ,后者是ContextTagger的子类, NgramTagger继承自SequentialBackoffTagger 。
借助以下步骤来解释UnigramTagger的工作-
如我们所见, UnigramTagger继承自ContextTagger ,它实现了context()方法。此context()方法采用与choose_tag()方法相同的三个参数。
context()方法的结果将是令牌词,该词将进一步用于创建模型。创建模型后,单词令牌也将用于查找最佳标签。
这样, UnigramTagger将从标记语句列表中构建上下文模型。
NLTK的UnigramTagger可以通过在初始化时提供带有标记语句的列表来进行训练。在下面的示例中,我们将使用树库语料库的标记句子。我们将使用该语料库中的前2500个句子。
首先从nltk导入UniframTagger模块-
from nltk.tag import UnigramTagger
接下来,导入要使用的语料库。这里我们正在使用树库语料库-
from nltk.corpus import treebank
现在,以句子为训练目的。我们正在为训练目的使用前2500个句子,并将其标记为-
train_sentences = treebank.tagged_sents()[:2500]
接下来,将UnigramTagger应用于训练目的的句子-
Uni_tagger = UnigramTagger(train_sentences)
取一些句子,它们等于或小于用于培训目的的句子,即2500,用于测试目的。在这里,我们先拿1500进行测试-
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sents)
0.8942306156033808
在这里,使用单字查找来确定POS标签的标记器的准确性约为89%。
from nltk.tag import UnigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Uni_tagger = UnigramTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)
0.8942306156033808
从上图显示UnigramTagger的层次结构,我们知道所有从ContextTagger继承的标记器都可以采用预先构建的模型,而不是训练它们自己的标记器。这个预先建立的模型只是将上下文键映射到标签的Python字典。对于UnigramTagger ,上下文键是单个单词,而对于其他NgramTagger子类,它将是元组。
我们可以通过将另一个简单模型传递给UnigramTagger类而不是传递训练集来覆盖此上下文模型。让我们借助下面的简单示例来理解它-
from nltk.tag import UnigramTagger
from nltk.corpus import treebank
Override_tagger = UnigramTagger(model = {‘Vinken’ : ‘NN’})
Override_tagger.tag(treebank.sents()[0])
[
('Pierre', None),
('Vinken', 'NN'),
(',', None),
('61', None),
('years', None),
('old', None),
(',', None),
('will', None),
('join', None),
('the', None),
('board', None),
('as', None),
('a', None),
('nonexecutive', None),
('director', None),
('Nov.', None),
('29', None),
('.', None)
]
由于我们的模型包含“ Vinken”作为唯一的上下文关键字,因此您可以从上面的输出中观察到,只有这个单词带有标签,而其他每个单词都没有None作为标签。
为了确定给定上下文中最可能使用哪个标签, ContextTagger类使用出现的频率。即使上下文单词和标记仅出现一次,它也会默认执行此操作,但是我们可以通过将截止值传递给UnigramTagger类来设置最小频率阈值。在下面的示例中,我们在训练UnigramTagger的先前配方中传递了截止值-
from nltk.tag import UnigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Uni_tagger = UnigramTagger(train_sentences, cutoff = 4)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)
0.7357651629613641