利用朴素贝叶斯算法进行中文文本的分类。
python 2.7
依赖包: pynlpir, numpy
使用搜狗文本分类语料库,完整数据集共10个类别,每个类别8000个新闻文本。
本文选取了其中8个类别,每个类别分别选取2000,8000进行训练。其中80%作为训练集、 20%作为测试集。
由于完整数据集比较大,本目录下的data
只包含了一个非常小的数据集,每个类别50个文本。
对中文文本首先要进行分词,采用的是NLPIR汉语分词系统(使用python中pynlpir)。然后进行去停用词、低频词。
由于训练时间不长,对结果影响不大,没有进行其他降维处理。
朴素贝叶斯文本分类中,有两个模型,多项式模型和伯努利模型。两个模型分别是基于单词粒度和文本粒度的。我们代码中采用和实现的是多项式模型。
训练时间consumu time : 4308.61800003s
Car | Economy | Health | IT | Sports | Travel | Sum | |
---|---|---|---|---|---|---|---|
Car | 356 | 6 | 4 | 6 | 2 | 26 | 400 |
Economy | 9 | 336 | 18 | 25 | 0 | 12 | 400 |
Health | 1 | 5 | 377 | 14 | 0 | 3 | 400 |
IT | 3 | 4 | 51 | 304 | 0 | 38 | 400 |
Sports | 0 | 1 | 0 | 6 | 388 | 5 | 400 |
Travel | 6 | 2 | 4 | 5 | 0 | 383 | 400 |
Sum | 375 | 354 | 454 | 360 | 390 | 467 | 2400 |
准确率和召回率
precision(%) | recall(%) | |
---|---|---|
Car | 94.93 | 89 |
Economy | 94.92 | 84 |
Health | 83.04 | 94.25 |
IT | 84.44 | 76 |
Sports | 99.49 | 97 |
Travel | 82.01 | 95.75 |
average | 89.81 | 89.33 |
Car | Economy | Health | IT | Sports | Travel | Sum | |
---|---|---|---|---|---|---|---|
Car | 1465 | 35 | 9 | 18 | 5 | 68 | 1600 |
Economy | 88 | 1295 | 71 | 91 | 1 | 54 | 1600 |
Health | 9 | 22 | 1501 | 38 | 1 | 29 | 1600 |
IT | 10 | 47 | 93 | 1369 | 5 | 76 | 1600 |
Sports | 3 | 18 | 4 | 50 | 1480 | 45 | 1600 |
Travel | 10 | 11 | 36 | 17 | 9 | 1517 | 1600 |
Sum | 1585 | 1428 | 1714 | 1583 | 1501 | 1789 | 9600 |
precision(%) | recall(%) | |
---|---|---|
Car | 92.42 | 91.56 |
Economy | 90.68 | 80.94 |
Health | 87.57 | 93.81 |
IT | 86.48 | 85.56 |
Sports | 98.6 | 92.5 |
Travel | 84.8 | 94.81 |
average | 90.09 | 89.86 |
可以看到每个类别的使用的文本数量2000or8000,对准确率和召回率影响并不是很大,均在90%左右。