数据分析实战 45 讲
陈旸
清华大学计算机博士
123928 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
第二模块:数据分析算法篇 (20讲)
第四模块:数据分析工作篇 (2讲)
数据分析实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

21丨朴素贝叶斯分类(下):如何对文档进行分类?

alpha参数
token_pattern
stop_words
停用词作用
朴素贝叶斯分类器选择
停用词
测试集
训练集
数据集
计算准确率
多项式贝叶斯分类器
单词权重计算
停用词
分词
TfidfVectorizer类
TF-IDF = TF * IDF
性别判断
中文文档分类
模型评估
模型训练
数据挖掘流程
预测
朴素贝叶斯分类
数据准备
计算方法
TF-IDF计算
逆向文档频率IDF
词频TF
伯努利朴素贝叶斯
多项式朴素贝叶斯
高斯朴素贝叶斯
垃圾邮件识别
情感分析
文本分类
练习题
sklearn
文档分类
TF-IDF
适用算法
适合场景
朴素贝叶斯分类

该思维导图由 AI 生成,仅供参考

我们上一节讲了朴素贝叶斯的工作原理,今天我们来讲下这些原理是如何指导实际业务的。
朴素贝叶斯分类最适合的场景就是文本分类、情感分析和垃圾邮件识别。其中情感分析和垃圾邮件识别都是通过文本来进行判断。从这里你能看出来,这三个场景本质上都是文本分类,这也是朴素贝叶斯最擅长的地方。所以朴素贝叶斯也常用于自然语言处理 NLP 的工具。
今天我带你一起使用朴素贝叶斯做下文档分类的项目,最重要的工具就是 sklearn 这个机器学习神器。

sklearn 机器学习包

sklearn 的全称叫 Scikit-learn,它给我们提供了 3 个朴素贝叶斯分类算法,分别是高斯朴素贝叶斯(GaussianNB)、多项式朴素贝叶斯(MultinomialNB)和伯努利朴素贝叶斯(BernoulliNB)。
这三种算法适合应用在不同的场景下,我们应该根据特征变量的不同选择不同的算法:
高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如说人的身高,物体的长度。
多项式朴素贝叶斯:特征变量是离散变量,符合多项分布,在文档分类中特征变量体现在一个单词出现的次数,或者是单词的 TF-IDF 值等。
伯努利朴素贝叶斯:特征变量是布尔变量,符合 0/1 分布,在文档分类中特征是单词是否出现。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

