文本分类 | 基于朴素贝叶斯的文本分类方法

Hi,大家好,我是半亩花海。本文主要了解文本分类的内容,以《基于朴素贝叶斯的文本分类方法》这一项目作为示例展示文本分类的意义。

目录

一、贝叶斯公式

1. 公式 

2. 用机器学习视角理解贝叶斯公式

二、朴素贝叶斯算法

1. 介绍

2. 步骤

三、基于朴素贝叶斯的文本分类方法

1. 导入相关库

2. 过滤字词

3. 遍历邮件建立词库

4. 邮件标记并训练模型

5. 预测模型

四、小结


基于统计模型的文本分类方法是文本分类的主要方法之一。该方法的一般步骤是:

  • 对原始数据进行预处理(包括分词、数据清洗和数据统计等)
  • 人工抽取特征
  • 选择具体的模型设计分类算法

朴素贝叶斯算法是常用的统计模型之一。本文主要对数据集中151到155号邮件进行预测,是垃圾邮件还是普通邮件

一、贝叶斯公式

1. 公式 

贝叶斯方法是一个历史悠久,有着坚实的理论基础的方法,同时处理很多问题时直接而又高效,很多高级自然语言处理模型也可以从它演化而来。因此,学习贝叶斯方法,是研究自然语言处理问题的一个非常好的切入口。

$P(Y|X)=\frac{P(X|Y)P(Y)}{P(X)} $

它其实是由以下的联合概率公式推导出来:

$P(Y,X) = P(Y|X)P(X)=P(X|Y)P(Y) $

其中,P(Y) 叫做先验概率,P(Y|X) 叫做后验概率,P(Y,X) 叫做联合概率。

2. 用机器学习视角理解贝叶斯公式

在机器学习的视角下,我们把 X 理解成“具有某特征”,把 Y 理解成“类别标签”(一般机器学习问题中都是 X=>特征, Y=>结果)。在最简单的二分类问题是与否判定)下,我们将 Y 理解成“属于某类”的标签。于是贝叶斯公式就变形成了下面的样子:

而我们二分类问题的最终目的就是要判断以下条件是否成立:

贝叶斯方法把计算“具有某特征的条件下属于某类”的概率转换成需要计算“属于某类的条件下具有某特征”**的概率,而后者获取方法就简单多了,我们只需要找到一些包含已知特征标签的样本,即可进行训练。而样本的类别标签都是明确的,所以贝叶斯方法在机器学习里属于有监督学习方法。

另外,一般先验概率、后验概率是相对出现的,比如 其中,P(Y) 和P(Y|X) 是关于 Y 的先验概率与后验概率,P(X) 和P(X|Y) 是关于 X 的先验概率与后验概率。

二、朴素贝叶斯算法

1. 介绍

朴素贝叶斯算法是一种基于概率统计的分类算法。它基于贝叶斯定理特征独立假设,将待分类的样本分配到最可能的类别中。

算法的基本思想是假设所有特征在给定类别的条件下是相互独立。基于这个假设,朴素贝叶斯算法计算每个类别在给定特征下的后验概率,并选择具有最高概率的类别作为最终的分类结果。

2. 步骤

朴素贝叶斯算法在文本分类中的步骤:

  • 数据准备:首先,需要准备带有标签的文本数据集,其中每个文本都被标注为所属的类别。例如,一个电子邮件可以被标记为"垃圾邮件"或"非垃圾邮件"。
  • 特征提取:将文本数据转换为机器学习算法可以理解的特征向量表示。常用的方法有词袋模型(Bag-of-Words)和TF-IDF(Term Frequency-Inverse Document Frequency)。
  • 数据预处理:对特征向量进行预处理操作,如去除停用词(如"the"、"and")和标点符号,进行词干化(将单词统一成其原始形式),以及进行大小写转换等。
  • 训练模型:使用准备好的训练集数据,通过计算每个类别下的条件概率,来训练朴素贝叶斯分类器。
  • 特征选择(可选):对于大规模的文本分类问题,可以考虑对特征进行选择,以减少特征的维度,提高分类器的效果和运行速度。常用的特征选择方法有互信息、卡方检验等。
  • 测试和评估:使用留出集、交叉验证等方法,将测试集数据输入训练好的模型进行分类,并计算分类准确率、精确率、召回率、F1值等指标来评估模型的性能。
  • 应用模型:训练完成并通过评估的模型可以用于新的未知文本的分类。通过计算每个类别的后验概率,并选择具有最高后验概率的类别作为最终的分类结果。

需要注意的是:朴素贝叶斯算法有一个特征独立假设,即将文本特征视为相互独立的,这在某些情况下可能并不成立。但朴素贝叶斯算法仍然在文本分类任务中得到广泛应用,并取得了不错的效果。在具体应用时,还可以根据实际情况选择合适的变体,如多项式朴素贝叶斯(用于多分类任务)、伯努利朴素贝叶斯(用于二分类任务)等。

