正在加载中...

展开本页目录
算法教程SVM_Text-SVM 文本分类

SVM_Text-SVM 文本分类

No.068 · 在线教程

SVMText-SVM 文本分类 的真实实现位于 core/svmtextcalculator.py。该模块的完整流程是:

SVM_Text-SVM 文本分类

1. 方法概述

SVM_Text-SVM 文本分类 的真实实现位于 core/svm_text_calculator.py。该模块的完整流程是:

  1. 读取文本列与标签列;
  2. 清洗空文本并构造 clean_text
  3. CountVectorizerTfidfVectorizer 得到稀疏文本向量;
  4. 调用 LinearSVCSVC 完成监督分类;
  5. 导出预测表、混淆矩阵、分类报告、Top 特征、词表统计和图表。

设数据集为

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

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

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

2.1 文本清洗

代码会先对文本列和标签列做 fillna(""),再转为字符串,避免缺失值被误写成字面量 "nan"。随后文本执行轻量归一化:

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

其中 Clean 的实际逻辑只是把连续空白压缩成单个空格并去掉首尾空白。空文本样本和空标签样本会被直接删除。

2.2 标签与样本约束

在正式训练前,代码还要求:

  • 类别数至少为 2;
  • 每个类别至少有 2 条样本。

若类别计数为 \(n_c\),则必须满足

$$ |\mathcal{C}|\ge 2,\qquad \min_c n_c \ge 2 \tag{3} $$

否则程序会直接报错,不会进入切分与训练。

2.3 划分方式

训练/测试集通过 train_test_split() 生成:

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

其中 \(r=\text{test\_size}\)。真实实现里 _try_split() 还会把测试比例限制在 \([0.1,0.5]\) 区间,并优先尝试 stratify=labels;若分层失败,则自动退回非分层随机切分。

这意味着该模块不是按时间顺序留出,而是典型的随机监督学习评估流程。

3. 文本表示

3.1 Count 与 TF-IDF

模块支持两类文本表示:

  • vectorizer_type="count"
  • vectorizer_type="tfidf"

词频表示下,文档向量可写为

$$ 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} $$

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

3.2 分词与词表参数

代码暴露的向量化参数包括:

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

token_mode="char" 时,向量化器显式设置 analyzer="char";当 token_mode="word"use_jieba=True 时,会加载 jieba.lcut() 作为 tokenizer。若没有安装 jieba,则会直接报错。

其中 n-gram 范围为

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

需要注意一个实现约束:代码要求 min_df <= max_df,并明确提示二者最好保持同一种含义,即都作为比例或都作为计数使用。

4. SVM 分类模型

4.1 LinearSVC

model_type="LinearSVC" 时,使用线性支持向量机。其典型软间隔目标可写为

$$ \min_{w,b,\xi}\; \frac{1}{2}\lVert w\rVert^2 + C\sum_{i=1}^{N}\xi_i \tag{8} $$

并满足

$$ y_i(w^\top x_i+b)\ge 1-\xi_i,\qquad \xi_i\ge 0 \tag{9} $$

这里 \(C=\text{c}\) 是正则化系数。代码还支持 class_weight="balanced",用于类别不平衡场景。

4.2 SVC

model_type="SVC" 时,程序改用核 SVM,并支持:

  • kernel=linear
  • kernel=rbf
  • kernel=poly
  • kernel=sigmoid

核 SVM 的判别函数可写为

$$ f(x)=\sum_{i=1}^{N}\alpha_i y_i K(x_i,x)+b \tag{10} $$

其中 \(K(\cdot,\cdot)\) 由 kernel 决定;gammadegreecoef0 分别作用于不同核函数配置。代码还把 decision_function_shape 固定为 ovr,即 one-vs-rest 风格的多分类判别。

4.3 预测输出

无论使用 LinearSVC 还是 SVC,最终预测类别都满足

$$ \hat{y}=\arg\max_c f_c(x) \tag{11} $$

对二分类问题,若能获得 predict_proba()decision_function(),程序还会提取一维打分序列 score,写入 预测结果 工作表。这一列在不同模型下含义不同:

  • 若来自 predict_proba(),它更接近概率;
  • 若来自 decision_function(),它是间隔分数而不是概率。

5. 指标、AUC 与特征解释

5.1 分类指标

测试集准确率定义为

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

