Hanlp中使用纯JAVA实现CRF分词

简介: 与基于隐马尔可夫模型的最短路径分词、N-最短路径分词相比,基于条件随机场(CRF)的分词对未登录词有更好的支持。本文(HanLP)使用纯Java实现CRF模型的读取与维特比后向解码,内部特征函数采用 双数组Trie树(DoubleArrayTrie)储存,得到了一个高性能的中文分词器。

与基于隐马尔可夫模型的最短路径分词、N-最短路径分词相比,基于条件随机场(CRF)的分词对未登录词有更好的支持。本文(HanLP)使用纯Java实现CRF模型的读取与维特比后向解码,内部特征函数采用 双数组Trie(DoubleArrayTrie)储存,得到了一个高性能的中文分词器。

开源项目

本文代码已集成到HanLP中开源:http://hanlp.com/

CRF简介

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

4fed7157936d469e9b85002468aaba002e13ca64

CRF训练

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

CRF解码

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

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

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

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

实例

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

 bec4f1903b4c35d96d55cc2605f48d138b61f251

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

代码

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

 9c9c5620ab38a13a9e6f7676db2a96c37dd7359b3151f9749af2e168d35b0c6894ea0b5bae82c258

标注结果

标注后将table打印出来:

 e294a98732cafc20e213511bf6dff4425138adf7

最终处理

BEMS该合并的合并,得到:

 8ef56213c4119c0891d6a592736522b34a068178

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

 d4037c86fc58cde3caefc0f95e2bf45e191ace27

新词识别

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

 2bc7f592661e76978ab57e0cea353cb2cc4a6bbd

输出:

 2a4d7eafc10d40fa8e30ea71c0be6adf4003b27e

null表示新词。

 

转载自hankcs的博客

相关文章
|
3月前
|
自然语言处理 算法 Java
HanLP — 汉字转拼音,简繁转换 -- JAVA
HanLP — 汉字转拼音,简繁转换 -- JAVA
69 0
|
3月前
|
算法 Java
HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java
HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java
42 0
|
Java
Java 实现汉字按照首字母分组排序
Java 实现汉字按照首字母分组排序
708 0
|
数据采集 自然语言处理 算法
java应用集成HanLP进行中文自然语言分词详细完整案例以及demo源码
java应用集成HanLP进行中文自然语言分词详细完整案例以及demo源码
50710 1
java应用集成HanLP进行中文自然语言分词详细完整案例以及demo源码
|
Java 数据安全/隐私保护
JAVA 实现上传图片添加水印(详细版)(上)
JAVA 实现上传图片添加水印(详细版)
1258 0
JAVA 实现上传图片添加水印(详细版)(上)
|
网络协议 Java
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
ip地址的分类: 1、ipv4、ipv6 127.0.0.1:4个字节组成,0-255,42亿;30亿都在北美,亚洲就只有4亿 2011年就用尽了。
Java网络编程:UDP/TCP实现实时聊天、上传图片、下载资源等
|
自然语言处理 算法 Java
Java代码工具之中英文语句分词
中文语句分词支持的分词算法包括Lucene、Ansj、corenlp、HanLP、IKAnalyzer、Jcseg、Jieba、mmseg4j、MYNLP、Word等10种;英文语句分词支持的分词算法包括IKAnalysis、StanfordNlp等两种主流算法。
502 0
Java代码工具之中英文语句分词
|
自然语言处理
自然语言处理hanlp------3java调用hanlp
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
自然语言处理hanlp------3java调用hanlp
|
Java
Java实现拼图小游戏(7)——查看完整图片(键盘监听实例2)
由于在移动和图片中我们已经添加了键盘监听,也继承了键盘监听的接口,那么我们只需要在重写方法内输入我们的代码即可
215 0
|
存储 Java
Java实现图书管理系统
本篇文章是对目前Java专栏已有内容的一个总结练习,希望各位小主们在学习完面向对象的知识后,可以阅览本篇文章后,自己也动手实现一个这样的demo来加深总结应用已经学到知识并进行巩固。
416 0
Java实现图书管理系统