本篇文章将重点讲解HanLP的ViterbiSegment分词器类,而不涉及感知机和条件随机场分词器,也不涉及基于字的分词器。因为这些分词器都不是我们在实践中常用的,而且ViterbiSegment也是作者直接封装到HanLP类中的分词器,作者也推荐使用该分词器,同时文本分类包以及其他一些自然语言处理任务包中的分词器也都间接使用了ViterbiSegment分词器。
今天的文章还会介绍各分词词典文件的使用位置以及作用,相信小伙伴们看了今天的文章应该不会再在github上提出干预自定义不生效的问题了。进入正题,本篇的内容比较多,建议收藏后再细读。
1. 分词器配置变量
分词器的相关配置定义在Config.java类中,这里我们将分词相关的所有配置变量列于下表
图1
这种配置类什么时候实例化呢,不用想肯定是分词开始前就会实例化,拿HanLP类中的ViterbiSegment分词类举例。该类的继承关系用如下图所示:
图2
由继承关系图可以看到,只要实例化ViterbiSegment则首先会执行Segment()初始化,在该方法中实例化分词器配置对象config。这些配置变量都是公有变量,因此可以在ViterbiSegment类实例化为对象后直接在外部修改。那么什么时候来使用这些配置变量呢,当然是在分词的时候,具体是哪个类的哪个方法呢,当然是ViterbiSegment类的List<Term> segSentence(char[] sentence)方法。
另外请注意上边的3个类,所有ViterbiSegment的分词方法都集中在这3个类中。
2. 词典的使用条件和先后顺序(也介绍分词流程)
我们知道了词典配置变量使用的位置后,就可以确定每个词典的使用条件了以及每个词典的使用顺序
1. 词语粗分
(1)构建词图
对应方法为void generateWordNet(final WordNet wordNetStorage),在此方法中系统使用CoreNatureDictionary.txt文件切分出所有可能的分词路径。此时如果配置变量useCustomDictionary为true,则将CustomDictionary.txt中的词也考虑进来,说明CustomDictionary.txt优先级会高。另外大家可以看到CoreNatureDictionary.txt实际上也充当了隐马词性标注的发射矩阵,里边某些多词性词也列出了词性序列以及各词性对应的频次。
(2)用户定制词典干预
如果配置变量useCustomDictionary为true,即需要使用CustomDictionary.txt进行干预,则执行下边对应的方法,否则跳过该步骤。用户词典干预根据是否进行全切分有两种不同方法:当配置变量indexMode>0时,即系统处于全切分模式时,对应方法为
List<Vertex> combineByCustomDictionary(List<Vertex> vertexList, DoubleArrayTrie<CoreDictionary.Attribute> dat, final WordNet wordNetAll),
如果indexMode=0,即系统处于普通分词模式,对应方法为
List<Vertex> combineByCustomDictionary(List<Vertex> vertexList, DoubleArrayTrie<CoreDictionary.Attribute> dat)。
从调用的方法我们不难看出,全切分时系统会根据CustomDictionary.txt添加分词路径。而普通切分时,系统会根据CustomDictionary.txt合并路径。这也就是为什么有的时候明明已经在CustomDictionary.txt中添加了新词却不生效的原因,因为一旦根据CoreNatureDictionary.txt构建了词图就不会再有新的路径插到已有分词路径中间,此时就去查找并修改CoreNatureDictionary.txt中的相关字或词吧。
(3)维特比选择最优路径
对应方法为List<Vertex> viterbi(WordNet wordNet),至此就得到了一个粗分的分词结果。需要注意HanLP的Viterbi分词只是用viterbi方法求解最优路径,并不是隐马。
3. 数字识别
如果配置变量numberQuantifierRecognize为true,则在粗分结果的基础上进行数字合并操作,否则直接跳过该步。对应方法为
void mergeNumberQuantifier(List<Vertex> termList, WordNet wordNetAll, Config config)。
4. 实体识别
配置变量ner为true时,则需要进行各种实体的识别,继续向下执行。需要注意该变量受其他实体识别变量影响,只要其他任意实体配置变量为true,则ner就会为true。如果ner为false,则跳过下边各项实体识别继续词性标注环节。
(1)中国人名识别
执行此步,配置变量nameRecognize必须为true。调用方法为
PersonRecognition.recognition(vertexList, wordNetOptimum, wordNetAll)。人名使用隐马,因此有转移矩阵nr.tr.txt和发射矩阵nr.txt。由于HanLP不提供训练语料,我们自己也很难得到有角色标注的语料,因此我们一般只修改nr.txt文件,删除nr.txt.bin文件后生效。
(2)音译人名识别
执行此步,配置变量translatedNameRecognize必须为true。调用方法为
TranslatedPersonRecognition.recognition(vertexList, wordNetOptimum, wordNetAll)。需要注意音译人名的识别没有用隐马,就是匹配分词法。涉及到的词典为nrf.txt,如果用户修改该词典,则需要删除nrf.txt.trie.dat使其生效。
(3)日本人名识别
执行此步,配置变量japaneseNameRecognize必须为true。调用方法为
JapanesePersonRecognition.recognition(vertexList, wordNetOptimum, wordNetAll)。需要注意日本人名的识别没有用隐马,就是匹配分词法。涉及到的词典为nrj.txt,如果用户修改该词典,则需要删除nrj.txt.trie.dat和nrj.txt.value.dat使其生效。
(4)地名识别
执行此步,配置变量placeRecognize必须为true。调用方法为
PlaceRecognition.recognition(vertexList, wordNetOptimum, wordNetAll)。地名使用隐马,因此有转移矩阵ns.tr.txt和发射矩阵ns.txt。由于HanLP不提供训练语料,我们自己也很难得到有角色标注的语料,因此我们一般只修改ns.txt文件,删除ns.txt.bin文件后生效。
(5)机构名识别
执行此步,配置变量organizationRecognize必须为true。调用方法为
OrganizationRecognition.recognition(vertexList, wordNetOptimum, wordNetAll)。注意这里在调用机构名识别之前先进行了一次识别,也就是层叠隐马,而人名和地名的识别就是普通的隐马。机构名的识别使用层叠隐马,涉及的文件有转移矩阵nt.tr.txt和发射矩阵nt.txt。由于HanLP不提供训练语料,我们自己也很难得到有角色标注的语料,因此我们一般只修改nt.txt文件,删除ns.txt.bin文件后生效。机构名的识别需要人名地名识别具有较高准确率。
至此,分词流程已全部介绍了。
还需要注意下边的内容
其他没有在系统中使用的词典有
机构名词典.txt
全国地名大全.txt
人名词典.txt
上海地名.txt
现代汉语补充词库.txt
这些词典是对系统中的词典的更新记录,如果你添加了新的人名、地名、机构名可以在这里添加保存。
另外,如果需要添加人名、地名、机构名可以直接在CoreNatureDictionary.txt中添加,最好是3字以上实体,
如果要去掉错误识别的命名实体可以直接在相应的nr.txt,ns.txt,nt.txt中添加。
3. 多线程分词
HanLP的ViterbiSegment分词器类是支持多线程的,线程数量由配置变量threadNumber决定的,该变量默认为1。HanLP作者说ViterbiSegmet分词效率最高的原因肯定也有ViterbiSegment分词器支持多线程分词这个因素。另外由于ViterbiSegment分词器内部所具有的相关命名实体功能,因此这些命名实体识别的效率也会很高。在哪里实现的多线程分词呢,在Segment类的List<Term> seg(String text)这个方法中实现的,需要注意HanLP的多线程分词指的是一次输入了一个长文本,而不是一次处理多个输入文本。
本文分享自 baiziyu 的专栏,正文内容已经做了部分修改,便于大家阅读,欢迎一起交流学习!
相关推荐
hanlp分词各类词性状态表: 比如: a 形容词 ad 副形词 b 区别词 n 名词 h 前缀 i 成语 j 简称略语 k 后缀 l 习用语 m 数词 mg 数语素 Mg 甲乙丙丁之类的数词 mq 数量词
elasticsearch-6.4.2 hanlp分词插件 windows下安装命令 首先进入es bin目录 elasticsearch-6.4.2\bin> 然后执行 elasticsearch-plugin.bat install file:///E:/elasticsearch-analysis-ik-6.4.2.zip Linux下安装...
HanLP是由科大讯飞开发的一款高性能的自然语言处理工具包,它提供了丰富的中文分词、词性标注、命名实体识别等功能。 首先,我们需要理解如何使用HanLP进行分词。HanLP的核心是基于统计的分词模型,它能够将输入的...
基于HanLP对地址字符串分词流程图.eddx
HanLP是一个开源的中文自然语言处理工具包,支持多种分词方式和自然语言处理任务。通过本插件,用户可以在Elasticsearch中使用HanLP的各种分词算法,从而提升中文文本的索引和搜索效果。 项目的主要特性和功能 ...
而HanLP作为一款优秀的中文自然语言处理工具,其分词功能得到了广泛的应用和认可。 首先,让我们来了解一下什么是分词。简单来说,分词就是将连续的文本切分成一个个独立的词语,为后续的文本分析提供基础数据。分词...
ElasticSearch安装包整理,包含Hanlp分词,IK分词,x-pack,,Mysql动态加载停用词、基础词、同义词,个人整理的ElasticSearch7.9.0安装压缩包,其中的同义词,基础词,停用词mysql动态加载属于个人完善并编译,多年...
1. 修改了hanlp-portable-1.7.3源码中线程不安全问题 2. 修改了elasticsearch-analysis-hanlp-7.x.x插件源码对于es7版本适配性问题,更换新的hanlp-portable源码 3. 新增了人名,车牌,电子邮件,行政区划地址的感知...
在选择分词工具时,如HanLP,我们需要考虑其在社区的活跃度、开源性、易用性和广泛应用程度等因素。例如,HanLP因其高效、准确和灵活的特点,在Java中被广泛使用,其源代码可以在GitHub上查看和学习。 总的来说,...
然而,`Lucene5`默认的分词器对中文支持不够完善,因此需要借助第三方分词工具来增强其中文处理能力。 `HanLP`(全称:High-performance Natural Language Processing)是由网易有道公司开源的一个自然语言处理工具...
最近适用了这五款分词工具,光是下载安装就踩了很多坑,特别是pyltp和hanlp,装到我怀疑人生。 以下是整理的安装过程和注意事项。 希望能给大家提供些帮助。 目录一、Nlpir第一步:下载工具。第二步:下载后,解压,...
《基于HanLP分词和Bayes分类器实现的问答机器人》是一个典型的自然语言处理(NLP)项目,主要应用于Python编程环境下。这个课程设计旨在帮助学生掌握如何利用现代的NLP工具和技术构建一个智能问答系统。下面将详细...
HanLP是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点;提供词法分析(中文分词、词性标注、命名实体识别)、句法...
HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。 在提供丰富功能的同时,HanLP内部模块坚持低耦合、...
最新中文分词工具jar包,使用方便,分词准确,中文分析的一个不错的包
常用的中文分词工具包括IKAnalyzer和HanLP。 ### 知识点二:IKAnalyzer与HanLP #### 1. IKAnalyzer IKAnalyzer是一款开源的中文分词组件,广泛应用于搜索引擎中进行文本索引和查询时的分词处理。它支持多种分词...
在IT行业中,关键词分词工具是一项非常重要的技术,特别是在搜索引擎优化(SEO)、网络广告投放(如百度竞价)以及自然语言处理等领域。标题提到的“关键词分词工具(宏命令) 改进版”是一个专为竞价员设计的工具,...
关键词分词工具带宏关键词分词工具带宏关键词分词工具带宏关键词分词工具带宏关键词分词工具带宏
百度竞价推广关键词自动分词工具,wps可用,需启用宏
几种分词工具都试过,对于中文来说的的话个人觉得IKAnalyzer 最好用,不同版本的IKAnalyzer jar包,包括IKAnalyzer6.5.0、IKAnalyzer5.0、IKAnalyzer2012,IKAnalyzer6.5.0可完美兼容Lucene6+,IKAnalyzer5.0兼容...