概述
普通的分类问题是把 (x,y) 看做一个样本,序列分类问题是把(x1,…,xt, y1,…,yt) 整体看做一个样本。 比如以前用 svm,输入x输出y是标量,表示类别;现在用crf,输入x输出y是个序列,表示不同位置/时刻的类别。通过训练迭代出各个特征函数的类别。
CRF通过迭代各特征函数的权重使得对状态序列的所有位置的词的所有特征函数加权求和后最大。
下面概率分布函数,表示了给定X序列的情况下,Y序列的概率分布
预测时可参照维特比算法,公式如下:
安装
tar -zxvf CRF+±0.58.tar.gz
基本环境:
gcc:
sudo yum -y install gcc
sudo yum -y install gcc-c++
pip:
curl “https://bootstrap.pypa.io/get-pip.py” -o “get-pip.py”
sudo python get-pip.py
python-devel:
sudo yum install python-devel
----------基本环境具备可直接安装-------------
step1 cd CRF+±0.58/
step2 ./configure
step3 sudo make && sudo install
安装python接口(非必须)
sudo vim /etc/ld.so.conf
include /usr/local/lib
sudo /sbin/ldconfig -v
ln -s /usr/local/lib/libcrfpp.so.* /usr/lib64/
sudo python setup.py install
测试
采用CRF++自带的测试例子来确认安装是否成功,采用如下步骤
step1 cd ./CRF+±0.58/example
step2 cd chunking/
step3 训练:sudo …/…/crf_learn -c 4.0 template train.data model -t(-t的目的是记录生成的模型细节到txt文本)
step4 测试: sudo …/…/crf_test -m model test.data
我们需要什么?
一个特征函数集
CRF++ 可以根据模板自动生成特征函数集,其提供两种模板(unigram, bigram)
Unigram生成的特征函数:函数: f(s, o),:
表示只与当前位置对应的标签相关的特征(可能兼顾其在句子中的整体状态),生成所有可能标注对应的特征函数。提供的模板例子:
U01:%x[-1,0]
U02:%x[0,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]
……
如U00:%x[-1, 0] , 及序列“CRF”,标签集合B、M、E
当前位置“R”:则可生成 :
func1=if(output=B and feature= ‘U00:C’) return 1 else return 0
func2=if(output=M and feature= ‘U00:C’) return 1 else return 0
func3=if(output=E and feature= ‘U00:C’) return 1 else return 0
下一个位置 “F”:
func1=if(output=B and feature= ‘U00:R’) return 1 else return 0
func2=if(output=M and feature= ‘U00:R’) return 1 else return 0
func3=if(output=E and feature= ‘U00:R’) return 1 else return 0
…
Unigram 生成的特征函数个数 = |标签数| x |词的个数|
Bigram:函数:f(s’, s, o)其生成的特征函数考虑两个状态的所有可能标签。
如模板:
U00:%x[0,0]
U-1:%x[-1,0]/%x[0,0]
U+1:%x[0,0]/%x[1,0]
B
如U00:%x[-1, 0] , 及序列“CRF”,标签集合B、M、E,当前位置“R”:则可生成 :
func1 = if (prev = B and after = B and feature=B01:“R”) return 1 else return 0
func1 = if (prev = B and after = M and feature=B01:“R”) return 1 else return 0
func1 = if (prev = B and after = E and feature=B01:“R”) return 1 else return 0
……
bigram: |标签数| x |标签数| x |词的个数|
使用CRFPP训练
语料:
训练集:
cat 语料 | awk ‘{split($0,arr,"\t");print arr[1]"\t"arr[2]}’ > 处理后的语料
训练:crf_learn -t good/template.bi crfpp_uni_book_train model_560W_bi
一些CRF预测算法
维特比算法实际使用动态规划解CRF条件随机场的预测问题,即用动态规划(Dynamic Programming)求概率最大状态路径(最优路径)。这时一条路径对应一个状态序列。
我们只需要从时刻t=1开始,递推地计算在时刻t状态为i的各条部分路径的最大概率,直至得到时刻t=T状态为i的各条路径的最大概率。时刻t=T的最大概率即为最优路径的概率P*,最优路径的终结点i*T也同时得到。
之后,为了找出最优路径的各个节点,从终结点iT开始,由后向前逐步求得节点iT-1,……,i1,得到最优路径I=(i1, i2, i3,……,iT),这就是维特比算法。
在条件随机场预测问题中,CRF预测问题就成为了求非规范化概率最大的最优路径问题。