朴素贝叶斯分类在文档分类中的应用是本文的重点。文章详细介绍了sklearn机器学习包提供的三种朴素贝叶斯分类算法,以及它们适用的不同特征变量类型。此外,文章还解释了TF-IDF值的概念和计算方法,并介绍了如何使用TfidfVectorizer类来计算单词的TF-IDF向量值。通过示例演示了创建TfidfVectorizer类、拟合文档、获取不重复的词、每个单词的ID值以及每个单词在每个文档中的TF-IDF值。整体而言,本文通过清晰的解释和示例,帮助读者快速了解朴素贝叶斯分类在文档分类中的应用及相关技术特点。同时,文章还提到了数据挖掘神器sklearn中包含了大量的数据挖掘算法,以及对中文文档分类的练习题,为读者提供了实践和思考的机会。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《数据分析实战 45 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(60)

  • 最新
  • 精选
  • 北方
    置顶
    #!/usr/bin/env python # -*- coding:utf8 -*- # __author__ = '北方姆Q' # __datetime__ = 2019/2/14 14:04 import os import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn import metrics LABEL_MAP = {'体育': 0, '女性': 1, '文学': 2, '校园': 3} # 加载停用词 with open('./text classification/stop/stopword.txt', 'rb') as f: STOP_WORDS = [line.strip() for line in f.readlines()] def load_data(base_path): """ :param base_path: 基础路径 :return: 分词列表,标签列表 """ documents = [] labels = [] for root, dirs, files in os.walk(base_path): # 循环所有文件并进行分词打标 for file in files: label = root.split('\\')[-1] # 因为windows上路径符号自动转成\了,所以要转义下 labels.append(label) filename = os.path.join(root, file) with open(filename, 'rb') as f: # 因为字符集问题因此直接用二进制方式读取 content = f.read() word_list = list(jieba.cut(content)) words = [wl for wl in word_list] documents.append(' '.join(words)) return documents, labels def train_fun(td, tl, testd, testl): """ 构造模型并计算测试集准确率,字数限制变量名简写 :param td: 训练集数据 :param tl: 训练集标签 :param testd: 测试集数据 :param testl: 测试集标签 :return: 测试集准确率 """ # 计算矩阵 tt = TfidfVectorizer(stop_words=STOP_WORDS, max_df=0.5) tf = tt.fit_transform(td) # 训练模型 clf = MultinomialNB(alpha=0.001).fit(tf, tl) # 模型预测 test_tf = TfidfVectorizer(stop_words=STOP_WORDS, max_df=0.5, vocabulary=tt.vocabulary_) test_features = test_tf.fit_transform(testd) predicted_labels = clf.predict(test_features) # 获取结果 x = metrics.accuracy_score(testl, predicted_labels) return x # text classification与代码同目录下 train_documents, train_labels = load_data('./text classification/train') test_documents, test_labels = load_data('./text classification/test') x = train_fun(train_documents, train_labels, test_documents, test_labels) print(x)

    编辑回复: 正确,大家可以看下这份代码 通过load_data加载数据,得到documents, labels 通过train_fun进行训练和预测,得到测试集的准确率。

    2019-02-14
    2
    34
  • szm
    置顶
    需要完整代码,不然看不明白!

    编辑回复: 完整代码已上传到 https://github.com/cystanford/text_classification 你也可以参考下专栏评论中其他人写的代码

    2019-01-30
    3
    37
  • Python
    置顶
    老师,能不能在答疑的时候给这道题的完整代码看看

    编辑回复: 已上传到 https://github.com/cystanford/text_classification 也有同学自己写出来了,你可以都运行一下。

    2019-01-30
    18
  • 姜戈
    看过很多朴素贝叶斯原理和分类的讲解文章,很少能像前辈这样既有理论,又有实战的讲解,让大家既了解了理论知识,又有相应实际的操作经验可学,真的好棒,这个专栏,必须多多点赞,为老师加油!!!

    作者回复: 多谢姜戈,一起加油!

    2019-01-30
    16
  • 池边的树
    https://github.com/yourSprite/AnalysisExcercise/tree/master/%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF%E6%96%87%E6%9C%AC%E5%88%86%E7%B1%BB

    作者回复: Good Job

    2019-02-12
    5
  • 几何
    老师,弱弱的说一句,代码感觉能看明白,但是不明白的是模型是如何使用的, 比如上一节和本节,都是只知道了准确率,但是对于有新的要处理的数据,如何做,怎么做好总是感觉差一点点东西。

    作者回复: 我们做的大部分工作都是数据预处理,使用模型到是不复杂,这些分类模型使用的方式都差不多。 你可以多做练习,先针对一个数据集,采用不同的分类算法看下准确率。这样就会理解,当数据确定的情况下,如何使用不同的分类算法。 然后再针对不同的数据集,进行数据预处理:数据加载,数据探索,数据规范化等。数据预处理的技巧比较多,需要遇到不同的数据集,多做练习

    2019-09-08
    2
    4
  • Jack
    #!/usr/bin/env python # coding: utf-8 import os import jieba import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB # 1. 加载数据 # 加载停用词表 l_stopWords = set() with open('./text_classification/text_classification/stop/stopword.txt', 'r') as l_f: for l_line in l_f: l_stopWords.add(l_line.strip()) l_labelMap = {'体育': 0, '女性': 1, '文学': 2, '校园': 3} # 加载训练数据和测试数据 def LoadData(filepath): l_documents = [] l_labels = [] for root, dirs, files in os.walk(filepath): for l_file in files: l_label = root.split('/')[-1] l_filename = os.path.join(root, l_file) with open(l_filename, 'r') as l_f: l_content = l_f.read() l_wordlist = list(jieba.cut(l_content)) l_words = [item for item in l_wordlist if item not in l_stopWords] l_documents.append(' '.join(l_words)) l_labels.append(l_labelMap[l_label]) return l_documents, l_labels l_trainDocuments, l_trainLabels = LoadData('./text_classification/text_classification/train') l_testDocuments, l_testLabels = LoadData('./text_classification/text_classification/test') # # 2. 计算权重矩阵 l_tfidfVec = TfidfVectorizer(max_df=0.5) l_tfidfMatrix = l_tfidfVec.fit_transform(l_trainDocuments) # for item in l_tfidfVec.get_feature_names(): # print item # print l_tfidfVec.get_feature_names() # print l_tfidfVec.vocabulary_ print l_tfidfMatrix.toarray().shape # # 3. 朴素贝叶斯模型 # ## 3.1 模型训练 l_clf = MultinomialNB(alpha=0.001) l_clf.fit(l_tfidfMatrix, l_trainLabels) # ## 3.2 模型预测 l_testTfidf = TfidfVectorizer(max_df=0.5, vocabulary=l_tfidfVec.vocabulary_) l_testFeature = l_testTfidf.fit_transform(l_testDocuments) l_hats = l_clf.predict(l_testFeature) # ## 3.3 模型评估 from sklearn.metrics import accuracy_score print accuracy_score(l_hats, l_testLabels)

    作者回复: Good Job

    2019-02-14
    3
  • Jasmine
    老师,我想请教一下,计算单词权重时,为什么train_features用的fit_transform方法,而test_feature用的是transform

    作者回复: fit_transform()是先调用fit()方法拟合模型,然后再调用transform()方法进行特征转换。如果在测试集上继续使用fit_transform(),将会再次调用fit重新拟合模型,这样可能会导致转换后的训练集和测试集出现差异。

    2020-11-16
    2
    2
  • 最后面的代码太乱,很多都不知道从哪里来的,无法顺着看下去~~~

    作者回复: take it easy

    2019-04-17
    2
    2
  • 王彬成
    # -*- coding:utf8 -*- # 系统:mac # 1. 加载数据 # 加载停用词表 l_stopWords = [line.strip() for line in open('./text_classification-master/text classification/stop/stopword.txt', 'r', encoding='utf-8').readlines()] l_labelMap = {'体育': 0, '女性': 1, '文学': 2, '校园': 3} # 加载训练数据和测试数据 def LoadData(filepath): l_documents = [] l_labels = [] for root, dirs, files in os.walk(filepath): for l_file in files: if l_file=='.DS_Store': continue l_label = root.split('/')[-1] l_filename = os.path.join(root, l_file) with open(l_filename, 'r',encoding='gbk') as l_f: try: l_content = l_f.read() except Exception as err: print(err) print(l_filename) continue generator = jieba.cut(l_content) words = ' '.join(generator) l_wordlist=words.split(' ') l_words = [item for item in l_wordlist if item not in l_stopWords] l_documents.append(' '.join(l_words)) l_labels.append(l_labelMap[l_label]) return l_documents, l_labels l_trainDocuments, l_trainLabels = LoadData('./text_classification-master/text classification/train') l_testDocuments, l_testLabels = LoadData('./text_classification-master/text classification/test') # # 2. 计算权重矩阵 l_tfidfVec = TfidfVectorizer(max_df=0.5) l_tfidfMatrix = l_tfidfVec.fit_transform(l_trainDocuments) print (l_tfidfMatrix.toarray().shape) # # 3. 朴素贝叶斯模型 # ## 3.1 模型训练 l_clf = MultinomialNB(alpha=0.001) l_clf.fit(l_tfidfMatrix, l_trainLabels) # ## 3.2 模型预测 l_testTfidf = TfidfVectorizer(max_df=0.5, vocabulary=l_tfidfVec.vocabulary_) l_testFeature = l_testTfidf.fit_transform(l_testDocuments) l_hats = l_clf.predict(l_testFeature) # ## 3.3 模型评估 from sklearn.metrics import accuracy_score print (accuracy_score(l_hats, l_testLabels))

    作者回复: Good Job

    2019-04-05
    2
收起评论
显示
设置
留言
60
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部