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

阅读更多

[align=center;" align="center]

CRF简介

[gerative-discriminative.png]

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

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

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

实例



[img]http://dl2.iteye.com/upload/attachment/0131/5720/120ec50c-b4a1-324f-88e8-a8abdc861963.png" alt="[/img]



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

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

[img]http://dl2.iteye.com/upload/attachment/0131/5722/b01f6645-b76b-395c-84a2-efad72b1e624.jpg" alt="[/img]


[img]http://dl2.iteye.com/upload/attachment/0131/5724/1f87fd23-8996-3445-b4dd-3b1d48fb02e5.jpg" alt="[/img]
 

[img]http://dl2.iteye.com/upload/attachment/0131/5726/ec1200f1-e786-3696-a5f8-d44028f3e3f0.jpg" alt="[/img]





标注结果


[img]http://dl2.iteye.com/upload/attachment/0131/5728/aac46b8a-6889-38d9-a405-20bb50ef1a7c.jpg" alt="[/img]



最终处理

将BEMS该合并的合并,得到:

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

新词识别

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

segment.enablePartOfSpeechTagging(true);

输出

CRF标注结果

看   S  

穆   B  

兰   M  

吗   S  





[/align]

 

  • 开源自然语言处理工具包hanlp中CRF分词实现详解_第1张图片
  • 大小: 4.8 KB
  • 开源自然语言处理工具包hanlp中CRF分词实现详解_第2张图片
  • 大小: 48.8 KB
  • 开源自然语言处理工具包hanlp中CRF分词实现详解_第3张图片
  • 大小: 59.4 KB
  • 开源自然语言处理工具包hanlp中CRF分词实现详解_第4张图片
  • 大小: 21.9 KB
  • 开源自然语言处理工具包hanlp中CRF分词实现详解_第5张图片
  • 大小: 8 KB
  • 查看图片附件

你可能感兴趣的:(开源自然语言处理工具包hanlp中CRF分词实现详解)