朴素贝叶斯分类最适合的场景就是文本分类、情感分析和垃圾邮件识别。其中情感分析和垃圾邮件识别都是通过文本来进行判断。所以朴素贝叶斯也常用于自然语言处理 NLP 的工具。

sklearn 机器学习包

sklearn 的全称叫 Scikit-learn,它给我们提供了 3 个朴素贝叶斯分类算法,分别是高斯朴素贝叶斯(GaussianNB)、多项式朴素贝叶斯MultinomialNB)和伯努利朴素贝叶斯(BernoulliNB)。

这三种算法适合应用在不同的场景下,我们应该根据特征变量的不同选择不同的算法:

高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如说人的身高,物体的长度。

多项式朴素贝叶斯:特征变量是离散变量,符合多项分布,在文档分类中特征变量体现在一个单词出现的次数,或者是单词的 TF-IDF 值等。

伯努利朴素贝叶斯:**特征变量是布尔变量,符合 0/1 分布**,在文档分类中特征是单词是否出现。

伯努利朴素贝叶斯是以文件为粒度,如果该单词在某文件中出现了即为 1,否则为 0。而多项式朴素贝叶斯是以单词为粒度,会计算在某个文件中的具体次数。

> 如身高、体重这种自然界的现象就比较适合用高斯朴素贝叶斯来处理。而文本分类是使用多项式朴素贝叶斯或者伯努利朴素贝叶斯。

什么是 TF-IDF 值呢?

TF-IDF 是一个统计方法,用来评估某个词语对于一个文件集或文档库中的其中一份文件的重要程度。

词频 TF计算了一个单词在文档中出现的次数,它认为一个单词的重要性和它在文档中出现的次数呈正比。

逆向文档频率 IDF,是指一个单词在文档中的区分度。它认为一个单词出现在的文档数越少,就越能通过这个单词把该文档和其他文档区分开。IDF 越大就代表该单词的区分度越大。

所以 TF-IDF 实际上是词频 TF 和逆向文档频率 IDF 的乘积。这样我们倾向于找到 TF 和 IDF 取值都高的单词作为区分,即这个单词在一个文档中出现的次数多,同时又很少出现在其他文档中。这样的单词适合用于分类。

TF-IDF 如何计算

些单词可能不会存在文档中,为了避免分母为 0,统一给单词出现的文档数都加 1。

举个例子
假设一个文件夹里一共有 10 篇文档,其中一篇文档有 1000 个单词,“this”这个单词出现 20 次,“bayes”出现了 5 次。“this”在所有文档中均出现过,而“bayes”只在 2 篇文档中出现过。

针对“this”,计算 TF-IDF 值:

所以 TF-IDF=0.02*(-0.0414)=-8.28e-4。

针对“bayes”,计算 TF-IDF 值:

TF-IDF=0.005*0.5229=2.61e-3。

很明显“bayes”的 TF-IDF 值要大于“this”的 TF-IDF 值。这就说明用“bayes”这个单词做区分比单词“this”要好。

如何求 TF-IDF

在 sklearn 中我们直接使用 TfidfVectorizer 类,它可以帮我们计算单词 TF-IDF 向量的值。

在这个类中,取 sklearn 计算的对数 log 时,底数是 e,不是 10。

创建 TfidfVectorizer 的方法是:

TfidfVectorizer(stop_words=stop_words, token_pattern=token_pattern)

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

在我们进行 fit_transform 拟合模型后,我们可以得到更多的 TF-IDF 向量属性,比如,我们可以得到词汇的对应关系(字典类型)和向量的 IDF 值,当然也可以获取设置的停用词 stop_words。

现在想要计算文档里都有哪些单词,这些单词在不同文档中的 TF-IDF 值是多少呢?

首先我们创建 TfidfVectorizer 类:

