使用Pytorch框架中定义好的biLSTM_CRF模型和超参数,主要目的是加深学习印象;
过去一段时间对序列标注任务学习的梳理,学习的过程中有不断修正之前的理解里谬误的地方;本文是对tutorial的示范例子的一次依葫芦画瓢,仅作为对之前学习内容的回顾总结和实践,最重要的还是先对知识和模型的学习!
学习过程做的笔记:
对biLSTM_CRF模型的理解
对pytorch官方文档里biLSTM_CRF模型的源码学习(一)整体理解
(二)预定义方法、模型的初始化工作
(三)前向传播过程
上述是用序列标注任务(词性标注和命名实体识别)来学习bilstm_crf模型的,前提是理解序列标注任务
对词性标注任务、条件随机场crf、hmm模型及两者区别的理解
如果对hmm模型、以及序列标注任务中转移概率分布、发射概率分布概念的理解有困难,可以先从一个小例子开始学习hmm模型
用C++语言实现hmm+viterbi算法做词性标注任务(给定hmm模型,侧重于理解hmm和viterbi的算法部分)
理解给定hmm模型下完成词性标注任务的过程后,可以尝试⬇️基于统计、使用参数估计方法定义自己的hmm模型,并使用模型做词性标注任务
用python语言实现hmm+viterbi算法做词性标注任务(与本文使用相同的数据集)
1.开始标签、结束标签、超参数(词向量维度、隐藏层向量的维度)
START_TAG = "<START>"
STOP_TAG = "<STOP>"
EMBEDDING_DIM = 5
HIDDEN_DIM = 4
2.使用已经标注好的人民日报语料库作为数据集,读入文件
词序列和标签序列保存在list_vocab和list_pos
f = open("199801_dependency_treebank_2003pos2103230114.txt","r")
txt = f.read() # 一次性读入全部
f.close()
lines = txt.split("\n") # 按行切割
row = 0 # 源文本文件从第一行开始每隔四行为词汇统计行 中文分词结果
list_vocab=[]
while row<len(lines):
for word in lines[row].split(): #将分好的词全部加进list_vocab中
list_vocab.append(word)
row+=5
row = 1 # 源文本文件从第二行开始每隔四行为词性标注统计行
list_pos=[]
while row<len(lines):
for pos in lines[row].split(): #将分好的词全部加进list_vocab中
list_pos.append(pos)
row+=5
3.建立训练集数据,建立词在词表中的索引,标签在标签集中的索引,索引值到类标签的映射
training_data = [(list_vocab,list_pos)] #训练数据是(词序列,词性序列)的元组
word_to_ix = {
}
for word in set(list_vocab):
word_to_ix[word] = len(word_to_ix) # 词表
tag_to_ix={
}
ix_to_tag={
} # 建立标签下标->标签的映射 便于输出预测结果时直接输出标签值
for tag in set(list_pos):
tag_to_ix[tag] = len(tag_to_ix) #标签表
ix_to_tag[tag_to_ix[tag]] = tag
tag_to_ix[START_TAG] = len(tag_to_ix)
ix_to_tag[tag_to_ix[START_TAG]