使用 python 基于朴素贝叶斯进行文本分类学习笔记之四:增加测试文本和计算正确率

当前的代码可以通过下面的链接下载,我在 github 上更新的可能比较快,所以下面给出代码历史版本:

bayes.py: https://github.com/chinapnr/fish_base/blob/55a34478425d0395a0b09fe7fce5c30b3f8cd966/fish_base/bayes/bayes.py

bayes_test.py
https://github.com/chinapnr/fish_base/blob/55a34478425d0395a0b09fe7fce5c30b3f8cd966/demo/bayes_test.py

最新版的代码可以在这里找到: https://github.com/chinapnr/fish_base, demo 在 demo 路径下。我把 naive bayes 代码合并到我们的 fish_base 库中了。

除了正面和负面文本训练以外,现在增加了测试文本,并且计算正确率,这样改进算法、改进训练之后的结果就可以通过正确率进行比较了。所以在优化停用词、中文标点前,先增加了这个功能,代码如下。

 # 2016.5.18
    # 根据测试样本来测试分类的准确率
    # 输出 人工正确/机器判断正确 人工错误/机器判断错误 的两个百分比
    def test_nb(self, filename):

        test_doc_list = []
        pre_class_list = []

        # 设定测试结果 dict
        test_result_dict = {'11': 0, '10': 0, '00': 0, '01': 0}

        # 打开测试文本
        with open(filename, 'r') as f:
            for line in f:
                # 获得人工设定的类别
                pre_class_list.append(line[0:1])
                # 获得需要测试的文本
                test_doc_list.append(line[2:])

        # 测试文本的长度
        test_doc_count = len(test_doc_list)

        for i, item in enumerate(test_doc_list):

            s = list(jieba.cut(item))

            # 获得程序分类结果
            computer_class = self.run_nb(s)
            # 获得人工设定的分类结果
            pre_class = pre_class_list[i]

            # 结果记录到测试结果 dict 中
            index = '**'

            if pre_class == '1':
                index = str(10 + computer_class)
            if pre_class == '0':
                index = '0' + str(computer_class)

            test_result_dict[index] += 1

            print(s, pre_class, computer_class)

        print(test_result_dict)

        # 返回结果, 假设测试文本中正面和负面各占一半
        return test_result_dict['00'] / (test_doc_count / 2), test_result_dict['11'] / (test_doc_count / 2)

 

测试代码也做了修改,更加简化了,先进行中文分词初始化,然后训练,然后测试,就可以了。

nb.init_cut_word()

nb.open_train_doc_ch('train_bayes/good.txt', 0)
nb.open_train_doc_ch('train_bayes/bad.txt', 1)

nb.train()
print(nb.p0_v, nb.p1_v, nb.p_ab)

print(nb.test_nb('train_bayes/test.txt'))

 

测试文本举例如下。

0|这手机真不错
0|大屏幕,我很喜欢
0|速度快,质量好
0|买了给妈妈的,快递很快,服务好
0|挺喜欢这个手机的
0|手机屏幕大,挺好的
0|手机挺好的
0|很喜欢这个手机
1|破手机
1|什么破机器,速度那么慢
1|手机很一般,速度慢
1|不太喜欢
1|不能开机,已经保修
1|屏幕上有划痕,不开心
1|不相信国产手机了,质量一般,做工粗糙
1|已经退货了

 

第一个数字是标注这一行内容是正面还是负面,然后程序通过比较运行分类器的结果和人工预先设定的这个结果,得到正确率。最重要的自然是应该是正面且判断为正面,应该是负面且判断为负面这两个比例。

{'01': 1, '10': 5, '00': 7, '11': 3}
(0.875, 0.375)

 

我用 dict 来记录应该是正面负面和判断为正面负面(分别用0和1)四个值
之后的比例,就是前面说的两个比例,从目前的情况来看,对于正面的判断比较准确,对于负面的判断还在50% 以下,之后需要继续提高,先从停用词开始。

使用 python 基于朴素贝叶斯进行文本分类学习笔记之一:开始
使用 python 基于朴素贝叶斯进行文本分类学习笔记之二:将原书程序修改并转换为类
使用 python 基于朴素贝叶斯进行文本分类学习笔记之三:中文内容的倾向性判断初步
使用 python 基于朴素贝叶斯进行文本分类学习笔记之四:增加测试文本和计算正确率
使用 python 基于朴素贝叶斯进行文本分类学习笔记之五:增加停用词