正在加载中...

展开本页目录
算法教程Sentiment-情感分析

Sentiment-情感分析

No.067 · 在线教程

Sentiment-情感分析 的真实实现位于 core/calculator.py。这个模块不是单一算法,而是提供两条并行实现路径:

Sentiment-情感分析

1. 方法概述

Sentiment-情感分析 的真实实现位于 core/calculator.py。这个模块不是单一算法,而是提供两条并行实现路径:

  1. lexicon:词典法情感分析
  2. supervised:监督学习情感分类

设输入文本集合为

$$ \mathcal{D}=\{d_i\}_{i=1}^{N} \tag{1} $$

模块统一先读取 text_column,可选读取 id_columnlabel_column。文本会做简单空白归一化:

$$ \tilde{d}_i=\mathrm{Norm}(d_i) \tag{2} $$

其中 Norm 只是把连续空白折叠为单个空格并去掉首尾空白,不做复杂清洗或深度语义编码。

2. 词典法(lexicon)

2.1 分词与词典

词典法的核心输入是正向词典 \(L^{+}\) 与负向词典 \(L^{-}\)。如果用户未提供自定义词典文件,代码会回退到一套很小的内置演示词典,里面包含如 好/喜欢/good/great差/讨厌/bad/terrible 等词。

分词器 tokenizer 支持:

  • auto
  • jieba
  • word
  • char

其中 auto/jieba 在检测到中文时会优先尝试 jieba.lcut();若显式选择 jieba 但环境里没有安装 jieba,程序会直接报错。char 则按非空白字符逐字切分,word 使用正则分词。

记分词结果为

$$ \mathcal{T}(d_i)=\{t_{i1},t_{i2},\dots,t_{im_i}\} \tag{3} $$

2.2 词典打分

对每条文本,程序分别累计正向命中得分与负向命中得分:

$$ s_i^{+}=\sum_{t\in \mathcal{T}(d_i)\cap L^{+}} w^{+}(t) \tag{4} $$

$$ s_i^{-}=\sum_{t\in \mathcal{T}(d_i)\cap L^{-}} w^{-}(t) \tag{5} $$

情感总分定义为

$$ s_i=s_i^{+}-s_i^{-} \tag{6} $$

代码还会记录 pos_hitsneg_hits,并额外给出归一化分数:

$$ \bar{s}_i=\frac{s_i}{\max(1,\mathrm{pos\_hits}_i+\mathrm{neg\_hits}_i)} \tag{7} $$

2.3 情感标签判定

设中性阈值为 \(\delta=\text{neutral\_threshold}\),则词典法情感标签为

$$ \hat{y}_i= \begin{cases} \text{positive}, & s_i>\delta \\ \text{negative}, & s_i<-\delta \\ \text{neutral}, & |s_i|\le \delta \end{cases} \tag{8} $$

这正对应导出的 sentiment_label 列。

3. 监督学习(supervised)

3.1 标签处理

监督学习模式要求提供 label_column。代码会先删除空标签样本;若全部为空,则直接报错。

当用户提供 positive_label_value/negative_label_value,或程序能从常见值中自动推断出正负类时,会进入二分类映射:

$$ y_i= \begin{cases} 1, & \text{label}_i=\text{positive\_label\_value} \\ 0, & \text{otherwise} \end{cases} \tag{9} $$

若不能稳定推断为二分类,则退回到 LabelEncoder 做多分类编码。

3.2 训练/测试划分

模块对清洗后的文本做随机切分,而不是按时间顺序留出:

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

其中 \(r=\text{test\_size}\)。若类别数量与样本规模允许,则使用分层抽样;若最小类别样本数不足 2,或训练/测试样本无法覆盖全部类别,则自动禁用 stratify 并记录 warning。

此外,代码硬性要求监督学习样本数至少为 10 条。

3.3 文本表示

监督学习分支并不支持 CountVectorizer,而是固定使用 TfidfVectorizer。特征可写为

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

其中真实可调参数包括:

  • analyzerwordchar
  • ngram_min/ngram_max
  • max_features
  • min_df

这里还有一个实现细节:若 min_df 大于等于训练样本数,程序会自动把它下调;若向量化仍因“词表为空”报错,则再次强制降到 1。

3.4 分类模型分支

监督学习模式实际支持三种模型:

  • logregLogisticRegression
  • linear_svcLinearSVC
  • nbMultinomialNB

因此它不是单一的“情感分类器”,而是 TF-IDF + 经典线性/贝叶斯分类器 的统一外壳。

对线性模型而言,可把判别函数写成

$$ z_c(x)=w_c^\top x+b_c \tag{12} $$

预测类别为

$$ \hat{y}=\arg\max_c z_c(x) \tag{13} $$

若模型支持 predict_proba(),则 score_positive 来自正类概率;若不支持但有 decision_function(),则 score_positive 实际是分类间隔而不是概率:

$$ \mathrm{score\_positive}(x)= \begin{cases} P(y=1\mid x), & \text{if predict\_proba exists} \\ f(x), & \text{if decision\_function exists} \end{cases} \tag{14} $$

