📜  自然语言工具包-Unigram Tagger

📅  最后修改于: 2020-10-14 09:21:56             🧑  作者: Mango


什么是Unigram Tagger?

顾名思义,unigram标记器是一种仅使用单个单词作为其上下文来确定POS(词性)标记的标记器。简单来说,Unigram Tagger是基于上下文的标记器,其上下文是单个单词,即Unigram。

它是如何工作的?

NLTK为此提供了一个名为UnigramTagger的模块。但是在深入研究其工作原理之前,让我们借助下图了解层次结构-

独角兽匕首

从上图可以看出, UnigramTagger继承自NgramTagger ,后者是ContextTagger的子类, NgramTagger继承自SequentialBackoffTagger

借助以下步骤来解释UnigramTagger的工作-

  • 如我们所见, UnigramTagger继承自ContextTagger ,它实现了context()方法。此context()方法采用与choose_tag()方法相同的三个参数。

  • context()方法的结果将是令牌词,该词将进一步用于创建模型。创建模型后,单词令牌也将用于查找最佳标签。

  • 这样, UnigramTagger将从标记语句列表中构建上下文模型。

训练Unigram匕首

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