CRF++笔记。


NLP引入

NLP流程
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/

安装

  1. 解压
  2. cd 进入解压后的目录,执行‘./configure’命令
  3. make 编译
  4. make install (需先执行“su”获取root用户权限)
  5. make clean 删除安装时产生的临时文件(可不执行)

使用

  两个过程:训练、测试。

数据格式

  训练和测试文件必须包含多个tokens,每个token又包含多个列。token的定义可根据具体的任务,如词、词性等。每个token必须写在一行,且各列之间用空格或制表格间隔。一个token的序列可构成一个sentence,每个sentence之间用一个空行间隔。注意最后一列将是被CRF用来训练的最终标签。

特征模板

  CRF++训练的时候,要求我们自己提供特征模板。
  模板文件中的每一行是一个模板。每个模板都是由%x[row,col]来指定输入数据中的一个token。row指定到当前token的行偏移,col指定列位置。

参考文献

用CRF做命名实体识别(三)
NLP之CRF++安装及使用