代码稳定输出的主要指标包括:

  • accuracy
  • precision_weighted
  • recall_weighted
  • f1_macro
  • f1_weighted

混淆矩阵定义为

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

5.2 ROC-AUC / PR-AUC

若是二分类且能得到一维打分 \(g_i\),程序会进一步计算:

$$ \mathrm{ROC\text{-}AUC}=\int_0^1 \mathrm{TPR}(\mathrm{FPR}^{-1}(u))\,du \tag{14} $$

$$ \mathrm{PR\text{-}AUC}=\int_0^1 \mathrm{Precision}(r)\,dr \tag{15} $$

并导出 roc_curve.pngpr_curve.png。若是多分类且 y_score_2d 维度正确,则只计算 roc_auc_ovr_macropr_auc_ovr_macro,通常不会生成二分类式曲线图。

5.3 Top 特征

只有模型存在 coef_ 时,代码才会生成 Top特征。因此:

  • LinearSVC 一般可以输出 Top 特征;
  • SVC 只有在线性核且模型暴露 coef_ 时才可能输出;
  • 非线性核大多无法稳定给出词项权重解释。

特征排序逻辑是根据权重向量做 argsort:

$$ \mathrm{TopTerms}(c)=\operatorname{argsort}_j(w_{cj}) \tag{16} $$

二分类时,程序会分别提取正向和负向特征;多分类时,则为每个类别提取 top-k 高权重词项。

6. 输出结果与导出

6.1 实际工作表

save_to_excel() 的真实导出内容为:

  • 原始数据
  • 处理后数据
  • 预测结果
  • 混淆矩阵
  • 分类报告
  • Top特征
  • Vocab
  • TFIDF_Stats
  • Metrics
  • Parameters
  • 向量化信息
  • 图表索引

其中:

  • 处理后数据 会保留 clean_textsplit(train/test)
  • 预测结果 只保存测试集样本,不是全量样本;
  • Vocab 会记录词表索引,若使用 TF-IDF 还会追加 idf
  • TFIDF_Stats 只在 vectorizer_type="tfidf" 时存在有效内容。

6.2 实际图表

当前实现可能导出的图表包括:

  • confusion_matrix.png
  • roc_curve.png
  • pr_curve.png
  • top_features.png

但并不是每次都会全部出现:

  • roc_curve/pr_curve 需要可计算的一维打分;
  • top_features 需要模型存在可解释的 coef_

6.3 复现脚本

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

  • 把原始输入复制到结果目录下的 repro_inputs/
  • 固化本次参数快照
  • 再次调用 SVMTextCalculator

并把复现 Excel 命名为 SVM_Text_repro_时间戳.xlsx

7. 实现说明与注意事项

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

  • 词级/字符级特征
  • 可选 jieba 中文分词
  • 线性 SVM 与核 SVM
  • 混淆矩阵、分类报告、AUC、PR 和 Top 特征导出

但它也有明确边界:

  • 不是深度语义模型;
  • 特征仍然是稀疏词项向量;
  • 评估基于一次随机切分;
  • 非线性核下通常缺乏清晰的词项级可解释性。

因此,这个实现更适合做经典文本分类基线和论文中的 SVM 对照实验,而不是现代预训练语言模型方案。

8. 论文写作模板

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

“本文采用支持向量机文本分类方法对文本样本进行自动识别。首先,对原始文本进行清洗、切分和向量化表示,构造监督学习所需的文本特征矩阵;其次,利用支持向量机建立类别判别模型,并通过间隔最大化思想学习最优分类边界;随后,在测试样本上输出类别预测、AUC 和分类评价指标;最后,结合预测结果表与特征解释结果,对模型分类性能和关键判别词项进行分析。”

9. 单篇终审补充

9.1 图题与表题对齐建议

  • 原始数据 表可写为:表X SVM 文本分类原始数据表。
  • 处理后数据 表可写为:表X SVM 文本分类处理后数据表。
  • 预测结果 表可写为:表X SVM 文本分类预测结果表。
  • 混淆矩阵 表可写为:表X SVM 文本分类混淆矩阵表。
  • 分类报告 表可写为:表X SVM 文本分类分类报告表。
  • Top特征 表可写为:表X SVM 文本分类 Top 特征表。
  • Vocab 表可写为:表X SVM 文本分类词表统计表。
  • TFIDF_Stats 表可写为:表X SVM 文本分类 TF-IDF 统计表。
  • Metrics 表可写为:表X SVM 文本分类模型指标表。
  • Parameters 表可写为:表X SVM 文本分类参数设置表。
  • 向量化信息 表可写为:表X SVM 文本分类向量化信息表。
  • 图表索引 表可写为:表X SVM 文本分类图表索引与路径清单。
  • confusion_matrix.png 建议写为:图X SVM 文本分类混淆矩阵图。
  • top_features.png 建议写为:图X SVM 文本分类 Top 特征图。

