NaiveBayes_Text-朴素贝叶斯文本分类
NaiveBayesText-朴素贝叶斯文本分类 的真实实现位于 core/naivebayestextcalculator.py。该模块的整体流程是:
NaiveBayes_Text-朴素贝叶斯文本分类
1. 方法概述
NaiveBayes_Text-朴素贝叶斯文本分类 的真实实现位于 core/naive_bayes_text_calculator.py。该模块的整体流程是:
- 读取文本列与标签列;
- 做轻量文本清洗;
- 用
CountVectorizer或TfidfVectorizer生成特征; - 调用
sklearn的朴素贝叶斯分类器训练与预测; - 导出预测结果、混淆矩阵、分类报告、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"时调用CountVectorizervectorizer_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_modeuse_jiebalowercasengram_minngram_maxmax_featuresmin_dfmax_dfstop_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} $$
代码实际输出的主要指标包括:
accuracyprecision_weightedrecall_weightedf1_macrof1_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_text和split(train/test);向量化信息会记录vocab_size / ngram_range / vectorizer_type / token_mode;图表索引会记录混淆矩阵图和每个类别 Top 特征图的实际路径。
6.3 实际图表
当前实现稳定导出的图表包括:
confusion_matrix.pngtop_features_<类别>.png
如果类别较多,就会为每个类别分别输出一张 Top 特征图。
7. 复现脚本与实现说明
7.1 复现脚本
结果页提供“导出复现代码”按钮,会生成 repro_naive_bayes_text_时间戳.py。该脚本会:
- 复制原始数据到结果目录下的
repro_inputs/; - 固化本次参数;
- 再次调用
NaiveBayesTextCalculator复现结果。
因此复现脚本是对当前工程实现的一次参数快照,而不是单独的论文复现实验代码。
7.2 实现说明与注意事项
结合真实代码,这个模块可以概括为:一个以 Count/TF-IDF + sklearn Naive Bayes 为核心的监督文本分类工具。它支持:
MultinomialNBBernoulliNBComplementNB- 词级/字符级特征
- 可选
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_体育.png、top_features_健康.png、top_features_教育.png、top_features_科技.png、top_features_财经.png。论文图题必须绑定到具体类别或明确写成“若干类别 Top 特征图”。 - 当前标准输入副本位于
repro_inputs/sample_data.csv;repro_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复现口径,论文附录可直接按这个路径写。