from sklearn.feature_extraction.text import TfidfVectorizertfidf_vec = TfidfVectorizer()documents = [    'this is the bayes document',    'this is the second second document',    'and the third one',    'is this the document']tfidf_matrix = tfidf_vec.fit_transform(documents)print('不重复的词:', tfidf_vec.get_feature_names())print('每个单词的 ID:', tfidf_vec.vocabulary_)#输出每个单词在每个文档中的 TF-IDF 值,向量里的顺序是按照词语的 id 顺序来的:print('每个单词的 tfidf 值:', tfidf_matrix.toarray())输出不重复的词: ['and', 'bayes', 'document', 'is', 'one', 'second', 'the', 'third', 'this']每个单词的 ID: {'this': 8, 'is': 3, 'the': 6, 'bayes': 1, 'document': 2, 'second': 5, 'and': 0, 'third': 7, 'one': 4}每个单词的 tfidf 值: [[0.         0.63314609 0.40412895 0.40412895 0.         0.  0.33040189 0.         0.40412895] [0.         0.         0.27230147 0.27230147 0.         0.85322574  0.22262429 0.         0.27230147] [0.55280532 0.         0.         0.         0.55280532 0.  0.28847675 0.55280532 0.        ] [0.         0.         0.52210862 0.52210862 0.         0.  0.42685801 0.         0.52210862]]

如何对文档进行分类

1. 基于分词的数据准备,包括分词、单词权重计算、去掉停用词;

2. 应用朴素贝叶斯分类进行分类,首先通过训练集得到朴素贝叶斯分类器,然后将分类器应用于测试集,并与实际结果做对比,最终得到测试集的分类准确率。

一般来说 NTLK 包适用于英文文档,而 jieba 适用于中文文档。我们可以根据文档选择不同的包,对文档提取分词。这些分词就是贝叶斯分类中最重要的特征属性。基于这些分词,我们得到分词的权重,即特征矩阵。

在这个链接下下载数据集:github.com/cystanford/t

train_contents=[]train_labels=[]test_contents=[]test_labels=[]#  导入文件import osimport iostart=os.listdir(r'C:/Users/baihua/Desktop/text classification/train')for item in start:    test_path='C:/Users/baihua/Desktop/text classification/test/'+item+'/'    train_path='C:/Users/baihua/Desktop/text classification/train/'+item+'/'    for file in os.listdir(test_path):        with open(test_path+file,encoding="GBK") as f:            test_contents.append(f.readline())            #print(test_contents)            test_labels.append(item)    for file in os.listdir(train_path):        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 wordimport jiebafrom sklearn import metricsfrom sklearn.naive_bayes import MultinomialNB#stop_words = [line.strip() for line in io.open(r'C:/Users/baihua/Desktop/stopword.txt').readlines()]with open(r'C:/Users/baihua/Desktop/stopword.txt', 'rb') as f:    stop_words = [line.strip() for line in f.readlines()]# 分词方式使用jieba,计算单词的权重tf = TfidfVectorizer(tokenizer=jieba.cut,stop_words=stop_words, max_df=0.5)##注意数据结构:stop_words是list,过滤词token_parten是正则表达式train_features = tf.fit_transform(train_contents)#该函数返回文本矩阵,表示每个单词在每个文档中的TF-IDF值print(train_features.shape)
#模块 4:生成朴素贝叶斯分类器# 多项式贝叶斯分类器clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)
#模块 5:使用生成的分类器做预测test_tf = TfidfVectorizer(tokenizer=jieba.cut,stop_words=stop_words, max_df=0.5, vocabulary=tf.vocabulary_)test_features=test_tf.fit_transform(test_contents)predicted_labels=clf.predict(test_features)#模块六,计算准确性from sklearn import metricsprint (metrics.accuracy_score(test_labels, predicted_labels))#print(test_features.shape)#print(metrics.accuracy_score(test_labels, predicted_labels))

End.

作者:求知鸟

来源:知乎

