CRF简介
Conditional Random Field:条件随机场,一种机器学习技术。
CRF由Lafferty等人于2001年提出,结合了最大熵模型和隐马尔可夫模型的特点,是一种无向图模型,近年来在分词、词性标注和命名实体识别等序列标注任务中取得了很好的效果。条件随机场是一个典型的判别式模型,其联合概率可以写成若干势函数联乘的形式,其中最常用的是线性链条件随机场。
感兴趣的同学可以去参看此贴,对CRF的原理进行了详细的介绍:
如何用简单易懂的例子解释条件随机场(CRF)模型?它和HMM有什么区别?
CRF++ 用法介绍
安装
在Linux或者Mac OS系统下,下载C++源代码安装包(CRF++-0.58.tar.gz)之后,按照如下步骤进行安装:
CD命令进入到代码主目录后,依次输入以下命令
configure
、make
、(sudo) make install
就可以完成C++库的安装。
注:最后一条需要管理员模式,输入”sudo”进入再进入到子目录python下,安装python包:
python setup.py build (sudo) python setup.py install
安装完毕之后,可以在python解释器下测试:
import CRFPP
, 如果不报错,则准备工作就绪。
用法介绍
在CRF++ 的example目录下有个seg目录,这个seg目录对应的是一个日文分词的样例,我们后续的工作可以按照这个案例来进行。在安装包目录下,执行cd example/seg
命令后,切换到seg目录后,发现有4个文件:
exec.sh(执行脚本)
template(特征模板)
test.data(测试集)
train.data(训练集)
有了这4个文件,我们可以做得事情就比较简单,只要按测试集,训练集的格式准备数据就可以了,特征模板和执行脚本可以套用,不过这里简单解读一下这几个CRF++文件。首先来看训练集:
毎 k B
日 k I
新 k I
聞 k I
社 k I
特 k B
別 k I
顧 k B
問 k I
这里第一列是待分词的日文字,第二列暂且认为是词性标记,第三列是字标注中的2-tag(B, I)标记,这个很重要,对于我们需要准备的训练集,主要是把这一列的标记做好,不过需要注意的是:列与列之间是制表符“\t”隔开的,否则会导致feature_index.cpp(126) [max_size == size] inconsistent column size
错误。。
再来看测试集的格式:
よ h I
っ h I
て h I
私 k B
た h B
ち h I
の h B
世 k B
同样也有3列,第一列是日文字,第二列第三列与上面是相似的,不过在测试集里第三列主要是占位作用。事实上,CRF++对于训练集和测试集文件格式的要求是比较灵活的,首先需要多列,但不能不一致,既在一个文件里有的行是两列,有的行是三列;其次第一列代表的是需要标注的“字或词”,最后一列是输出位”标记tag”,如果有额外的特征,例如词性什么的,可以加到中间列里,所以训练集文件最少要有两列。
接下里我们再来详细的分析一下特征模板文件:
# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0