Sentiment-情感分析
Sentiment-情感分析 的真实实现位于 core/calculator.py。这个模块不是单一算法,而是提供两条并行实现路径:
Sentiment-情感分析
1. 方法概述
Sentiment-情感分析 的真实实现位于 core/calculator.py。这个模块不是单一算法,而是提供两条并行实现路径:
lexicon:词典法情感分析supervised:监督学习情感分类
设输入文本集合为
$$ \mathcal{D}=\{d_i\}_{i=1}^{N} \tag{1} $$
模块统一先读取 text_column,可选读取 id_column 与 label_column。文本会做简单空白归一化:
$$ \tilde{d}_i=\mathrm{Norm}(d_i) \tag{2} $$
其中 Norm 只是把连续空白折叠为单个空格并去掉首尾空白,不做复杂清洗或深度语义编码。
2. 词典法(lexicon)
2.1 分词与词典
词典法的核心输入是正向词典 \(L^{+}\) 与负向词典 \(L^{-}\)。如果用户未提供自定义词典文件,代码会回退到一套很小的内置演示词典,里面包含如 好/喜欢/good/great 和 差/讨厌/bad/terrible 等词。
分词器 tokenizer 支持:
autojiebawordchar
其中 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_hits 与 neg_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} $$
其中真实可调参数包括:
analyzer:word或charngram_min/ngram_maxmax_featuresmin_df
这里还有一个实现细节:若 min_df 大于等于训练样本数,程序会自动把它下调;若向量化仍因“词表为空”报错,则再次强制降到 1。
3.4 分类模型分支
监督学习模式实际支持三种模型:
logreg:LogisticRegressionlinear_svc:LinearSVCnb:MultinomialNB
因此它不是单一的“情感分类器”,而是 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} $$
二分类模式会额外输出:
precisionrecallf1roc_aucaverage_precision
多分类模式则输出:
precision_macrorecall_macrof1_macrof1_micro
混淆矩阵定义为
$$ \mathrm{CM}_{ab}=\sum_i \mathbf{1}(y_i=a,\hat{y}_i=b) \tag{16} $$
词典法默认不计算这些监督学习指标,因此 Metrics、Confusion_Matrix、Classification_Report 会为空或不存在。
4.2 Top Features
只有当模型具有 coef_ 属性时,代码才会导出 Top_Features。因此:
LogisticRegression和LinearSVC可以输出 Top 特征;MultinomialNB默认不会进入这条分支。
Top 特征的选取逻辑是对某个系数向量 \(c\) 取最大和最小的若干维:
$$ \mathrm{TopPos}=\operatorname{argsort}_j(c_j),\qquad \mathrm{TopNeg}=\operatorname{argsort}_j(-c_j) \tag{17} $$
导出的 Top_Features 表包含:
typefeatureweight
4.3 标签分布的真实含义
无论是词典法还是监督学习,Label_Distribution 工作表统计的都是模型输出标签分布,而不是原始真实标签分布。监督学习模式下,它来自所有样本的 pred_label 计数;词典法下,它来自所有样本的 sentiment_label 计数。
5. 输出结果与导出
5.1 词典法导出
词典法实际会导出:
ParametersProcessed_DataRawDataData_HeadPredictionsLexicon_SummaryLabel_Distribution
其中 Predictions 中的核心列包括:
pos_hitsneg_hitspos_scoreneg_scoresentiment_scoresentiment_score_normsentiment_label
5.2 监督学习导出
监督学习模式实际会导出:
ParametersProcessed_DataRawDataData_HeadPredictionsMetricsConfusion_MatrixTop_FeaturesLabel_DistributionVectorizer_ConfigSplit_InfoClassification_ReportProcessed_InfoCharts
其中:
Processed_Data是清洗后实际参与分析的样本;Predictions保存的是所有样本的预测,不只是测试集;Metrics与Confusion_Matrix仅基于测试集计算。
5.3 图表
实际导出的图表包括:
label_distribution.pngsentiment_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 - 重新调用
SentimentCalculator与export_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.png、charts/label_distribution.png、charts/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。 - 当前主工作簿实际工作表为
Parameters、Processed_Data、RawData、Data_Head、Predictions、Metrics、Confusion_Matrix、Top_Features、Label_Distribution、Vectorizer_Config、Split_Info、Classification_Report、Processed_Info、Charts。因此这一主证据明确属于监督学习分支,而不是词典法分支。 - 当前主图文件位于首层
charts/目录下,分别是具体的算法3/NLP基础/Sentiment-情感分析/results/Sentiment-情感分析分析结果_20260329_150735/charts/confusion_matrix.png、label_distribution.png、top_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为准。 - 正文应围绕
Parameters、Processed_Data、RawData、Data_Head、Predictions、Metrics、Confusion_Matrix、Top_Features、Label_Distribution、Vectorizer_Config、Split_Info、Classification_Report、Processed_Info、Charts来写。 - 图证应对应
charts/confusion_matrix.png、charts/label_distribution.png、charts/top_features.png;不要把词典法分支的sentiment_score_hist.png混进这次监督学习代表目录。 repro_sentiment_20260329_150735.py + repro_inputs/sentiment_ui_input.csv是标准repro_inputs复现口径,正文中应和主结果工作簿分开说明。