9.2 终审说明

  • 当前代表性结果目录可采用 results/svm_text_manual_run_20260323_191425。其中主工作簿为 svm_text_manual.xlsx,复现输出为 SVM_Text_repro_20260323_191425.xlsx
  • 当前真实工作表为 原始数据/处理后数据/预测结果/混淆矩阵/分类报告/Top特征/Vocab/TFIDF_Stats/Metrics/Parameters/向量化信息/图表索引。论文表题最好直接贴合这套中文与英文混合的 sheet 名,不要自行改成其他分类器模板。
  • 当前稳定实体图文件为 svm_text_manual_plots/confusion_matrix.pngsvm_text_manual_plots/top_features.png;复现输出也会在 SVM_Text_repro_20260323_191425_plots/ 下再生成一份同名图片。正文引用时应说明是主运行图还是复现图。
  • 真实 repro 脚本为 repro_svm_text_20260323_191425.py,并通过 SRC_FILE = 'repro_inputs/sample_data.csv' 读取输入副本。附录复现部分应保留这一相对路径和脚本命名。
  • roc_curve/pr_curve 并不是每次都稳定存在,top_features.png 也依赖模型具有 coef_。因此论文正文若需要引用 ROC、PR 或 Top 特征图,必须以实际结果目录中的实体文件为准,而不是按功能清单默认它一定会生成。

9.3 全量强化补充

  • 本轮按真实磁盘再次核对,算法目录为 具体的算法3/NLP基础/SVM_Text-SVM 文本分类,代表性结果目录为 具体的算法3/NLP基础/SVM_Text-SVM 文本分类/results/svm_text_manual_run_20260323_191425
  • 该目录不是单工作簿结构,而是主运行与 repro 再生产物并存:主工作簿为 svm_text_manual.xlsx,repro 输出为 SVM_Text_repro_20260323_191425.xlsx。两份工作簿的真实工作表一致,均为 原始数据处理后数据预测结果混淆矩阵分类报告Top特征VocabTFIDF_StatsMetricsParameters向量化信息图表索引
  • 当前主图目录为 svm_text_manual_plots/,复现图目录为 SVM_Text_repro_20260323_191425_plots/。两套目录中均实际存在 confusion_matrix.pngpr_curve.pngroc_curve.pngtop_features.png,因此这一次目录可以支撑 ROC/PR 与 Top 特征的联合图证。
  • 当前输入副本位于 repro_inputs/sample_data.csvrepro_svm_text_20260323_191425.py 中明确写有 SRC_FILE = 'repro_inputs/sample_data.csv'。这属于标准 repro_inputs/... 结构。
  • 需要排除干扰目录。svm_text_tmp 是临时目录,svm_text_smoke_*svm_text_ui_probe_* 是测试/探针目录;论文和交付说明应优先使用 svm_text_manual_run_20260323_191425 这一手动运行目录。
  • 这篇在论文里可以比 NaiveBayes_Text 多写一层“线性可解释性 + ROC/PR 图证”,但仍要坚持以当前实体图为准,不能把所有功能清单里的图都默认写进正文。

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

  • 当前实现的主结果目录应写作 具体的算法3/NLP基础/SVM_Text-SVM 文本分类/results/svm_text_manual_run_20260323_191425,主工作簿以 svm_text_manual.xlsx 为准。
  • 正文应围绕 原始数据处理后数据预测结果混淆矩阵分类报告Top特征VocabTFIDF_StatsMetricsParameters向量化信息图表索引 来写。
  • 图证应对应主图目录与复现图目录中的 confusion_matrix.pngroc_curve.pngpr_curve.pngtop_features.png,并明确主运行与复现输出并存。
  • repro_svm_text_20260323_191425.py + repro_inputs/sample_data.csv 是标准 repro_inputs 复现口径,附录可直接按这个路径写。