最简单的分词算法是在单词层面的最大匹配算法,最大匹配算法又可以分为前向最大匹配和后向最大匹配,二者大致上是类似的,只是在字符的缩减方向上有所差异。
这个算法得到的结果或者说目的是:最终分得的单词个数越少越好,每个单词的字符长度越长越好;
前向最大匹配 (forward-max matching)
无论是哪种分词算法,都需要有预先保存好的单词字典库
比如说我们要对以下一句话进行分词:
字典:
[“我们”,“经常”,“有”,“意见”,“有意见”,“分歧”]
设置最大匹配 max_len=5,首先我们可以得到 [ 我们经常有 ],查找字典中没有这个单词,然后从后面依次减少一个字符去查找:
- [ 我们经常有 ] --> [ 我们经常 ] -->[ 我们经 ] --> [ 我们 ]
字典中有 [我们] 这个单词,就可以把 “我们” 给切分出来了
然后我们再看 [ 经常有意见 ] 按照上面的方法依次查找,最后可以得到:
可以发现在最大匹配算法下,“有意见” 切分出来后就不会再继续往下切分了,即使字典中存在 “有” 以及 “意见” 两个单词。
在这里,max_len 可以设置为 5~10,或者先扫描一边字典库,得到字符串长度的分布,再自定义设置也可。
后向最大匹配 (backward-max matching)
与前向最大匹配大同小异,同样以上面这一句话的切分为例,后向最大匹配的顺序是:
- [ 有意见分歧 ] --> [ 意见分歧 ] --> [ 见分歧 ] --> [ 分歧 ]
这句话最后得到的切分结果与前向最大匹配是一样的,90%的情况下,二者的结果是一样的。
最大匹配算法的缺点
- 基于贪心的角度,所以得到的结果是局部最优解;
- 效率比较低,依赖于 max_len ,max_len 越大,所要做的扫描线性增长;
- 这只是在单词层面的划分,没有考虑语义,也就是上下文的信息,比如说这里的 “有意见” 再划分为 “有” 和 “意见” 明显会更好,这也是最大匹配算法最大的不足。