三、基于朴素贝叶斯的文本分类方法

这个小项目其实是一个有关于垃圾邮件识别的项目。

1. 导入相关库

import re
import os
from jieba import cut
from itertools import chain
from collections import Counter
import numpy as np
from sklearn.naive_bayes import MultinomialNB

2. 过滤字词

def get_words(filename):
    words = []
    with open(filename, 'r', encoding='utf-8') as fr:
        for line in fr:
            line = line.strip()
            # 过滤无效字符
            line = re.sub(r'[.【】0-9、——。,!~\*]', '', line)
            # 使用jieba.cut()方法对文本切词处理
            line = cut(line)
            # 过滤长度为1的词
            line = filter(lambda word: len(word) > 1, line)
            words.extend(line)
    return words

3. 遍历邮件建立词库

all_words = []
def get_top_words(top_num):
    filename_list = ['邮件_files/{}.txt'.format(i) for i in range(151)]
    # 遍历邮件建立词库
    for filename in filename_list:
        all_words.append(get_words(filename))
    # itertools.chain()把all_words内的所有列表组合成一个列表
    # collections.Counter()统计词个数
    freq = Counter(chain(*all_words))
    return [i[0] for i in freq.most_common(top_num)]

4. 邮件标记并训练模型

top_words = get_top_words(100)
# 构建词-个数映射表
vector = []
for words in all_words:
    '''
    words:
    ['国际', 'SCI', '期刊', '材料', '结构力学', '工程', '杂志', '国际', 'SCI', '期刊', '先进', '材料科学',
    '材料', '工程', '杂志', '国际', 'SCI', '期刊', '图像处理', '模式识别', '人工智能', '工程', '杂志', '国际',
    'SCI', '期刊', '数据', '信息', '科学杂志', '国际', 'SCI', '期刊', '机器', '学习', '神经网络', '人工智能',
    '杂志', '国际', 'SCI', '期刊', '能源', '环境', '生态', '温度', '管理', '结合', '信息学', '杂志', '期刊',
    '网址', '论文', '篇幅', '控制', '以上', '英文', '字数', '以上', '文章', '撰写', '语言', '英语', '论文',
    '研究', '内容', '详实', '方法', '正确', '理论性', '实践性', '科学性', '前沿性', '投稿', '初稿', '需要',
    '排版', '录用', '提供', '模版', '排版', '写作', '要求', '正规', '期刊', '正规', '操作', '大牛', '出版社',
    '期刊', '期刊', '质量', '放心', '检索', '稳定', '邀请函', '推荐', '身边', '老师', '朋友', '打扰', '请谅解']
    '''
    word_map = list(map(lambda word: words.count(word), top_words))
    '''
    word_map:
    [0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
    10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
    0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
    '''
    vector.append(word_map)
vector = np.array(vector)
# 0-126.txt为垃圾邮件标记为1;127-151.txt为普通邮件标记为0
labels = np.array([1]*127 + [0]*24)

5. 预测模型

model = MultinomialNB()
model.fit(vector, labels)
def predict(filename):
    """对未知邮件分类"""
    # 构建未知邮件的词向量
    words = get_words(filename)
    current_vector = np.array(
        tuple(map(lambda word: words.count(word), top_words)))
    # 预测结果
    result = model.predict(current_vector.reshape(1, -1))
    return '垃圾邮件' if result == 1 else '普通邮件'
# 对151到155号邮件的性质预测并输出结果
print('151.txt分类情况:{}'.format(predict('邮件_files/151.txt')))
print('152.txt分类情况:{}'.format(predict('邮件_files/152.txt')))
print('153.txt分类情况:{}'.format(predict('邮件_files/153.txt')))
print('154.txt分类情况:{}'.format(predict('邮件_files/154.txt')))
print('155.txt分类情况:{}'.format(predict('邮件_files/155.txt')))

四、小结

我们找了个最简单常见的例子:垃圾邮件识别,说明了一下朴素贝叶斯进行文本分类的思路过程。基本思路是先区分好训练集与测试集,对文本集合进行分词、去除标点符号等特征预处理的操作,然后使用条件独立假设,将原概率转换成词概率乘积,再进行后续的处理。

贝叶斯公式 + 条件独立假设 = 朴素贝叶斯方法

基于对重复词语在训练阶段与判断(测试)阶段的三种不同处理方式,我们相应的有伯努利模型、多项式模型和混合模型。在训练阶段,如果样本集合太小导致某些词语并未出现,我们可以采用平滑技术对其概率给一个估计值。而且并不是所有的词语都需要统计,我们可以按相应的“停用词”和“关键词”对模型进行进一步简化,提高训练和判断速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半亩花海

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值