「朴素贝叶斯」
具体理论就不详细讲解了,网上一搜一大把。其核心思想就是: 朴素贝叶斯 = 条件独立假设 + 贝叶斯方法。运行速度快,在满足分布独立这一假设条件下分类效果好,但对于训练集中没有出现过的词语要平滑处理,数值型变量特征默认符合正态分布。
「Python实现」
导入停用词
导入停用词库,同时使用strip()方法剔除不需要的空白符,包括('\n', '\r', '\t', ' ')
文本处理,样本生成
每个新闻文本txt文件在各自所属类别的文件夹中,结构如下:
“folder_path”
|
|-- C000008 -- 1.txt / 2.txt / … / 19.txt
|-- C000010
|-- C000013
|-- …
|-- C000024
这里使用os.listdir()读取指定目录下的所有文件夹名(即分类类别),遍历各自文件夹(类别)内的文本文件,对每一个txt文件进行文本切词,同时利用zip()函数使每个新闻文本与所属类别一一对应,一共有90条数据。
为了随机抽取训练与测试数据集,用random.shuffle()打乱顺序,并选取20%的数据用于测试,同时把特征数据与类别数据各自分开。
最后对训练数据集中的词语进行词频统计。这里有使用sorted()函数进行排序,方法为sorted(iterable, cmp = None, key = None, reverse = False),其中参数含义如下:
- iterable:是可迭代类型(我这里的可迭代类型为字典)
- cmp:用于比较的函数,比较什么由key决定(这里没用到)
- key:用列表元素的某个属性或函数进行作为关键字(这里使用字典中的“值”大小作为关键字排序)
- reverse:排序规则,True为降序(False为升序)
|
|
特征选择
这里我们仅选取词频坐高的1000个特征词(维度),并剔除数字与停用词。
用选取的特征词构建0-1矩阵
对训练数据集train_data_list中每篇切完词之后的文档构建特征向量(由上述1000个特征词组成),若出现则取值为1,否则为0。于是90篇文章构建出了[90,1000]维度的0-1矩阵(其中71行为训练数据,19行为测试数据)。
训练集如下:
0-1矩阵如下:
|
|
朴素贝叶斯分类器
这里使用开源sklearn库中的朴素贝叶斯分类器,输入参数分别为训练集的0-1特征矩阵(train_feature_list)与训练集分类(train_class_list),然后对测试数据的输出与真实结果进行比较,得到准确度为0.68
|
|
这里我们仅选取词频最高的1000个作为特征向量,不妨尝试下选取其他的关键字作为特征向量,发现准确率都在0.63以上,分类效果还算可以,见下图:

|
|