自然语言工具包 - 单词标注器



什么是Unigram标注器?

顾名思义,Unigram标注器只使用单个单词作为其确定词性(Part-of-Speech)标记的上下文。简单来说,Unigram标注器是一个基于上下文的标注器,其上下文是一个单词,即Unigram。

它是如何工作的?

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

Unigram Tagger

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

UnigramTagger的工作原理如下所示:

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

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

  • 通过这种方式,UnigramTagger将根据已标注句子的列表构建上下文模型。

训练Unigram标注器

NLTK的UnigramTagger可以通过在初始化时提供已标注句子的列表来进行训练。在下面的示例中,我们将使用treebank语料库的已标注句子。我们将使用该语料库的前2500个句子。

示例

首先从nltk导入UnigramTagger模块:

from nltk.tag import UnigramTagger

接下来,导入您要使用的语料库。这里我们使用treebank语料库:

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

在这里,对于使用单个单词查找来确定词性标记的标注器,我们获得了大约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类传递cutoff值来设置最小频率阈值。在下面的示例中,我们在前面训练UnigramTagger的示例中传递了cutoff值:

示例

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
广告