基于朴素贝叶斯对文档进行分类

朴素贝叶斯分类中,一个重要的工具是 sklearn 包。

1. sklearn 机器学习包

sklearn 的全称叫 Scikit-learn(人工智能与机器学习),它提供了3个朴素贝叶斯分类算法:

  • 高斯朴素贝叶斯(GaussianNB):特征变量是连续变量,符合高斯分布。
  • 多项式朴素贝叶斯(MultionomialNB):特征变量是离散变量,符合多项分布。在文档分类中特征变量体现为一个单词出现的次数,或者是单词的 TF-IDF 值。
  • 贝努力朴素贝叶斯(BernoulliNB):特征变量是布尔变量,符合0/1 分布,在文档分类中体现为单词是否出现。

2. TF-IDF

TF: Term Frequency
IDF: Inverse Document Frequency

评估某个词语对于一个文件集或文档库中的其中一份文件的重要程度。

在这里插入图片描述

  • TF计算了一个单词在文档中出现的次数,它认为一个单词的重要性和它在文档中出现的次数成正比。
  • IDF 是指一个单词在文档中的区分度。它认为一个单词出现在的文档书越少,就越能通过这个单词把该文档和其他文档区分开。IDF 越大说明该单词的区分度越大。

TF-IDF=TF*IDF

2.1 如何求TF-IDF

在 sklearn 中可以直接使用 TfidfVectorizer。

TfidfVectorizer(stop_words=stop_words, token_pattern=token_pattern)

当创建好 TF-IDF 向量类型时,可以用 fit_transform 返回文本矩阵,该矩阵表示了每个单词在每个文档中的 TF-IDF 值。

3. 如何对文档进行分类

在这里插入图片描述在这里插入图片描述

  • 基于分词的数据准备,包括分词、单词权重计算、去掉停用词;
  • 应用朴素贝叶斯进行分类,首先通过训练器得到朴素贝叶斯分类器,然后将分类器应用于测试集,并与实际结果做对比,最终得到测试集的分类准确率。

4. 总结

在这里插入图片描述

5. 应用

数据说明:

  • 文档共有4中类型:女性、体育、文学、校园。
  • 文件夹分为训练集、测试集,停用词
    目的:用朴素贝叶斯对训练集进行驯良,并对测试集进行验证,并给出测试集额准确率。
import os
import io
import jieba
from sklearn import metrics
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer

train_contents = []
train_labels = []
test_contents = []
test_labels = []

# 导入文件
# os.listdir()的用法,适用范围只包含文件或者文件夹
# r是保持字符串原始值的意思,就是说不对其中的符号进行转义
start = os.listdir(r'train')
for item in start:
   test_path = './test/'+item+'/'
   train_path = './train/'+item+'/'
   for file in os.listdir(test_path):
       with open(test_path+file, encoding="GBK") as f:
           test_contents.append(f.readline())
           test_labels.append(item)
   for file in os.listdir(train_path):
       # 将uft-8格式文件转化为gb18030 让csv文件excel可以无乱码打开
       with open(train_path+file, encoding="gb18030", errors="ignore") as f:
           train_contents.append(f.readline())
           train_labels.append(item)
print(len(train_contents), len(test_contents))

# 导入 stop word
# .readline()按行读取文件内容,将读取数据放到列表中
stop_word = [line.strip()
            for line in io.open('stop/stopword.txt', encoding='utf-8').readlines()]
# 分词方法使用 jieba,计算单词的权重
tf = TfidfVectorizer(tokenizer=jieba.cut, stop_words=stop_word, max_df=0.5)
train_features = tf.fit_transform(train_contents)
print(train_features.shape)

# 生成朴素贝叶斯分类器
# 多项式贝叶斯分类器
clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)

# 使用生成的分类器做预测
test_tf = TfidfVectorizer(
   tokenizer=jieba.cut, stop_words=stop_word, max_df=0.5, vocabulary=tf.vocabulary_)
test_features = test_tf.fit_transform(test_contents)
print(test_features.shape)
predicted_labels = clf.predict(test_features)
print(metrics.accuracy_score(test_labels, predicted_labels))
# 分类结果为92.5%

转载自:https://time.geekbang.org/column/article/79762#previewimg

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于朴素贝叶斯的中文文本分类是一种常用的文本分类算法。它利用贝叶斯定理和特征条件独立假设,通过统计特征词在各类别下的概率来判断文本所属的类别。 首先,需要构建一个中文文本分类的语料库。将语料库中的文档按类别进行分类,并进行预处理,包括分词、去除停用词、过滤低频词等。然后,统计每个类别下每个词条的频数,以及每个类别的文档总数。 接下来,需要计算每个词条在各个类别下的条件概率。使用拉普拉斯平滑来避免概率为0的情况。计算每个类别下每个词条的概率时,需要考虑该词条在该类别中出现的频数、该类别中所有词条的频数以及该类别中所有词条的总数。 对于待分类的文本,需要对其进行同样的预处理。然后,根据贝叶斯定理,计算该文本属于各个类别的概率。选择概率最大的类别作为文本的分类结果。 在Python中,可以使用第三方库scikit-learn来实现基于朴素贝叶斯的中文文本分类。首先,使用jieba库对语料库和待分类文本进行中文分词。然后,使用CountVectorizer对分词后的文本数据进行提取特征表示。接着,使用MultinomialNB来构建朴素贝叶斯分类器,并对训练集进行训练。最后,使用训练好的分类器对待分类文本进行分类预测。 需要注意的是,中文文本分类存在分词效果和特征选择等方面的影响因素,需要根据实际情况进行调优和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值