📌  相关文章
📜  自然语言处理 |基于训练标记器的分块器 |设置 2

📅  最后修改于: 2022-05-13 01:54:42.819000             🧑  作者: Mango

自然语言处理 |基于训练标记器的分块器 |设置 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]一般会产生最好的结果,但是会随着语料的不同而变化。