实战:手把手教你用朴素贝叶斯对文档进行分类相关推荐

  1. 机器学习实战刻意练习 —— Task 02. 朴素贝叶斯

    机器学习实战刻意练习 第 1 周任务   分类问题:K-邻近算法   分类问题:决策树 第 2 周任务   分类问题:朴素贝叶斯   分类问题:逻辑回归 第 3 周任务   分类问题:支持向量机 第 ...

  2. 【机器学习实战(三):朴素贝叶斯】

    我的个人网站:天风的人工智能小站 我的CSDN账号:**Tian-Feng的博客_CSDN博客-机器学习领域博主 我的github账号:zhangwei668 - Overview 我的知乎账号:天风 ...

  3. 《机器学习实战》学习笔记之第四章朴素贝叶斯进行文档分类

    朴素贝叶斯有两个假设: 1."朴素":特征之间相互独立,单词出现的概率相同,当然这个假设不合理 2."权重相同":每个特征等同重要,这个假设也不太合理 尽管如此 ...

  4. 【阿旭机器学习实战】【10】朴素贝叶斯模型原理及3种贝叶斯模型对比:高斯分布朴素贝叶斯、多项式分布朴素贝叶斯、伯努利分布朴素贝叶斯

    [阿旭机器学习实战]系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流. 本文介绍了机器学习中的朴素贝叶斯的基本原理,并对3种贝叶斯模型根据鸢尾花实例进行了比较. 目录 朴 ...

  5. R语言应用实战系列(五)-朴素贝叶斯算法以及ROC和PR曲线

    前言 朴素贝叶斯(Naviebayes)的原理很简单:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为该代分项属于哪个类别? 以下是我为大家准备的几个精品专栏,喜欢的小伙 ...

  6. 【机器学习实战】第4章 朴素贝叶斯(Naive Bayes)

    第4章 基于概率论的分类方法:朴素贝叶斯 朴素贝叶斯 概述 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.本章首先介绍贝叶斯分类算法的基础--贝叶斯定理.最后,我们 ...

  7. python人工智能——机器学习——分类算法-朴素贝叶斯算法对新闻进行分类案例

    朴素贝叶斯案例流程 1.加载20类新闻数据,并进行分割 2.生成文章特征词 3.朴素贝叶斯estimator流程进行预估 代码 from sklearn.datasets import fetch_2 ...

  8. 情感分析朴素贝叶斯_朴素贝叶斯推文的情感分析

    情感分析朴素贝叶斯 Millions of tweets are posted every second. It helps us know how the public is responding ...

  9. 手把手教你使用 Java 在线生成 pdf 文档

    一.介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票.订单的库存打印单.各种电子签署合同等等,以方便用户查 ...

最新文章

  1. Confluence 6 查看空间活动
  2. [C#]最简单的Base64加密解密
  3. 深圳软件开发向前跳转会略过一些节点
  4. 如何优化网站服务器来提高吞吐量并减少延迟时间
  5. HDU 1358 Period KMP
  6. 素数的线性筛法java,埃氏筛 线性筛(欧拉筛) 算法解析
  7. 场景7:带有Linux网桥的提供商网络
  8. JavaScript常用事件(1)
  9. android中在java代码中设置Button按钮的背景颜色
  10. 中文编程汉语编程实例
  11. b站投稿 您的稿件未能成功转码。原因:该视频时长不足1秒,请检查视频时长并尝试重新上传。解决办法
  12. python 分割线_用Python打印分割线练习
  13. java syn包_TCP攻击之SYN攻击
  14. Vue获取当前路由地址以及当前页面的地址
  15. 划区清扫功能 小米扫地机器人_小米扫地机器人怎么用?
  16. Qt中的网络编程(TCP)
  17. ucos系统使用delay函数死机原因
  18. Simpoint - 0x1 切片完整步骤
  19. C语言检测是否加入一个QQ群,判断登录的QQ是否已经加入指定的QQ群
  20. 改动实体类后,报错java.io.InvalidClassException: XXXDTO; local class incompatibl

热门文章

  1. 算法基础知识科普:8大搜索算法之二叉搜索树(中)
  2. 10个工程师,9个不合格!
  3. 154 万 AI 开发者用数据告诉你,中国 AI 如何才能弯道超车?| 中国 AI 应用开发者报告...
  4. AutoML未来可期,工程师的明天何去何从?
  5. 触类旁通,经典面试题最长公共子序列应该这么答
  6. “深度学习之父”大谈AI:寒冬不会出现,论文评审机制有损创新
  7. 专访施巍松:边缘计算早期提出者之一
  8. OpenAI NLP最新进展:通过无监督学习提升语言理解
  9. Alexa偷录私密对话并发送,继诡笑之后出现又一神举动
  10. MySQL数据库时间类型datetime、bigint、timestamp的查询效率比较