今天介绍的内容是最短路径分词。最近换回了thinkpad x1,原因是mac的13.3寸的屏幕看代码实在是不方便,也可能是人老了吧,^_^。等把HanLP词法分析介绍结束后,还是会换回macbook pro的。个人有强迫症,只要看或写Java或C/C++代码或者用开发机的化,还是喜欢在windows下工作。看论文特别是理论的研究还是习惯用mac了。感觉开发还是windows比较顺手,理论研究还是mac比较顺手。

基本思想:首先根据词典,找出字串中所有可能的词(也称全切分),然后构造词语切分有向无环图(也称作粗分词图或粗分词网)。每个词对应图中的一条有向边。若赋给相应的边长一个权值(该权值可以是常数,也可以是所构成的词的属性值),然后根据该切分图,在起点到终点的所有路径中,求出长度值(包括权值)为最短的一条路径,这条路径上包含的词就是该句子的切分结果。若每个结点处记录N个最短路径值,则该方法也称N-最短路径算法。

为进一步提高切分精度,在词典中增加词的属性值,即给每个词也给权重。这样每个词在汉字串中的权重不同(即构成的有向图的边不为等长)。最简单的词的权重可以用词频表示,高频词的权重大,低频词的权重小。具体的权重值可以通过大规模语料库获得。

虽然HanLP中提供了dijkstra算法的实现,但是当前HanLP中最短路径分词使用的是viterbi算法。

例子:他说的确实在理

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

(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串的概率,也就是转移概率,计算公式为

计算的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的前驱词。

可以看表中(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)

最新文章

  1. static变量引起的问题,List数据覆盖
  2. SQLiteDeveloper破解
  3. 二模14day2解题报告
  4. C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
  5. bitmap转化base64
  6. Linux学习笔记(15)shell基础之Bash基本功能
  7. ECSHOP修改后台地址
  8. Integer封装与拆箱
  9. bzoj 2244: [SDOI2011]拦截导弹
  10. KMP算法及java实现
  11. mysql常用数据类型的选择
  12. 《转》使用JAVA如何对图片进行格式检查以及安全检查处理
  13. C语言程序代写(QQ:928900200)
  14. 一只菜鸟的瞎J8封装系列的目录
  15. win7中用 httplistener 出现 503 错误的问题
  16. weakref 待解决.
  17. 利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl
  18. 跨平台移动APP开发进阶(四)AngularJS简介
  19. Ubuntu 16.04 总出现红色圆圈警告和检测到系统程序出现问题
  20. 六.ansible批量管理服务

热门文章

  1. jsp上传超大文件解决方案
  2. Count the Buildings ( s1 )
  3. hdu 5761 Rower Bo 微分方程
  4. codevs 2924 数独挑战 x(三种做法+超详细注释~)
  5. Python 简易Cmd控制
  6. 【CUDA 基础】2.3 组织并行线程
  7. 灰度图像--图像增强 直方图匹配(规定化)Histogram Specification
  8. Hadoop-2.7.5完全分布式搭建
  9. js小数点相乘或相除出现多位数的问题
  10. Appium移动自动化测试(三)之元素定位