方法基本和jieba一致:
- 使用词典对句子进行初步的切分,找出所有词的切分位置,构成一个DAG。
- 使用动态规划方法,在DAG上找到1-gram概率值最大的切分路径。
- 如果在划分过程中出现了多个单字符切分,使用由字构词的HMM对这个单字符序列再次切分,这样可以提高发现未登录词的能力。
不过这里还尝试了如下做法:
- 在求概率最大的切分路径时,改用2-gram语言模型。
- 比较2-gram中不同的平滑方式:+1平滑、绝对减值平滑和Kneser-Ney平滑对分词效果的影响。
CSeg目录下的文件如下:
CSeg
│ corpus_process.py # 语料处理程序,生成词典,2-gram统计信息和HMM概率估计信息
│ cseg.py # 分词器主程序
│ eval.py # 验证程序,可计算分词的准确率、召回率和F1,同时可找出所有划分错误的词
│ hmm.py # 基于hmm模型的辅助分词程序,用于进一步切分
│ test.py # 测试程序
│
├─corpus # 语料目录,包含SIGHAN2005中的pkr、msr数据集和NLPCC2016的微博数据集
│ msr_test.utf8 # test: 测试语料
│ msr_test_gold.utf8 # glod:分词参考答案
│ msr_training.utf8 # train: 训练语料
│ nlpcc2016-word-seg-train.dat
│ nlpcc2016-wordseg-dev.dat
│ nlpcc2016-wordseg-dev_gold.dat
│ pku_test.utf8
│ pku_test_gold.utf8
│ pku_training.utf8
│
├─data # CSeg使用的处理后的语料数据,包含2-gram统计信息,词典和hmm概率估计信息
│ bi_gram.txt
│ dict.txt
│ hmm_prob
│
└─output # 测试输出目录
默认data目录下的语料是使用corpus_process程序处理MSR语料后的结果,可使用corpus_process.py处理其他语料,分词主程序位于cseg.py中,test.py是测试程序
测试结果
PKU | MSR | |||||||||
P | R | F1 | P | R | F1 | P | R | F1 | ||
2-gram | +1 | 0.4960 | 0.6903 | 0.5772 | 0.4931 | 0.7039 | 0.5799 | 0.4614 | 0.6630 | 0.5441 |
绝对减值 | 0.7928 | 0.8890 | 0.8381 | 0.8984 | 0.9538 | 0.9253 | 0.7575 | 0.8698 | 0.8097 | |
Kneser-Ney | 0.8122 | 0.8986 | 0.8532 | 0.9195 | 0.9629 | 0.9407 | 0.7932 | 0.8892 | 0.8385 | |
1-gram | 0.8507 | 0.9181 | 0.8831 | 0.9238 | 0.9639 | 0.9434 | 0.8210 | 0.9062 | 0.8615 | |
2-gram +HMM | +1 | 0.7794 | 0.7925 | 0.7859 | 0.7497 | 0.7989 | 0.7735 | 0.7713 | 0.8106 | 0.7904 |
绝对减值 | 0.8825 | 0.8513 | 0.8666 | 0.8941 | 0.8921 | 0.8931 | 0.8580 | 0.8718 | 0.8648 | |
Kneser-Ney | 0.8946 | 0.8562 | 0.8750 | 0.9105 | 0.8994 | 0.9049 | 0.8793 | 0.8832 | 0.8812 | |
1-gram+HMM | 0.9047 | 0.8683 | 0.8861 | 0.9116 | 0.8995 | 0.9055 | 0.8874 | 0.8916 | 0.8895 |
从以上结果可以看出:
- 使用2-gram语言模型时,平滑方法对分词效果有非常大的影响。
- 可能是训练语料较少的缘故,1-gram方法在这几个数据集上的效果优于2-gram方法。