这在 LinearSVC 分支中尤其重要,因为其 score_positive 不是概率值。

4. 评价指标与特征解释

4.1 监督学习指标

测试集准确率为

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

二分类模式会额外输出:

  • precision
  • recall
  • f1
  • roc_auc
  • average_precision

多分类模式则输出:

  • precision_macro
  • recall_macro
  • f1_macro
  • f1_micro

混淆矩阵定义为

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

词典法默认不计算这些监督学习指标,因此 MetricsConfusion_MatrixClassification_Report 会为空或不存在。

4.2 Top Features

只有当模型具有 coef_ 属性时,代码才会导出 Top_Features。因此:

  • LogisticRegressionLinearSVC 可以输出 Top 特征;
  • MultinomialNB 默认不会进入这条分支。

Top 特征的选取逻辑是对某个系数向量 \(c\) 取最大和最小的若干维:

$$ \mathrm{TopPos}=\operatorname{argsort}_j(c_j),\qquad \mathrm{TopNeg}=\operatorname{argsort}_j(-c_j) \tag{17} $$

导出的 Top_Features 表包含:

  • type
  • feature
  • weight

4.3 标签分布的真实含义

无论是词典法还是监督学习,Label_Distribution 工作表统计的都是模型输出标签分布,而不是原始真实标签分布。监督学习模式下,它来自所有样本的 pred_label 计数;词典法下,它来自所有样本的 sentiment_label 计数。

5. 输出结果与导出

5.1 词典法导出

词典法实际会导出:

  • Parameters
  • Processed_Data
  • RawData
  • Data_Head
  • Predictions
  • Lexicon_Summary
  • Label_Distribution

其中 Predictions 中的核心列包括:

  • pos_hits
  • neg_hits
  • pos_score
  • neg_score
  • sentiment_score
  • sentiment_score_norm
  • sentiment_label

5.2 监督学习导出

监督学习模式实际会导出:

  • Parameters
  • Processed_Data
  • RawData
  • Data_Head
  • Predictions
  • Metrics
  • Confusion_Matrix
  • Top_Features
  • Label_Distribution
  • Vectorizer_Config
  • Split_Info
  • Classification_Report
  • Processed_Info
  • Charts

其中:

  • Processed_Data 是清洗后实际参与分析的样本;
  • Predictions 保存的是所有样本的预测,不只是测试集;
  • MetricsConfusion_Matrix 仅基于测试集计算。

5.3 图表

实际导出的图表包括:

  • label_distribution.png
  • sentiment_score_hist.png:仅词典法
  • confusion_matrix.png:仅监督学习
  • top_features.png:仅在线性模型且存在 Top_Features

其中 top_features.png 不是 calculator.py 直接生成的,而是 utils/sentiment_exporter.py 根据 Top_Features 表在导出阶段绘制的。

6. 复现脚本与实现说明

6.1 复现脚本

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

  • 将原始输入复制到结果目录的 repro_inputs/
  • 固化 SentimentOptions
  • 重新调用 SentimentCalculatorexport_sentiment_results()

并把导出的复现 Excel 命名为与脚本同名的 .xlsx 文件。

6.2 实现说明与注意事项

结合真实代码,这个模块更准确的定义应当是“情感分析工具箱”,而不是单一情感算法。它包含两套思路:

  • 词典法:词典匹配 + 加权计分 + 阈值判别
  • 监督学习:TF-IDF + LogisticRegression/LinearSVC/MultinomialNB

它的优点是工程化完整、导出友好、可同时覆盖无监督打分与监督分类两类场景;但边界也很清楚:

  • 不使用深度预训练语言模型;
  • 不做上下文语义理解;
  • 词典法依赖词典覆盖率;
  • 监督学习分支是经典浅层文本分类,而不是专门的神经情感模型。

因此,这个实现适合快速构建论文中的情感分析基线与可复现实验结果,但不应等同于现代 Transformer 情感分类系统。

7. 论文写作模板

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

“本文采用情感分析方法对文本样本的情绪倾向进行识别。首先,对原始文本执行清洗、分词和基础预处理;其次,根据实验设定分别采用词典规则法或监督学习法完成情感判别,其中词典法通过情感词和修饰词规则计算情感得分,监督学习法则通过文本特征训练分类模型;随后,在样本集上输出情感标签、得分结果及评价指标;最后,结合结果表与可视化输出,对文本情感分布及其差异特征进行分析。”

8. 单篇终审补充

