最大匹配分词方法只考虑词有没有在字典中出现,没有考虑词在词典中的频率。
基于统计学的分词即考虑词在词典中的频率的一种简单的分词方法。
注:下面的代码参考snownlp作者的博客:http://www.isnowfy.com/python-chinese-segmentation/
1 | import math |
小插曲:
搜狗提供的这个词典本身是GB2312编码的,我使用file SogouLabDic.dic
显示的却是ISO-8859
,以至于写代码的时候绕了很大的弯子。
后面在网上找到enca这个工具,可以更精准地识别编码。
- 先安装:
sudo apt-get install enca
。 - 智能识别编码:
enca -L zh_CN SogouLabDic.dic
,输出:Simplified Chinese National Standard; GB2312
。 - 转换编码:
enca -L zh_CN -x utf-8 <SogouLabDic.dic> SogouLabDic.dic.utf8
。 另,词典的格式是:词 词频 词性
。
1 | list(d.items())[:10] |
1 | [('_t_', 301869553991.0), |
对于一个中文字符串:$a_1a_2…a_n$如何正确的用词:$c_1,c_2…c_m$表示就是中文分词的任务,也就是说我们要去找寻$P(c_1c_2..c_m)$最大的分词。
假设词跟词之间互相独立,转换成求$P(c_1)×P(c_2)×…×P(c_m)$最大,概率即这个词在词典中的频数除以所有词的频数之和(加入平滑)。
加入log,求$logP(c_1)+logP(c_2)+…+logP(c_m)$最大。
使用动态规划(DP)求解这个问题:
1 | def solve(s): |
1 | 其中 最简单 的 就是 最大 匹配 的 中文 分词 |