CRF++笔记。
NLP引入
句法分析是NLP任务的核心,NER是句法分析的基础。NER任务用于识别文本中的人名(PER)、地名(LOC)等具有特定意义的实体。非实体用O来表示。
CRF
Conditional Random Field,条件随机场,一种机器学习模型,广泛用于NLP文本标注领域。
应用场景:分词、词性标注、命名实体识别(NER,Named Entity Recognition)等。
命名实体识别的任务是识别出待处理文本中三大类(实体类、时间类和数字类)、七小类(人名、机构名、地名、时间、日期、货币和百分比)命名实体。
NER是个分类任务,具体称为序列标注任务,即文本中不同的实体对应不同的标签,人名-PER,地名-LOC,等等,相似的序列标注任务还有词性标注、语义角色标注。
传统解决方法:
(1)基于规则
(2)基于统计学
隐马尔可夫(HMM)、条件随机场(CRF)模型和Viterbi算法
(3)神经网络
LSTM+CRF模型
CRF的基础是马尔科夫随机场(概率无向图)。
CRF可以理解为在给定随机变量X的条件下,随机变量Y的马尔可夫随机场。其中,线性链CRF(一种特殊的CRF)可以用于序列标注问题。CRF模型在训练时,给定训练序列样本集(X,Y),通过极大似然估计、梯度下降等方法确定CRF模型的参数;预测时,给定输入序列X,根据模型,求出P(Y|X)最大的序列y。
CRF分词原理
CRF把分词当做字的词位分类问题,通常定义字的词位信息如下:
词首,常用B表示
词中,常用M表示
词尾,常用E表示
单子词,常用S表示
例:
原始例句:他爱上海陆家嘴
CRF标注后:他/S 爱/S 上/B 海/E 陆/B 家/M 嘴/E
分词结果:他/爱/上海/陆家嘴
用CRF进行命名实体识别属于有监督学习。需要大批已标注的语料对模型参数进行训练。
CRF++
目前常见的CRF工具包有pocket crf, flexcrf 和CRF++。
CRF是著名的条件随机场的开源工具,也是目前综合性能最佳的CRF工具。
CRF官网http://taku910.github.io/crfpp/
安装
- 解压
- cd 进入解压后的目录,执行‘./configure’命令
- make 编译
- make install (需先执行“su”获取root用户权限)
- make clean 删除安装时产生的临时文件(可不执行)
使用
两个过程:训练、测试。
数据格式
训练和测试文件必须包含多个tokens,每个token又包含多个列。token的定义可根据具体的任务,如词、词性等。每个token必须写在一行,且各列之间用空格或制表格间隔。一个token的序列可构成一个sentence,每个sentence之间用一个空行间隔。注意最后一列将是被CRF用来训练的最终标签。
特征模板
CRF++训练的时候,要求我们自己提供特征模板。
模板文件中的每一行是一个模板。每个模板都是由%x[row,col]来指定输入数据中的一个token。row指定到当前token的行偏移,col指定列位置。