中文分词算法现在一般分为三类:基于字符串匹配,基于理解,基于统计的分词。
基于字符串匹配分词:机械分词算法,这里我们主要说这种算法。
将待分的字符串与一个充分大的机器词典中的词条进行匹配。分为正向匹配和逆向匹配;最大长度匹配和最小长度匹配;单纯分词和分词与标注过程相结合的一体化方法。
所以常用的有:正向最大匹配,逆向最大匹配,最少切分法。
一、中文处理方式
1.单字方式 例如: 今天天气不错 [今] [天] [天] [气] [不] [错]
2.二元覆盖方式 例如: 今天天气不错 [今天] [天天] [天气] [气不] [不错]
3.分词方式 例如: 今天天气不错 [今天] [天气] [不错]
二、简单分词算法
单字与二元都属于很基础的中文处理方式,
StandardAnalyzer
Lucene自带的标准分词器,对中文实行的是按字分词。
CJKAnalyzer
Lucene Common包带的分词器,按照二元覆盖的方法实现。
三、词典数据结构(机械分词)
由于词典动辄几十上百万的词,在匹配的时候为了更快的索引到是否有匹配的词,词典的数据结构显得尤为重要。
1.前缀树--Trie树
Trie树结构的实现方法很多,在开源包org.apdplat的实现属于比较简单的一种。大致流程:
①建立ROOT数组,存放首字。
private finalTrieNode[]ROOT_NODES_INDEX=newTrieNode[INDEX_LENGTH];
②添加新词的过程就是在将一个字符添加到一个有序数组里(org.apdplat.word.dictionary.impl.)

③插入"中华","中华名族","中间","感召","感召力","感受"

④查找的过程
如果是根节点,直接根据首字母的character值mod数组大小(创建时的规定)直接查找到指定的首字母。然后再其下数组里面根据二分查找,就可以很快的查找到时候有匹配的字符串。
四、分词算法
1.正向最大匹配
①从左向右取待切分句子text的0~len的字符串作为匹配字段.
②如果找不到len长度的,就缩小为len-1,直到len==1,或者找到了匹配的字符串。
③如果找到了就把字符串切分出来,继续搜索余下的字符串len~text-len。


2.逆向最大匹配算法
与正向匹配算法不同的点在于每次匹配不到后,其实的匹配点并不是start, 而是start+1,同样的匹配的长度变成len-1.
例如: “我是要成为海贼王的男人”,初始匹配长度为5,
正向最大匹配 分别查找:"我是要成为" -> "我是要成" -> "我是要"……
你想最大匹配 分别查找: "我是要成为" -> "是要成为" -> "要成为"……
虽然逆向最大匹配算法看上去会舍弃一部分查找的数据,,然而实验表明,逆向最大匹配算法要优于正向最大匹配算法……
3.双向最大匹配算法
双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法的到的结果进行比较。研究表明,中文中90.0%左右的句子,正向最大匹配法和逆向最大匹配法完全重合且正确,只有大概9.0%的句子两种切分方法得到的结果不一样,但其中必有一个是正确的。关于两者哪一个准确度高,应该选择哪一个作为最终的匹配结果,可以使用n-gram模型计算词与词之间的关联性,然后选取更好的一个。
4.N-Gram模型
关于N-Gram模型,基于一种假设:第N个词只会与其前面的N-1个词有关联系,与其他的词都没有关联性。于是整个句子T的概率也就是
P(T) = P(W1W2W3…Wn)=P(W1)P(W2|W1)P(W3|W1W2)…P(Wn|W1W2…Wn-1)≈P(W1)P(W2|W1)P(W3|W2)…P(Wn|Wn-1)
于是就变成计算P(W1)P(W2|W1)P(W3|W1W2)…P(Wn|W1W2…Wn-1)的概率。
由于这样计算参数空间过大,不可能实用化,所以出现了二元的Bi-Gram和三元的Tri-Gram。二元的Bi-Gram意为,第二个词只与它的前一个词有关联,计算它的向相联性。
在词典查找相关联性概率中,同样适用一个大的词典,既定好词与词之间关联程度,如:

其中第一列为首词,冒号后面的是第二个词,数字为两个词的关联程度。如此在通过不同匹配算法得到了一个分词结果的单词数组后,通过n-gram算法找出分词结果的各个词的关联性,就可以有选择的使用分词算法结果。
4.正向最小匹配算法
5.逆向最小匹配算法
6.基于此单的全切分算法
五、常用的分析工具
## org.apdplat.word
## IK Analyzer
https://code.google.com/archive/p/ik-analyzer/
## mmseg4j
用 Chih-Hao Tsai 的 MMSeg 算法实现的中文分词器
## paoding
庖丁 采用基于 不限制个数 的词典文件对文章进行有效切分,使能够将对词汇分类定义。能够对未知的词汇进行合理解析
## imdict
网友评论