自然语言处理之:c++中文分词(附源码)
: 一、简介 中文分词是地然语言处理中的最基础的环节,到目前为止已经有不少优秀的分词工具的出现,如“中科院分词”,“结巴分词”等。个人认为在中文分词领域在算法层面上虽层出不穷,但归其根本仍然是大同小异,基于统计的分词算法在根本上并无太大差别,因此我写的这个分词算法在保证高准确性的情况下以实用性,灵活性为主打方向。
二、wordseg分词算法 借鉴结巴分词的思想,采用基于词典的有向无环图算法结合HMM隐马尔科夫模型分词。关于结巴分词已经有非常成熟的版本了,本分词工具中的基础词典也是结巴分词的词典加上自己整理的新词。wordseg分词工具基本思路如下:
三、HMM模型和基于词典分词的异同点
-
相同点 都是采用统计的方法:基于词典的DAG分词利用了词频作为每个词的概率,最后计算整句的联合概率;从另一个角度看HMM,也是统计了词语概率分布情况,例如“中国”这个词,P(B)*P(中|B)*P(E)*P(国|E) 就是该词的概率,只不过采用了另外的形式用转移矩阵和发射矩阵来计算。采用同一份训练语料可以同时生成分词词典和HMM矩阵。 消歧算法:词典分词采用了最短路径算法,HMM分词采用了维特比算法,仔细研究这两种算法不难发现这两种算法是很类似的。 不同点 词典分词基于的是自定义词典,会更加准确但是对未登录词无法识别,不在词典中的词的概率为零,而HMM则相对模糊,任意两个字之间都能转移概率,像“XX路”这种词语,由于“路”作为“E”的概率很大,很容易被识别为实体词,这对于命名实体识别别具效果。
四、当前分词领域的难点 中文分词发展到今天,就算法层面上来看,各大算法虽别具一格但都殊途同归,各有利弊,对于常规词语效果相差无几。中文分词的瓶颈在于未登录词,放眼到实际业务中,真正对业务效果有影响的是垂直领域类的未登录词,市面上的各种开源分词工具都无法做到,这在业界也是一难题。在具体的业务中往往要通过一些实体词挖掘,新词挖掘方法来补充词典,对于不同的业务,词语的粒度都不一样,因此还需要具体问题具体解决。
五、wordseg分词工具的使用 直接使用程序:下载githup代码,commom, dict, wordseg 放在同一目录下,在wordseg目录下执行make生成可执行文件seg 即可。 ./seg 0 ../dict/seg/ inputfile(输入文件) outputfile(输出文件) 分词函数使用示例见 main.cpp
下一篇:
学习 Java,使用哪个版本最好