`

Hanlp中使用纯JAVA实现CRF分词

 
阅读更多

 

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

开源项目

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

CRF简介

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



 

CRF训练

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

CRF解码

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

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

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

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

实例

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




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

代码

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



 

 

标注结果

标注后将table打印出来:



 

最终处理

BEMS该合并的合并,得到:



 

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



 

新词识别

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



 

输出:



 

null表示新词。

 

转载自hankcs的博客

  • 大小: 64.7 KB
  • 大小: 9.8 KB
  • 大小: 63.3 KB
  • 大小: 72.9 KB
  • 大小: 6.8 KB
  • 大小: 7.3 KB
  • 大小: 5 KB
  • 大小: 16.9 KB
  • 大小: 16.3 KB
分享到:
评论

相关推荐

    src_seg(java).rar_java 分词_中文文本分词_分词 java_分词算法

    《Java实现中文文本分词算法详解》 在信息爆炸的时代,中文文本的处理与分析显得尤为重要,其中分词是基础且关键的一环。本篇文章将深入探讨如何利用Java语言实现中文文本的分词,旨在帮助开发者理解并掌握这一技术...

    java 中文分词插件

    Java中有许多著名的中文分词库,如HanLP、IK Analyzer、jieba分词、LTP(语言技术平台)等。这些库提供了API接口,使得开发者可以轻松集成到自己的项目中,实现高效准确的中文分词。 3. **raycool.plugin.ds.cws...

    Android代码-Java 实现的自然语言处理中文分词

    感知机分词、CRF分词 词典分词(侧重速度,每秒数千万字符;省内存) 极速词典分词 所有分词器都支持: 索引全切分模式 用户自定义词典 兼容繁体中文 训练用户自己的领域模型 词性标注 HMM词性标注(速度快...

    中文分词Java(FuDNLP)及Python使用

    - HanLP:由Java实现的分词工具,其分词结果会包含词性标注,使用时需配置模型路径,如在`hanlp.properties`文件中指定。 3. 其他工具和应用: - NLPTokenizer:可能是其他Java库提供的分词接口,其分词结果也...

    hanlp java包的源代码

    在Java编程中,HanLP是一个广泛应用的开源NLP库,由科大讯飞开发,提供了丰富的中文分词、词性标注、命名实体识别、依存句法分析等NLP任务的解决方案。本压缩包"hanlp java包的源代码"包含了HanLP的1.8.3版本,是...

    中文分词java

    通过Java API,开发者可以方便地将Jieba集成到项目中,实现高效且准确的分词。 2. **基于统计的分词**:为了处理未登录词和提高分词效果,统计模型如隐马尔可夫模型(HMM)、条件随机场(CRF)等被引入。例如,...

    hanlp1.8.3jar包下载

    hanlp,hankcs,支持中文分词(N-最短路分词、CRF分词、索引分词、用户自定义词调、词性标注),命名实体识别(中国人民、音译人民、日本人民,地名,实体机构名识别),关键词提取,自动摘要,短语提取,拼音转换,...

    中文分词算法

    2. 处理歧义:中文分词中的歧义问题是一个挑战,可以通过增加上下文信息、使用更复杂的模型来减少错误。 3. 新词识别:网络语言和专业术语的涌现要求分词系统具备一定的自学习和新词发现能力。 4. 并发处理:在大...

    中文分词系统的设计与实现1.zip

    6. **Java实现**:在Java环境中,可以利用Java的字符串处理能力,结合开源库(如结巴分词、HanLP、Stanford NLP等)进行分词系统开发。Java的跨平台性和丰富的库支持使得其成为实现分词系统的良好选择。 7. **测试...

    中文分词-哈工大软件学院中文信息处理刘秉权

    学生们会学习如何使用Java这样的编程语言实现分词算法,例如基于词典的分词方法、正向最大匹配法(FMM)、逆向最大匹配法(RMM)、双向最大匹配法(BMM)以及更先进的条件随机场(CRF)和神经网络模型如LSTM-CRF。...

    word源码java-node-hanlp:用于nodejs的HanLP

    支持中文分词(N-最短路分词、CRF分词、索引分词、用户自定义词典、词性标注),命名实体识别(中国人名、音译人名、日本人名、地名、实体机构名识别),关键词提取,自动摘要,短语提取,拼音转换,简繁转换,文本...

    中文分词工具包.zip

    在这个“中文分词工具包.zip”中,我们很可能会找到一系列针对中文文本进行分词处理的软件、库或者算法实现。下面将详细介绍中文分词的重要性、常见方法以及可能包含在压缩包内的资源。 1. **中文分词的重要性**: ...

    java中文分词代码[文].pdf

    Java中文分词是自然语言处理中的关键步骤,用于将连续的汉字序列切分成具有语义意义的词语单元,便于后续的文本分析、信息提取或搜索引擎索引等任务。本篇内容涉及一个Java实现的中文分词代码,由yzh于2004年5月12日...

    分词软件和源码

    在C#中,可以使用正则表达式或者自定义的分词类来实现分词。.NET Framework中的System.Text.RegularExpressions命名空间提供了强大的正则表达式工具。 4. **Python分词**: - Python因其简洁易读的语法和强大的...

    中文分词词组库及工具汇总(全).rar

    - **word**:可能指的是HanLP、LTP等具有"word"相关命名的分词工具,它们通常基于统计模型,如HMM或CRF,提供高精度的分词服务。 - **mmseg**:MMSEG(最小歧义切分算法)是一种基于动态规划的中文分词算法,旨在...

    搜索引擎-中文分词.zip

    在这个项目中,使用Java编程语言实现分词器是常见的选择,因为Java具有跨平台性、性能稳定和丰富的库支持。可能包含的Java代码会涉及到字符串处理、数据结构(如哈希表和队列)以及算法实现(如动态规划或贪心策略)...

    PHP中文分词

    在PHP中,有一些现成的中文分词库可以帮助我们快速实现这一功能,如`PSCWS`(PHP Simple Chinese Word Segmentation)、`Snownlp`、`HanLP-PHP`(对Java版HanLP的PHP封装)等。这些库通常提供了简单易用的API,...

    英文文本分词jar包与代码

    Java中常用的文本分词库有结巴分词(Jieba)、IK Analyzer、HanLP等,这些库不仅适用于中文,也支持英文分词。对于英文分词,Java中的`java.util.StringTokenizer`类是一个基础工具,但功能较为简单。更强大的库如...

    HanLp数据字典(1.3.3)

    对于未登录词(不在字典中的新词),HanLP会利用N-gram模型、CRF(条件随机场)等方法进行识别,确保在处理网络新词、人名、地名等特殊词汇时的准确性。 3. **词性标注**:在分词基础上,数据字典还用于词性标注,...

    典型相关分析matlab实现代码-java-summary-project:关于引用到HanLP项目的文本摘要(摘自hankcs/HanLP)

    HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。 HanLP提供下列功能: 中文分词 最短路分词 N-最短路...

Global site tag (gtag.js) - Google Analytics