开源自然语言处理工具包hanlp中CRF分词实现详解

简介:  CRF简介CRF是序列标注场景中常用的模型,比HMM能利用更多的特征,比MEMM更能抵抗标记偏置的问题。[gerative-discriminative.png] CRF训练这类耗时的任务,还是交给了用C++实现的CRF++。

 CRF简介

CRF是序列标注场景中常用的模型,比HMM能利用更多的特征,比MEMM更能抵抗标记偏置的问题。

[gerative-discriminative.png] 

CRF训练

这类耗时的任务,还是交给了用C++实现的CRF++。关于CRF++输出的CRF模型,请参考《CRF++模型格式说明》。 

CRF解码

解码采用维特比算法实现。并且稍有改进,用中文伪码与白话描述如下:

首先任何字的标签不仅取决于它自己的参数,还取决于前一个字的标签。但是第一个字前面并没有字,何来标签?所以第一个字的处理稍有不同,假设第0个字的标签为X,遍历X计算第一个字的标签,取分数最大的那一个。

如何计算一个字的某个标签的分数呢?某个字根据CRF模型提供的模板生成了一系列特征函数,这些函数的输出值乘以该函数的权值最后求和得出了一个分数。该分数只是“点函数”的得分,还需加上“边函数”的得分。边函数在本分词模型中简化为f(s,s),其中s’为前一个字的标签,s为当前字的标签。于是该边函数就可以用一个4*4的矩阵描述,相当于HMM中的转移概率。

实现了评分函数后,从第二字开始即可运用维特比后向解码,为所有字打上BEMS标签。 

实例

还是取经典的“商品和服务”为例,首先HanLPCRFSegment分词器将其拆分为一张表:

 

 1088cd91b908bd246812442ce245e201dc94410b

null表示分词器还没有对该字标注。

代码

上面说了这么多,其实我的实现非常简练:

93ad379f5b89a281995ea97833a9b70ab698af0b 

9709491694b9b15cf705b5502f5dd89339919e40 

2034a6a2fff22c293e50617d42bfba8cacb39d32 


标注结果

标注后将table打印出来:

1889d10113a2ad6c50452b640ee79addd7a87f17 


最终处理

 

BEMS该合并的合并,得到:

[商品/null, /null, 服务/null]

然后将词语送到词典中查询一下,没查到的暂时当作nx,并记下位置(因为这是个新词,为了表示它的特殊性,最后词性设为null),再次使用维特比标注词性:

[商品/n, /cc, 服务/vn]

新词识别

 

CRF对新词有很好的识别能力,比如:

CRFSegment segment = new CRFSegment();

segment.enablePartOfSpeechTagging(true);

System.out.println(segment.seg("你看过穆赫兰道吗"));

输出

 

CRF标注结果

  S   

  S   

  S   

  B   

  M   

  M   

  E   

  S   

[/rr, /v, /uguo, 穆赫兰道/null, /y]

 

null表示新词。

 


相关文章
|
4月前
|
自然语言处理 算法 Python
【Python自然语言处理】规则分词中正向、反向、双向最大匹配法的讲解及实战(超详细 附源码)
【Python自然语言处理】规则分词中正向、反向、双向最大匹配法的讲解及实战(超详细 附源码)
57 0
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
通义千问开源模型——改变自然语言处理的未来
众所周知,自然语言处理是人工智能领域的一个重要分支,也是近年来备受瞩目的领域之一。而通义千问开源模型作为自然语言处理领域的重要成就之一,近年来也引起了广泛的关注和讨论,那么接下来就来简单聊聊通义千问开源模型。
1077 0
通义千问开源模型——改变自然语言处理的未来
|
8月前
|
机器学习/深度学习 自然语言处理 数据可视化
nlp入门之spaCy工具的使用
本文作为nlp开山篇的第四篇,简要介绍了spaCy工具的用法
|
8月前
|
机器学习/深度学习 数据采集 自然语言处理
nlp入门之nltk工具的使用
本文作为nlp入门开山第三篇,简要的介绍了nltk工具的使用
|
9月前
|
数据采集 人工智能 自然语言处理
用于提取数据的三个开源NLP工具
用于提取数据的三个开源NLP工具
165 0
|
9月前
|
机器学习/深度学习 数据采集 人工智能
NLP之文本分词综述
NLP之文本分词综述
283 0
|
10月前
|
自然语言处理 Python
【NLP Tool -- NLTK】NLTK进行英文情感分析、分词、分句、词性标注(附代码)
NLP自然语言处理之NLTK工具的使用,进行英文情感分析、分词、分句、词性标注(附代码)
481 0
|
11月前
|
自然语言处理 达摩院 开发者
|
11月前
|
自然语言处理 知识图谱
|
11月前
|
自然语言处理 文字识别 达摩院