HanLP-最短路径分词

简介: 今天介绍的内容是最短路径分词。最近换回了thinkpad x1,原因是mac的13.3寸的屏幕看代码实在是不方便,也可能是人老了吧,^_^。等把HanLP词法分析介绍结束后,还是会换回macbook pro的。

今天介绍的内容是最短路径分词。最近换回了thinkpad x1,原因是mac的13.3寸的屏幕看代码实在是不方便,也可能是人老了吧,^_^。等把HanLP词法分析介绍结束后,还是会换回macbook pro的。个人有强迫症,只要看或写Java或C/C++代码或者用开发机的化,还是喜欢在windows下工作。看论文特别是理论的研究还是习惯用mac了。感觉开发还是windows比较顺手,理论研究还是mac比较顺手。
基本思想:首先根据词典,找出字串中所有可能的词(也称全切分),然后构造词语切分有向无环图(也称作粗分词图或粗分词网)。每个词对应图中的一条有向边。若赋给相应的边长一个权值(该权值可以是常数,也可以是所构成的词的属性值),然后根据该切分图,在起点到终点的所有路径中,求出长度值(包括权值)为最短的一条路径,这条路径上包含的词就是该句子的切分结果。若每个结点处记录N个最短路径值,则该方法也称N-最短路径算法。
为进一步提高切分精度,在词典中增加词的属性值,即给每个词也给权重。这样每个词在汉字串中的权重不同(即构成的有向图的边不为等长)。最简单的词的权重可以用词频表示,高频词的权重大,低频词的权重小。具体的权重值可以通过大规模语料库获得。
虽然HanLP中提供了dijkstra算法的实现,但是当前HanLP中最短路径分词使用的是viterbi算法。
例子:他说的确实在理

遍历_1
计算过程和回溯分词过程
_2

(1) node列与to列
node列的词语为粗分词网中所有的词,to列为在node列为词word_node的情况下,后边接的所有可能的词word_to。第1个词语前边有一个“始”词,最后一个词语后边有一个“末”词。
(2) begin2node_w的计算
表示从“始”到node词的最短路径权值。可以从待计算值所在行的node列读取出word词,在to列中以待计算值所在行开始向上查找word,找到word所在行后(以首次遇到的词为准),begin2to_w列所对应的值就是待计算值。见图中下划线。第一个词对“始-他”的begin2node_w的值为0。
(3) node2to_w的计算

由node+w构成的2gram串的概率,也就是转移概率,计算公式为
_3

计算的HanLP代码为https://github.com/hankcs/HanLP/blob/master/src/main/java/com/hankcs/hanlp/utility/MathUtility.java calculateWeight(Vertex from, Vertex to)。“始”的频次取为MAX_FREQUENCY,“始-他”的共现频次值为“他”作为句首的频次,“理-末”的共现频次值为“理”作为句末的频次。
(4) begin2to_w_n的计算
表示从“始”到to词的最短路径权值。begin2to_w_n = begin2node_w + node2to_w。
(5) begin2to_w_o
表示记录在to词下的,到to词的最短路径权值,它的初始值为0,之后由begin2to_w来更新。
(6) from
表示词语to的前驱词。
_4

可以看表中(7,9),(8,10),(11,13),(12,14),(15,16),(17,18)成对行来验证该公式,其中只有(17.18)行满足了第3个式子。
(6)和(7)的HanLP实现代码https://github.com/hankcs/HanLP/blob/master/src/main/java/com/hankcs/hanlp/seg/common/Vertex.java updateFrom(Vertex from)
(8) 回溯确定分词路径
从“末”开始向前回溯,末->理->在->确实->的->说->他,可以看表中黄色单元格进行验证。
经过(6)、(7)两步,可以确保粗分词网中任意词的前驱都是最短路径的。
遍历计算过程和回溯过程的HanLP代码https://github.com/hankcs/HanLP/blob/master/src/main/java/com/hankcs/hanlp/seg/Viterbi/ViterbiSegment.java viterbi(WordNet wordNet)
_5

相关文章
|
自然语言处理
HanLP分词工具中的ViterbiSegment分词流程
本篇文章将重点讲解HanLP的ViterbiSegment分词器类,而不涉及感知机和条件随机场分词器,也不涉及基于字的分词器。因为这些分词器都不是我们在实践中常用的,而且ViterbiSegment也是作者直接封装到HanLP类中的分词器,作者也推荐使用该分词器,同时文本分类包以及其他一些自然语言处理任务包中的分词器也都间接使用了ViterbiSegment分词器。
1062 0
|
自然语言处理
Ansj与hanlp分词工具对比
一、Ansj1、利用DicAnalysis可以自定义词库: 2、但是自定义词库存在局限性,导致有些情况无效:比如:“不好用“的正常分词结果:“不好,用”。 (1)当自定义词库”好用“时,词库无效,分词结果不变。
1060 0
|
自然语言处理 算法
自然语言处理工具HanLP-N最短路径分词
本篇给大家分享baiziyu 写的HanLP 中的N-最短路径分词。以为下分享的原文,部分地方有稍作修改,内容仅供大家学习交流!首先说明在HanLP对外提供的接口中没有使用N-最短路径分词器的,作者在官网中写到这个分词器对于实体识别来说会比最短路径分词稍好,但是它的速度会很慢。
1773 0
|
自然语言处理 算法 图计算
Hanlp中N最短路径分词详细介绍
N-最短路径 是中科院分词工具NLPIR进行分词用到的一个重要算法,张华平、刘群老师在论文《基于N-最短路径方法的中文词语粗分模型》中做了比较详细的介绍。该算法算法基本思想很简单,就是给定一待处理字串,根据词典,找出词典中所有可能的词,构造出字串的一个有向无环图,算出从开始到结束所有路径中最短的前N条路径。
1381 0
|
自然语言处理 算法 测试技术
分词工具Hanlp基于感知机的中文分词框架
结构化感知机标注框架是一套利用感知机做序列标注任务,并且应用到中文分词、词性标注与命名实体识别这三个问题的完整在线学习框架,该框架利用
2042 0
|
自然语言处理
如何在hanlp词典中手动添加未登录词
我们在使用hanlp词典进行分词的时候,难免会出现分词不准确的情况,原因是由于内置词典中并没有收录当前的这个词,也就是我们所说的未登录词,只要把这个词加入到内置词典中就可以解决类似问题,如何操作,下面我们就看一下具体的步骤
2631 0
|
自然语言处理 Java C++
Hanlp分词之CRF中文词法分析详解
这是另一套基于CRF的词法分析系统,类似感知机词法分析器,提供了完善的训练与分析接口。   CRF的效果比感知机稍好一些,然而训练速度较慢,也不支持在线学习。 默认模型训练自OpenCorpus/pku98/199801.txt,随hanlp 1.6.2以上版本发布。
3477 0
|
自然语言处理
在Hanlp词典手动添加未登录词的方式介绍
在使用Hanlp词典进行分词的时候,会出现分词不准的情况,原因是内置词典中并没有收录当前这个词,也就是我们所说的未登录词,只要把这个词加入到内置词典中就可以解决类似问题,如何操作呢,
1111 0