爱笑的小姐姐 · 2021年06月01日

深度学习-8.CRF编译和使用过程

本文转自:知乎
作者:djh

简介

CRF 是条件随机场(conditional random fields)的简称。它是用来干嘛的呢?基础的用来做语义块的识别。什么意思,简单的说比如如下一句话:

关羽是一个厉害的角色

你可以要把这句话分成几个板块。关羽 、是、 一个、厉害、 的 、角 色

就是这样子的意思,所以在CRF上面扩展开来,可以做中文分词,命名实体识别和语义组块等等应用。

我们今天使用CRF来进行识别中文的语义组块,通过下列过程。

1、下载训练数据语料库
2、下载CRF源码并且编译它
3、使用CRF对数据进行训练和测试
4、在python中使用CRF 对一句话---“关羽是一个厉害的角色” 进行分块。

1、下载训练数据语料库

有哪些语料库可以供我们下载呢?其实有很多的。

  • 1.Penn TreeBank

该语料为宾州大学开发的语料,可以通过nltk下载。英文的。

  • 2.sinica\_treebank

中央研究院提供的中文语料库

  • 3.Chinese Treebank

宾州大学开发的语料,中文的。下载地址

Chinese Treebank 8.0​wakespace.lib.wfu.edu

因为我们只是做简单的demo所以我选择了另外一种小型的数据集,是由网友提供的。人民日报的语料库,这边给个生成好的data数据

链接: https://pan.baidu.com/s/1NGYah16Q62ewd3j9HZlTCQ 提取码: xi91 复制这段内容后打开百度网盘手机App,操作更方便哦

训练语料展示

 迈    v    B
 向    v    E
 充    v    B
 满    v    E
 希    n    B
 望    n    E
 的    u    S
 新    a    S
 世    n    B
 纪    n    E
 —    w    B
 —    w    E
 一    t    B
 九    t    M1
 九    t    M2
 八    t    M
 年    t    E
 新    t    B  

2、下载CRF源码并编译它

下载地址是 http://taku910.github.io/crfpp/

该项目是c++的,所以在你Ubuntu中要用按照好c编译环境。下载最新版本CRF++0.58.tar.gz。CRF的编译很简单,只需要如下Linux命令即可:

./configure
 make
 make install
 idconfig  

以上命令,最好使用sudo运行。有些会有路径权限的问题。

这样CRF就编译好了。

3、使用CRF对数据进行训练和测试

3.1建立模板

   vim ./data/template
   U00:%x[-1,0]
   U01:%x[0,0]
   U02:%x[1,0]
   U03:%x[-1,0]/%x[0,0]
   U04:%x[0,0]/%x[1,0]
   U05:%x[-1,0]/%x[1,0]  

当然,CRF模板类型有如下两种一种是Unigram Template ,称之为一元模板,Bigram Template,也称之为二元模板。更多关于模板的内容,请自行百度了解。

3.2进行训练

crf_learn -f 3 -c 4.0 ./data/template ./data/6.train.data  model.bin
可选参数
 -f, –freq=INT使用属性的出现次数不少于INT(默认为1)
 -m, –maxiter=INT设置INT为LBFGS的最大迭代次数 (默认10k)
 -c, –cost=FLOAT      设置FLOAT为代价参数,过大会过度拟合 (默认1.0)
 -e, –eta=FLOAT设置终止标准FLOAT(默认0.0001)
 -C, –convert将文本模式转为二进制模式
 -t, –textmodel为调试建立文本模型文件
 -a, –algorithm=(CRF|MIRA) 选择训练算法,默认为CRF-L2
 -p, –thread=INT线程数(默认1),利用多个CPU减少训练时间
 -H, –shrinking-size=INT 设置INT为最适宜的跌代变量次数 (默认20)
 -v, –version显示版本号并退出  

进行测试

./crf_test -m model.bin ./data/6.test.data
 民    n    E    E
 将    d    S    S
 满    l    B    B
 怀    l    M1    M1
 信    l    M    M
 心    l    E    E 

如上,第四列是预测出的标签,和第三行对比。可以写个脚本统计下,准确率达到

95%

4、在python中使用CRF

将CRF安装到python中

import CRFPP 
ModuleNotFoundError: No module named 'CRFPP' 

有时候会出这个错误。首先确保上面第二步(2、下载CRF源码并编译它)执行是没有问题的。

然后我们还需要

cd  ./CRF++-0.58/python python setup.py install sudo python setup.py install 

书写代码

import CRFPP
crf_model = "./data/model.bin"
tagger = CRFPP.Tagger("-m " + crf_model)
text = "关羽是一个厉害的角色"
for word in text:
     word = word.strip()
     if word:
         tagger.add((word + "\to\tB"))
    tagger.parse()
    size = tagger.size()
    xsize = tagger.xsize()
    for i in range(0, size):
        for j in range(0, xsize):
            char = tagger.x(i, j)
            tag = tagger.y2(i)
            if tag == 'B':
                print(' ' + char)
            elif tag == 'M':
                print(char)
            elif tag == 'E':
                print(char + ' ')
            else:
                print(' ' + char + ' ')

如上,我们导入CRFPP后就可以使用了。加载上面生成的model.bin文件。然后对 -----"关羽是一个厉害的角色"进行语块识别。

结果如下:

关羽 是 一个 厉害 的 角 色

其他

关注我不迷路,后面会有AI系列文章推送。

https://github.com/yazone/ai_learning_path
更多嵌入式AI技术相关内容请关注嵌入式AI专栏。
推荐阅读
关注数
16565
内容数
1230
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息