CRF:分词、人名识别应用

以前介绍过HMM用于词汇切分,这里介绍条件随机场(CRF)这个更合适的模型。CRF是给定随机变量X 的情况下,随机变量Y 的马尔科夫随机场。CRF是一种判别式模型,而线性链CRF可以用来进行序列标注。

在条件概率模型P( Y X )中,Y 是输出变量,表示标记序列,X 是输入变量,表示需要进行标注的观测序列。相应地,在中文分词中,Y 是状态序列,X 是句子中字的序列。例如,B M E分别表示词的开始、中间、结束位置上的字,而S表示单个字。

X:共享单车让自行车企业获得新生

Y:B E B E S B M E B E B E B E

CRF用于词汇切分包含三个过程:特征处理、CRF训练和使用CRF进行切分。

特征处理

我们将单独的字视为随机变量,使用uni-gram模型,仅考虑每个字的前一个字和后一个字,即将将每个字的[ 前中后,前中,中后,前后,前,中,后 ]作为这个字的特征输入(“中”代表自己):

feature_dic["qzh"]=sen[i-1]+sen[i]+sen[i+1]

feature_dic["qz"]=sen[i-1]+sen[i]

feature_dic["zh"]=sen[i]+sen[i+1]

feature_dic["qh"]=sen[i-1]+sen[i+1]

feature_dic["q"]=sen[i-1]

feature_dic["z"]=sen[i]

feature_dic["h"]=sen[i+1]

其中,sen为输入的句子,即X。上述把X变换为uni-gram特征。当然也可以使用更复杂的特征。

CRF训练

与其他机器学习算法使用的训练算法类似,比如随机梯度下降、拟牛顿法等等。如果只是使用CRF,而不进行模型改进,可以使用Python的CRF库:sklearncrfsuite作为分词的模型。具体的API 文档见https://sklearn-crfsuite.readthedocs.io/en/latest/tutorial.html。

CRF的训练使用这个库提供的类似sklearn 的训练接口fit 函数进行训练,获得模型。

crf = sklearn_crfsuite.CRF(

algorithm='lbfgs', #使用基于拟牛顿法的梯度下降算法(lbfgs)

c1=0.1, #L1 正则系数

c2=0.1, #L2 正则系数

max_iterations=200, #迭代200次

all_possible_transitions=True

)

crf.fit(x_train, y_train) #模型训练

使用CRF进行分词

训练好的CRF模型可以使用前向-后向算法计算概率,选择概率最大的序列作为标注序列输出。CRF 的预测(分词)算法则比较简单,调用库里的predict_single接口,基于训练好的模型,使用前向-后向算法进行预测。

char=predict_input(sen)

path = crf.predict_single(char)

sen=sen.decode("utf8")

res=[]

str_=""

以下是根据状态序列中的BMES来提取句子中的词汇。

for i in range(len(sen)):

if path[i]=="B":

str_=""

str_+=sen[i]

if path[i]=="M":

str_+=sen[i]

if path[i]=="E":

str_+=sen[i]

if len(str_)!=0:

res.append(str_)

if path[i]=="S":

res.append(sen[i])

str_=""

最后str即为切分结果。

由于CRF是一种序列标注模型,因此在许多场合都可以使用,《互联网大数据处理技术与应用》的第五章则是展示了CRF用于人名识别的方法。

作者编著的《互联网大数据处理技术与应用》专著(清华大学出版社,2017)、同名公众号,专注于大数据技术的相关科学和工程知识传播,同时也为读者提供一些拓展阅读材料。关注后可阅读以前推送的原创文章。部分如下,关注后可阅读更多原创文章。欢迎选用本书做大数据相关的教材,有相关教学资源共享。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180106G0MH7K00?refer=cp_1026

扫码关注云+社区