以前介绍过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)、同名公众号,专注于大数据技术的相关科学和工程知识传播,同时也为读者提供一些拓展阅读材料。关注后可阅读以前推送的原创文章。部分如下,关注后可阅读更多原创文章。欢迎选用本书做大数据相关的教材,有相关教学资源共享。
领取专属 10元无门槛券
私享最新 技术干货