本文转自:知乎
作者: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.0wakespace.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专栏。