[1-3]词性

词性(Part of Speech, POS)。最常用的POS notification是宾州树库(Penn Tree Bank, PTB)标记集。

# POS tagging 
>>>import nltk
>>>from nltk import word_tokenize
>>>s="I was watching TV"
>>>print nltk.pos_tag(word_tokenize(s))

# all nouns
>>>tagged=nltk.pos_tag(word_tokenize(s))
>>>allnoun=[word for word,pos in tagged if pos in ['NN','NNP'] ]

nltk.pos_tag标注器在内部采用了maxnet分类器训练模型,预测一个具体的单词属于哪类标签。

NLTK封装了许多预先训练的标注器,如斯坦福工具等。

一个常见的POS标注器示例

# Stanford POS tagger 
# 需要从Stanford网站下载斯坦福标注器,放到文件夹中
>>>from nltk.tag.stanford import POSTagger
>>>import nltk
>>>stan_tagger=POSTagger('models/english-bidirectional-distdim.tagger','standford-postagger.jar')
>>>tokens =nltk.word_tokenize(s)
>>>stan_tagger.tag(tokens)

综上,主要以两种方式使用NLTK,实现标注任务

(1)在测试数据上应用NLTK或其他库中预先训练的标注器。这两种标注器足以应付任何非特定领域的语料库,纯英文文本的POS标注任务。

(2)构建或训练在测试数据使用的标注器,这用于处理非常具体的用例,开发自定义的标注器。

标注器

一个典型的标注器采用了大量训练数据,并且句子的每个单词上都附上了POS标签进行标注。标注基本上是手工劳动。

通常情况下,我们将词性标注问题视为序列标注问题或分类问题。在序列标注问题或分类问题中,对于给定单词,人们试图使用通用的判别模型来预测正确的标签。

布朗语料库中POS标签的频率分布:

NN是最频繁的标签。下面构建一个非常朴素的POS标注器,将NN作为标签分配给所有测试单词。可以使用NLTK的DefaultTagger函数完成这个任务。evaluate函数给出了预测单词POS的准确性。

DefaultTagger是基类SequentialBackoffTagger的一部分,它基于序列(Sequence)进行标注。标注器试图基于上下文对标签建立模型,如果它不能够正确预测标签,那么它会咨询BackoffTagger。一般来说,DefaultTagger可以作为一个BackoffTagger。

序列标注器

N元标注器

N元标注器是SequentialTagger的子类。标注器接受上下文的前n个单词,预测给定单词的POS标签。

Unigram只考虑标签的条件概率,预测每个给定单词的最常见标签。bigram_tagger考虑给定单词及其前一个单词的标签,以元组标签形式,给出测试单词的给定标签。

TrigramTagger的覆盖率相对较低,实例的准确率会比较高,UnigramTagger的覆盖率较高。为了处理精确率和召回率之间的权衡,这里组合了这三种标注器。首先,对于给定的单词序列,程序会先询问trigram来预测标签,如果没找到给定单词序列的标签,那么通过Backoff回退到BigramTagger,如果还是找不到就回退到UnigramTagger,最后通过Backoff回退到NN标签。

正则表达式标注器

如果将若干个正则表达式标注器进行结合,可能可以提高性能。

布里尔标注器

布里尔标注器是基于变换的标注器,其思想是,从猜测给定标签开始,在接下来的迭代中,基于标注器学习到的下一组规则,返回并修改错误。这也是监督的标注方式。

如果标注器从准确率一般的Unigram/Bigram标注器开始,然后使用布里尔标注器,无需寻找三元组,而是基于标签、位置和单词本身,寻找规则。例如:

当前一个单词是TO时,使用VB替代NN。

使用一些迭代和相对优化的规则,布里尔标注器的性能可以超过一些N元标注器。但是在训练集中,切勿使标注器产生过拟合。

基于标注器的机器学习

例如最大熵分类器MEC——判别模型

基于隐马尔可夫模型HMM和条件随机场CRF——生成模型

命名实体识别

一般来说,NER由名称、位置和组织构成。有一些NER体系所标注的实体不仅仅这三种实体。

ne_chunking方法可以识别人(姓名,name)、地点(位置,location)和组织。如果将binary设置为True,那么它将为整棵句子树提供输出,标注一切信息。如果是False,它将提供详细的个人、地点和组织信息,与先前使用斯坦福NER标注器的示例一样。

斯坦福NER的标注器,具有更高的准确率。

QA

在POS标注之前,可以删除停用词吗?

不能。如果删除了停用词,就失去了上下文,一些POS标注器(预训练模型)使用单词上下文作为特征,赋予给定单词POS。

Last updated

Was this helpful?