正则表达式标注器:
定义了一个这则表达式的同时定义出给定表达式所对应的标签。下面会看到一些常见的正则表达式是如何获取不同词性的。其中有一些模式都有各自关联的POS类别。
from nltk.tag.sequential import RegexpTagger
from nltk.corpus import brown
brown_tagged_sents=brown.tagged_sents(categories='news')
train_data=brown_tagged_sents[:int(len(brown_tagged_sents)*0.9)]
test_data=brown_tagged_sents[int(len(brown_tagged_sents)*0.9):]
regexp_tagger = RegexpTagger(
[( r'^-?[0-9]+(.[0-9]+)?$', 'CD'), # cardinal numbers
( r'(The|the|A|a|An|an)$', 'AT'), # articles
( r'.*able$', 'JJ'), # adjectives
( r'.*ness$', 'NN'), # nouns formed from adj
( r'.*ly$', 'RB'), # adverbs
( r'.*s$', 'NNS'), # plural nouns
( r'.*ing$', 'VBG'), # gerunds
(r'.*ed$', 'VBD'), # past tense verbs
(r'.*', 'NN') # nouns (default)
])
print(regexp_tagger.evaluate(test_data))
结果:
0.31306687929831556
这里应用一些基于POS的显模式能到到30%的正确率。通过BackoffTagger就有可能提高性能。
尝试着通过UnigramTagger
from nltk.tag.sequential import RegexpTagger
from nltk.corpus import brown
import nltk
from nltk.tag import UnigramTagger
brown_tagged_sents=brown.tagged_sents(categories='news')
train_data=brown_tagged_sents[:int(len(brown_tagged_sents)*0.9)]
test_data=brown_tagged_sents[int(len(brown_tagged_sents)*0.9):]
regexp_tagger = RegexpTagger(
[( r'^-?[0-9]+(.[0-9]+)?$', 'CD'), # cardinal numbers
( r'(The|the|A|a|An|an)$', 'AT'), # articles
( r'.*able$', 'JJ'), # adjectives
( r'.*ness$', 'NN'), # nouns formed from adj
( r'.*ly$', 'RB'), # adverbs
( r'.*s$', 'NNS'), # plural nouns
( r'.*ing$', 'VBG'), # gerunds
(r'.*ed$', 'VBD'), # past tense verbs
(r'.*', 'NN') # nouns (default)
])
Unigram_tagger=UnigramTagger(train_data,backoff=regexp_tagger)
print(Unigram_tagger.evaluate(test_data))
结果为:
0.8656433768563739
相较于之前的确有略微地提升
Brill标注器:
Bril标注器是一种基于转换操作的标注器,其思路是先对标签做一个猜想,然后在下一轮迭代中基于标注器接下来所学到的规则设置返回到原先的错误上并修复它。是一种半监督的标注方式,与N-gram不同的是后者会在训练过程中对N-gram模式来进行计数,这里我们要查找的是转换规则。
基于机器学习的标注器:
一些标注器内部都是黑盒子,如pos——tag内部使用的是最大熵分类器(MEC),StanfordTagger所采用的也是最大熵标注器但属于不同的模型。其中有很多是基于隐马尔科夫随机场(HMM)和条件随机场(CRF)的标注器都是生成模型。
命名实体识别(NER):
除了POS之外在文本中找出命名实体项也是最常见的标签化问题,通常情况下NER主要由实体、位置和组织构成。这也可以视为一个顺序化标签的问题,可以利用上下文语境和其他相关特性来标签化这些命名体。NLTK库中NER标注的方式有两种:1是基于事先标注好的NER模型2是建立一个机器学习的模型。
NER标注器:
NLTK提供的命名实体提取方式是ne_chunk().
用一个例子来显示如何对任意的语句进行标注。这种方法需要先进性文本的预处理,即先对语句进行标识化处理,然后再进行语块分解和词性标注的处理顺序,之后才能进行命名实体的标注:
import nltk
from nltk import word_tokenize
from nltk import ne_chunk
Sent="Mark is studying at Standford University in California."
print(ne_chunk(nltk.pos_tag(word_tokenize(Sent)),binary=False))
结果:
(S
(PERSON Mark/NNP)
is/VBZ
studying/VBG
at/IN
(ORGANIZATION Standford/NNP University/NNP)
in/IN
(GPE California/NNP)
./.)
可以看到ne_chunking方法主要用于姓名,地点,如果binary设置True,给出句子树结构和标签。