CRF字模型分词的原理是把先把测试的数据集进行数据处理,然后根据模板进行训练,最后把训练出来的模板进行分词。
准备工作:
借助条件随机模型工具CRF+±0.54,官网下载(http://crfpp.sourceforge.net/))
也可以百度云链接:CRF百度云文件 提取码:e72n
第一步
首先把要训练的数据集做处理,将其处理成标注过的两列存在的形式。
处理的代码如下:
#路径*(根据需求改成自己的地址)
test_file_pritice = 'C:/Users/Administrator/Desktop/中文分词实验/pku_training.txt'#训练语料
test_file_CRF = 'C:/Users/Administrator/Desktop/中文分词实验/test_sc-CRF.txt'#处理结果
#将训练语料标注成B M E S存储
def character_tagging(input_file,output_file):
input_data = open(input_file,'r',encoding='UTF-8-sig')
output_data = open(output_file,'w',encoding='UTF-8-sig')
for line in input_data.readlines():
word_list = line.strip().split()
for word in word_list:
if len(word)==1:
output_data.write(word+'\tS\n')
else:
output_data.write(word[0]+'\tB\n')
for w in word[1:len(word)-1]:
output_data.write(w+'\tM\n'+'\t i \n')
output_data.write(word[len(word)-1]+'\tE\n')
output_data.write('\n')
input_data.close()
output_data.close()
character_tagging(test_file_pritice,test_file_CRF)
处理完以后,数据的格式应该是这种
第二步
选择训练的模板
# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]
U06:%x[-1,0]/%x[0,0]/%x[1,0]
U07:%x[0,0]/%x[1,0]/%x[2,0]
U08:%x[-1,0]/%x[0,0]
U09:%x[0,0]/%x[1,0]
# Bigram
B
其中U和B代表两种开始的标注形式,本实验中用的是B开头的。S,单个词;B,词首;E,词尾;M 词中。
模型训练
把下载好的文件CRF+±0.54解压,上面已经处理好的语料放到了CRF文件夹(我自己建立的文件夹,根据需求自己选择)中,再把解压好的CRF+±0.54文件夹中的crf.learn、crf.test 和libcrfpp.dll复制到CRF中。再把example文件夹中的seg文件夹下的template也复制到CRF中,template中存储的是上面所说的模板。但是exec.sh有用,可复制也可不复制。template必须复制。
exec.sh #训练和测试脚本
template #模板文件
下面的命令也可以打开exec.sh 查看,但需要一点点修改。
下面要进行训练,打开该CRF文件夹(刚才复制文件到的目标文件夹)目录下的cmd命令行,输入:
crf_learn -a MIRA template test_sc-CRF.txt crf_model
template 指模板 test_sc-CRF.txt 刚才处理后的文件 crf_model指新生成训练模板
训练时间5717.25秒 迭代了154次
此时会在CRF文件夹中会多一个crf_model文件,这就是我们要的训练后的模板。然后接着输入命令crf_test -m crf_model test_sc-CRF.txt -> test_sc-CRF-out.txt
crf_model 是刚训练好的模型,test_sc-CRF.txt是第一次处理的数据集,-> test_sc-CRF-out.txt 结果输出到test_sc-CRF-out.txt 文件夹。
数据处理
打开刚生成的文件,你会发现其中的数据已经变成了如下格式:
下面我们要做的就是把数据恢复成原来的样子,可用下面代码实现:
#路径改成自己的
test_file_CRF_out = r'C:\Users\Administrator\Desktop\中文分词实验\词法分析\CRF\test_sc-CRF-out.txt'#刚用命令行最后输出的结果
test_file_CRF_result = r'C:\Users\Administrator\Desktop\中文分词实验\词法分析\CRF\test_sc-CRF_result.txt'#最终结果
#分完词后将文本处理会原段落形式
def character_2_word(input_file,output_file):
input_data = open(input_file, 'r',encoding= 'UTF-8-sig')
output_data = open(output_file, 'w', encoding='UTF-8-sig')
for line in input_data.readlines():
if line == "\n":
output_data.write("\n")
else:
char_tag_pair = line.strip().split('\t')
char = char_tag_pair[0]
tag = char_tag_pair[2]
if tag == 'B':
output_data.write(' ' + char)
elif tag == 'M':
output_data.write(char)
elif tag == 'E':
output_data.write(char + ' ')
else: # tag == 'S'
output_data.write(' ' + char + ' ')
input_data.close()
output_data.close()
character_2_word(test_file_CRF_out,test_file_CRF_result)
这样就完成了基于CRF字模型的汉语分词实验。最后还可以添加评价函数。此处就不列出了。