正在加载中...

展开本页目录
算法教程NaiveBayes_Text-朴素贝叶斯文本分类

NaiveBayes_Text-朴素贝叶斯文本分类

No.065 · 在线教程

NaiveBayesText-朴素贝叶斯文本分类 的真实实现位于 core/naivebayestextcalculator.py。该模块的整体流程是:

NaiveBayes_Text-朴素贝叶斯文本分类

1. 方法概述

NaiveBayes_Text-朴素贝叶斯文本分类 的真实实现位于 core/naive_bayes_text_calculator.py。该模块的整体流程是:

  1. 读取文本列与标签列;
  2. 做轻量文本清洗;
  3. CountVectorizerTfidfVectorizer 生成特征;
  4. 调用 sklearn 的朴素贝叶斯分类器训练与预测;
  5. 导出预测结果、混淆矩阵、分类报告、Top 特征和图表。

设样本集为

$$ \mathcal{D}=\{(s_i,y_i)\}_{i=1}^{N} \tag{1} $$

其中 \(s_i\) 为文本,\(y_i\) 为类别标签。该模块只支持监督文本分类,不支持回归,也不做无监督主题发现。

2. 数据清洗与训练/测试划分

2.1 文本与标签清洗

程序先保留所选的文本列与标签列,然后:

  • 文本列先 fillna("") 再转字符串;
  • 标签列先 fillna("") 再转字符串并 strip()
  • 文本中的连续空白被折叠为单个空格;
  • 空文本样本和空标签样本会被删除。

记规范化函数为 \(\mathrm{Norm}(\cdot)\),则清洗后的文本为

$$ \tilde{s}_i=\mathrm{Norm}(s_i) \tag{2} $$

只有满足 \(|\tilde{s}_i|>0\) 且 \(|y_i|>0\) 的样本才会进入训练流程。

2.2 最小样本与类别约束

代码中还会检查:

  • 总样本数至少为 min_samples
  • 类别数至少为 min_classes
  • 每个类别至少有 2 条样本

若类别数记为 \(C\),则要求

$$ C\ge \text{min\_classes},\qquad \min_c n_c \ge 2 \tag{3} $$

这样做是为了保证后续训练/测试切分不会因为分层抽样失败而中断。

2.3 划分方式

程序使用 train_test_split() 划分训练集与测试集。设测试比例为 \(r\),则

$$ \mathcal{D}_{\mathrm{train}}\cup \mathcal{D}_{\mathrm{test}}=\mathcal{D}',\qquad |\mathcal{D}_{\mathrm{test}}|\approx r|\mathcal{D}'| \tag{4} $$

