自然语言处理 |基于训练标记器的分块器 |设置 2
Conll2000 语料库
使用 IOB 标签定义块。
- 它指定块的开始和结束位置及其类型。
- 可以在这些 IOB 标签上训练词性标注器,以进一步支持 ChunkerI 子类。
- 首先使用语料库中的chunked_sents()方法,获得树,然后将其转换为词性标注器可用的格式。
- conll_tag_chunks()使用tree2conlltags()将一个句子 Tree 转换成一个由三个元组组成的列表,形式为 (word, pos, iob)。
- pos : 词性标签
- iob :例如 IOB 标记 – B_NP、I_NP 分别表示 work 位于名词短语的开头和内部。
- conlltags2tree() 是 tree2conlltags() 的反转
- 然后将 3 元组转换为标记器可以识别的 2 元组。
- RegexpParser 类对块模式使用词性标记,因此词性标记被用作要标记的单词。
- conll_tag_chunks()函数接受 3 元组 (word, pos, iob) 并返回形式为 (pos, iob) 的 2 元组列表
代码#1:让我们理解
Python3
from nltk.chunk.util import tree2conlltags, conlltags2tree
from nltk.tree import Tree
t = Tree('S', [Tree('NP', [('the', 'DT'), ('book', 'NN')])])
print ("Tree2conlltags : \n", tree2conlltags(t))
c = conlltags2tree([('the', 'DT', 'B-NP'), ('book', 'NN', 'I-NP')])
print ("\nconlltags2tree : \n", c)
# Converting 3 tuples to 2 tuples.
print ("\nconll_tag_chunnks for tree : \n", conll_tag_chunks([t]))
Python3
from chunkers import TagChunker
from nltk.corpus import conll2000
# data
conll_train = conll2000.chunked_sents('train.txt')
conll_test = conll2000.chunked_sents('test.txt')
# initializing the chunker
chunker = TagChunker(conll_train)
# testing
score = chunker.evaluate(conll_test)
a = score.accuracy()
p = score.precision()
r = recall
print ("Accuracy of TagChunker : ", a)
print ("\nPrecision of TagChunker : ", p)
print ("\nRecall of TagChunker : ", r)
Python3
# loading libraries
from chunkers import TagChunker
from nltk.tag import UnigramTagger
uni_chunker = TagChunker(train_chunks,
tagger_classes =[UnigramTagger])
score = uni_chunker.evaluate(test_chunks)
a = score.accuracy()
print ("Accuracy of TagChunker : ", a)
输出 :
Tree2conlltags :
[('the', 'DT', 'B-NP'), ('book', 'NN', 'I-NP')]
conlltags2tree :
Tree('S', [Tree('NP', [('the', 'DT'), ('book', 'NN')])])
conll_tag_chunnks for tree :
[[('DT', 'B-NP'), ('NN', 'I-NP')]]
代码#2:使用 conll2000 语料库的 TagChunker 类
Python3
from chunkers import TagChunker
from nltk.corpus import conll2000
# data
conll_train = conll2000.chunked_sents('train.txt')
conll_test = conll2000.chunked_sents('test.txt')
# initializing the chunker
chunker = TagChunker(conll_train)
# testing
score = chunker.evaluate(conll_test)
a = score.accuracy()
p = score.precision()
r = recall
print ("Accuracy of TagChunker : ", a)
print ("\nPrecision of TagChunker : ", p)
print ("\nRecall of TagChunker : ", r)
输出 :
Accuracy of TagChunker : 0.8950545623403762
Precision of TagChunker : 0.8114841974355675
Recall of TagChunker : 0.8644191676944863
注意: conll2000 的性能不如 treebank_chunk,但 conll2000 是一个更大的语料库。代码#3:使用 UnigramTagger 类的 TagChunker
Python3
# loading libraries
from chunkers import TagChunker
from nltk.tag import UnigramTagger
uni_chunker = TagChunker(train_chunks,
tagger_classes =[UnigramTagger])
score = uni_chunker.evaluate(test_chunks)
a = score.accuracy()
print ("Accuracy of TagChunker : ", a)
输出 :
Accuracy of TagChunker : 0.9674925924335466
tagger_classes 参数直接传递给 backoff_tagger()函数,这意味着它们必须是 SequentialBackoffTagger 的子类。在测试中,默认的tagger_classes = [UnigramTagger, BigramTagger]一般会产生最好的结果,但是会随着语料的不同而变化。