基于CRF字模型的汉语分词实验(python)

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字模型的汉语分词实验。最后还可以添加评价函数。此处就不列出了。

最后把用的一些训练、测试语料也附上。实验所用语料 提取码:5b6g
本文代码部分参考了步月听风的文章万分感谢。

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值