其中 \(\mathcal{D}'\) 是清洗后的有效数据集。实际实现会优先按标签做 stratify=labels 的分层切分;若分层切分异常,则自动退回为非分层随机切分。

这说明该模块不是按时间顺序切分,而是标准的随机监督学习评估流程。

3. 文本表示

3.1 Count 与 TF-IDF 两种向量化

模块支持两类文本表示:

  • vectorizer_type="count" 时调用 CountVectorizer
  • vectorizer_type="tfidf" 时调用 TfidfVectorizer

若采用词频表示,则文档向量可以写为

$$ x_{iv}=c(v,\tilde{s}_i) \tag{5} $$

若采用 TF-IDF,则特征可以写为

$$ x_{iv}=\mathrm{tf}_{iv}\cdot \log\frac{N}{\mathrm{df}_v} \tag{6} $$

其中 \(v\) 为词项,\(\mathrm{df}_v\) 为包含词项 \(v\) 的文档数。

这里有一个很关键的实现细节:虽然算法名叫“朴素贝叶斯文本分类”,但它并不强制使用原始词频;代码允许把 TF-IDF 向量直接输入 MultinomialNB / BernoulliNB / ComplementNB

3.2 分词与词表控制

向量化器的真实参数包括:

  • token_mode
  • use_jieba
  • lowercase
  • ngram_min
  • ngram_max
  • max_features
  • min_df
  • max_df
  • stop_words

其中:

$$ \mathrm{ngram\_range}=(n_{\min},n_{\max}) \tag{7} $$

token_mode="char" 时,代码显式设置 analyzer="char",即使用字符级 \(n\)-gram;当 token_mode="word"use_jieba=True 时,会加载 jieba.lcut() 作为自定义 tokenizer。若系统中没有安装 jieba,则会直接报错。

4. 朴素贝叶斯分类模型

4.1 通用判别公式

无论底层选用哪种朴素贝叶斯模型,预测时都遵循“后验概率最大”的思想:

$$ P(y=c\mid x)\propto P(y=c)\cdot P(x\mid y=c) \tag{8} $$

最终预测类别为

$$ \hat{y}=\arg\max_c P(y=c\mid x) \tag{9} $$

4.2 MultinomialNB

model_type="MultinomialNB" 时,适合非负词频或 TF-IDF 特征。其典型条件分布可写为

$$ P(x\mid y=c)\propto \prod_{v=1}^{V}\theta_{cv}^{\,x_v} \tag{10} $$

其中平滑后的条件概率可理解为

$$ \theta_{cv}=\frac{N_{cv}+\alpha}{\sum_{u=1}^{V}N_{cu}+\alpha V} \tag{11} $$

这里 \(\alpha=\text{alpha}\) 是拉普拉斯/加性平滑参数。

4.3 BernoulliNB

model_type="BernoulliNB" 时,模型更强调词项“是否出现”。代码中 binarize 参数会传给 BernoulliNB,相当于把特征转为二值存在变量:

$$ b_v=\mathbf{1}(x_v>\tau),\qquad \tau=\text{binarize} \tag{12} $$

对应的条件似然可写为

$$ P(x\mid y=c)\propto \prod_{v=1}^{V}\theta_{cv}^{\,b_v}(1-\theta_{cv})^{1-b_v} \tag{13} $$

4.4 ComplementNB

model_type="ComplementNB" 时,程序调用 sklearn.naive_bayes.ComplementNB。这一分支不是直接使用当前类的词频统计,而是利用“补类”统计构造权重,对类别不平衡和稀疏文本通常更稳健。工程上,这里没有手写公式,而是完全依赖 sklearn 的实现。

5. 训练、预测与特征解释

5.1 模型训练与预测

训练阶段先在训练集上 fit

$$ \mathcal{M}=\mathrm{NBTrain}(X_{\mathrm{train}},y_{\mathrm{train}}) \tag{14} $$

再在测试集上得到预测:

$$ \hat{y}_i=\mathcal{M}(x_i^{\mathrm{test}}) \tag{15} $$

代码会尽量调用 predict_proba(),若成功,则把每条样本最大类别概率写入 pred_prob 列:

$$ \hat{p}_i=\max_c P(y=c\mid x_i) \tag{16} $$

5.2 Top 特征

模块会读取 model.feature_log_prob_,对每个类别挑出条件对数概率最大的 top_k_features 个词,形成 Top特征 表:

$$ \mathrm{TopTerms}(c)=\operatorname{argsort}_v\big(\log P(v\mid c)\big) \tag{17} $$

并额外导出

$$ P(v\mid c)=\exp(\log P(v\mid c)) \tag{18} $$

用于绘制每个类别的 top_features_<类别>.png 条形图。

6. 评价指标与输出结果解释

6.1 分类指标

测试集上的准确率定义为

$$ \mathrm{Accuracy}=\frac{1}{|\mathcal{D}_{\mathrm{test}}|}\sum_i \mathbf{1}(\hat{y}_i=y_i) \tag{19} $$

代码实际输出的主要指标包括:

  • accuracy
  • precision_weighted
  • recall_weighted
  • f1_macro
  • f1_weighted

其中混淆矩阵为

$$ \mathrm{CM}_{ab}=\sum_i \mathbf{1}(y_i=a,\hat{y}_i=b) \tag{20} $$

分类报告则由 classification_report(..., output_dict=True) 转成表格导出。

6.2 输出结果说明

save_to_excel() 的真实导出工作表为:

  • 原始数据
  • 处理后数据
  • 预测结果
  • 混淆矩阵
  • 分类报告
  • Top特征
  • 模型指标
  • 参数
  • 向量化信息
  • 图表索引

其中:

  • 处理后数据 会保留 clean_textsplit(train/test)
  • 向量化信息 会记录 vocab_size / ngram_range / vectorizer_type / token_mode
  • 图表索引 会记录混淆矩阵图和每个类别 Top 特征图的实际路径。

6.3 实际图表

当前实现稳定导出的图表包括:

  • confusion_matrix.png
  • top_features_<类别>.png

如果类别较多,就会为每个类别分别输出一张 Top 特征图。

7. 复现脚本与实现说明

7.1 复现脚本

结果页提供“导出复现代码”按钮,会生成 repro_naive_bayes_text_时间戳.py。该脚本会:

  • 复制原始数据到结果目录下的 repro_inputs/
  • 固化本次参数;
  • 再次调用 NaiveBayesTextCalculator 复现结果。

因此复现脚本是对当前工程实现的一次参数快照,而不是单独的论文复现实验代码。

7.2 实现说明与注意事项

结合真实代码,这个模块可以概括为:一个以 Count/TF-IDF + sklearn Naive Bayes 为核心的监督文本分类工具。它支持:

  • MultinomialNB
  • BernoulliNB
  • ComplementNB
  • 词级/字符级特征
  • 可选 jieba 中文分词
  • 随机训练/测试划分

但它也有明确边界:

  • 没有交叉验证;
  • 没有独立验证集;
  • 不做超参数搜索;
  • 不做深层语义编码,只使用稀疏词项特征;
  • 评估结果完全取决于一次随机切分。

因此,该实现更适合做经典文本分类基线和工程化快速分析,而不是面向大型语义建模的深度学习方案。

8. 论文写作模板

可在论文“方法部分”中写为:

“本文采用朴素贝叶斯文本分类方法对文本样本进行自动判别。首先,对文本进行清洗、分词或 \(n\)-gram 向量化,并将文本转换为监督学习可用的特征矩阵;其次,基于条件独立假设训练朴素贝叶斯分类模型,学习词项特征与类别之间的概率关系;随后,在测试样本上输出类别预测、分类指标及特征解释结果;最后,结合预测结果表和导出图表,对模型分类性能与文本类别差异进行分析。”

9. 单篇终审补充

9.1 图题与表题对齐建议

  • 原始数据 表可写为:表X 朴素贝叶斯文本分类原始数据表。
  • 处理后数据 表可写为:表X 朴素贝叶斯文本分类处理后数据表。
  • 预测结果 表可写为:表X 朴素贝叶斯文本分类预测结果表。
  • 混淆矩阵 表可写为:表X 朴素贝叶斯文本分类混淆矩阵表。
  • 分类报告 表可写为:表X 朴素贝叶斯文本分类分类报告表。
  • Top特征 表可写为:表X 朴素贝叶斯文本分类 Top 特征表。
  • 模型指标 表可写为:表X 朴素贝叶斯文本分类模型指标汇总表。
  • 参数 表可写为:表X 朴素贝叶斯文本分类参数设置表。
  • 向量化信息 表可写为:表X 朴素贝叶斯文本分类向量化信息表。
  • 图表索引 表可写为:表X 朴素贝叶斯文本分类图表索引与路径清单。
  • confusion_matrix.png 建议写为:图X 朴素贝叶斯文本分类混淆矩阵图。
  • top_features_<类别>.png 建议写为:图X 某类别的 Top 特征条形图。

9.2 终审说明

  • 当前代表性结果目录中的真实主工作簿为 NaiveBayes_Text_results_20260324_003436.xlsx,复现输出为 NaiveBayes_Text_复现结果_20260324_003436.xlsx。论文附录若列文件名,应把主运行结果与复现结果分开描述。
  • 当前真实工作表为 原始数据/处理后数据/预测结果/混淆矩阵/分类报告/Top特征/模型指标/参数/向量化信息/图表索引,终稿表题应按这套中文工作表口径落地。
  • 当前实体图文件除了 confusion_matrix.png 外,还会为每个类别生成一张 top_features_<类别>.png。正文若引用 Top 特征图,必须绑定具体类别名,不能把它写成一张通用总图。
  • 真实 repro 脚本为 repro_naive_bayes_text_20260324_003436.py,并通过 SRC_FILE = 'repro_inputs/sample_data.csv' 读取输入副本。附录中的复现实验说明应保持这一相对路径口径。
  • 当前结果完全来自一次随机训练/测试切分。论文若强调稳定性,应另补多次运行或交叉验证实验,不能把这一次切分结果直接包装成“稳健结论”。

9.3 全量强化补充

  • 本轮按真实磁盘再次核对,算法目录为 具体的算法3/NLP基础/NaiveBayes_Text-朴素贝叶斯文本分类,代表性结果目录为 具体的算法3/NLP基础/NaiveBayes_Text-朴素贝叶斯文本分类/results/NaiveBayes_Text-朴素贝叶斯文本分类分析结果_20260324_003436
  • 该目录不是“单工作簿单图目录”,而是主结果与 repro 再生产物并存的双层结构:主工作簿为 NaiveBayes_Text_results_20260324_003436.xlsx,repro 再生产物为 NaiveBayes_Text_复现结果_20260324_003436.xlsx;对应图目录分别是 NaiveBayes_Text_results_20260324_003436_plots/NaiveBayes_Text_复现结果_20260324_003436_plots/
  • 两份工作簿的实际工作表一致,均为 原始数据处理后数据预测结果混淆矩阵分类报告Top特征模型指标参数向量化信息图表索引。因此正文若要比较主运行与复现运行,应该比较指标数值和预测结果,而不是声称二者导出结构不同。
  • 当前实体图并不是单张总图,而是在两套图目录里各自包含一张 confusion_matrix.png 和多张按类别拆分的 top_features_体育.pngtop_features_健康.pngtop_features_教育.pngtop_features_科技.pngtop_features_财经.png。论文图题必须绑定到具体类别或明确写成“若干类别 Top 特征图”。
  • 当前标准输入副本位于 repro_inputs/sample_data.csvrepro_naive_bayes_text_20260324_003436.py 中明确写有 SRC_FILE = 'repro_inputs/sample_data.csv'。这说明该算法的复现口径已经标准化,不应再写成脚本同目录临时 CSV 或绝对路径。
  • 需要排除干扰目录。results/_tmp_nb_illegal_plots 属于非法文件名兼容性测试残留,results/pytest_exportcheck_nb_text_20260316_041148 属于测试中间目录,二者都不应被当作论文或交付时的主证据目录。

10. 软件实现核查补充(2026-07)

  • 当前实现的主结果目录应写作 具体的算法3/NLP基础/NaiveBayes_Text-朴素贝叶斯文本分类/results/NaiveBayes_Text-朴素贝叶斯文本分类分析结果_20260324_003436,主工作簿以 NaiveBayes_Text_results_20260324_003436.xlsx 为准。
  • 正文应围绕 原始数据处理后数据预测结果混淆矩阵分类报告Top特征模型指标参数向量化信息图表索引 来写。
  • 图证应对应主图目录与复现图目录中的 confusion_matrix.png 和各类别 top_features_<类别>.png,并明确主/复现两套图并存的事实。
  • repro_naive_bayes_text_20260324_003436.py + repro_inputs/sample_data.csv 是标准 repro_inputs 复现口径,论文附录可直接按这个路径写。