8.1 图题与表题对齐建议

  • Parameters 表可写为:表X 情感分析参数设置表。
  • Processed_Data 表可写为:表X 情感分析处理后数据表。
  • RawData 表可写为:表X 情感分析原始数据表。
  • Data_Head 表可写为:表X 情感分析数据预览表。
  • Predictions 表可写为:表X 情感分析预测结果表。
  • Metrics 表可写为:表X 情感分析模型指标表。
  • Confusion_Matrix 表可写为:表X 情感分析混淆矩阵表。
  • Top_Features 表可写为:表X 情感分析 Top 特征表。
  • Label_Distribution 表可写为:表X 情感分析标签分布表。
  • Vectorizer_Config 表可写为:表X 情感分析向量化配置表。
  • Split_Info 表可写为:表X 情感分析数据切分信息表。
  • Classification_Report 表可写为:表X 情感分析分类报告表。
  • Processed_Info 表可写为:表X 情感分析处理信息表。
  • Charts 表可写为:表X 情感分析图表索引表。
  • confusion_matrix.png 建议写为:图X 情感分析混淆矩阵图。
  • label_distribution.png 建议写为:图X 情感标签分布图。
  • top_features.png 建议写为:图X 情感分析 Top 特征图。
  • sentiment_score_hist.png 建议写为:图X 词典法情感得分分布直方图。

8.2 终审说明

  • 当前适合在正文中引用的代表性结果目录可采用 results/Sentiment-情感分析分析结果_20260329_150735。其中主工作簿为 sentiment_results_20260329_150735.xlsx,复现输出为 repro_sentiment_20260329_150735.xlsx
  • 当前监督学习分支的真实工作表为 Parameters/Processed_Data/RawData/Data_Head/Predictions/Metrics/Confusion_Matrix/Top_Features/Label_Distribution/Vectorizer_Config/Split_Info/Classification_Report/Processed_Info/Charts。论文如果引用该目录,表题应按这套英文 sheet 名落地。
  • 当前稳定实体图文件为 charts/confusion_matrix.pngcharts/label_distribution.pngcharts/top_features.png。如果正文写“情感得分直方图”,必须明确那是词典法分支下的 sentiment_score_hist.png,不能混入当前监督学习代表性目录。
  • 真实 repro 脚本为 repro_sentiment_20260329_150735.py,并通过 FILE_PATH = SCRIPT_DIR / 'repro_inputs' / 'sentiment_ui_input.csv' 读取输入副本。附录中的路径说明应保持 repro_inputs/... 相对路径结构。
  • 当前模块同时包含词典法和监督学习法两条实现链路。论文方法部分必须先说明所选分支,再解释指标和图表来源,否则容易把词典法的打分结果与监督学习分类结果混写。

8.3 全量强化补充

  • 当前应锁定的首层主结果目录是 具体的算法3/NLP基础/Sentiment-情感分析/results/Sentiment-情感分析分析结果_20260329_150735。主工作簿为 具体的算法3/NLP基础/Sentiment-情感分析/results/Sentiment-情感分析分析结果_20260329_150735/sentiment_results_20260329_150735.xlsx,复现再生成工作簿是同目录下的 repro_sentiment_20260329_150735.xlsx
  • 当前主工作簿实际工作表为 ParametersProcessed_DataRawDataData_HeadPredictionsMetricsConfusion_MatrixTop_FeaturesLabel_DistributionVectorizer_ConfigSplit_InfoClassification_ReportProcessed_InfoCharts。因此这一主证据明确属于监督学习分支,而不是词典法分支。
  • 当前主图文件位于首层 charts/ 目录下,分别是 具体的算法3/NLP基础/Sentiment-情感分析/results/Sentiment-情感分析分析结果_20260329_150735/charts/confusion_matrix.pnglabel_distribution.pngtop_features.png。当前目录中并不存在 sentiment_score_hist.png,所以正文若采用这套代表性目录,就不应再写“情感得分直方图”。
  • 当前 repro 脚本为 具体的算法3/NLP基础/Sentiment-情感分析/results/Sentiment-情感分析分析结果_20260329_150735/repro_sentiment_20260329_150735.py,其真实输入口径为 FILE_PATH = SCRIPT_DIR / 'repro_inputs' / 'sentiment_ui_input.csv';对应输入副本位于首层 repro_inputs/sentiment_ui_input.csv
  • 由于同目录下已经存在 repro_sentiment_20260329_150735.xlsx,写文档时应明确区分:sentiment_results_20260329_150735.xlsx 是首层主结果,repro_sentiment_20260329_150735.xlsx 是由复现脚本重新生成的结果簿,不能把两本表写成一轮导出的双主结果。

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

  • 当前实现的主结果目录应写作 具体的算法3/NLP基础/Sentiment-情感分析/results/Sentiment-情感分析分析结果_20260329_150735,主工作簿以 sentiment_results_20260329_150735.xlsx 为准。
  • 正文应围绕 ParametersProcessed_DataRawDataData_HeadPredictionsMetricsConfusion_MatrixTop_FeaturesLabel_DistributionVectorizer_ConfigSplit_InfoClassification_ReportProcessed_InfoCharts 来写。
  • 图证应对应 charts/confusion_matrix.pngcharts/label_distribution.pngcharts/top_features.png;不要把词典法分支的 sentiment_score_hist.png 混进这次监督学习代表目录。
  • repro_sentiment_20260329_150735.py + repro_inputs/sentiment_ui_input.csv 是标准 repro_inputs 复现口径,正文中应和主结果工作簿分开说明。