人工智能之语言领域 自然语言处理 第六章 情感分析

人工智能之语言领域

第六章 情感分析


文章目录

  • 人工智能之语言领域
  • [前言 情感分析](#前言 情感分析)
    • [6.1 情感分析概述](#6.1 情感分析概述)
      • [6.1.1 情感分析的层级](#6.1.1 情感分析的层级)
      • [6.1.2 核心任务类型](#6.1.2 核心任务类型)
    • [6.2 情感分析的关键技术](#6.2 情感分析的关键技术)
    • [6.3 主流模型在情感分析中的应用](#6.3 主流模型在情感分析中的应用)
      • [6.3.1 传统模型与深度学习模型对比](#6.3.1 传统模型与深度学习模型对比)
      • [6.3.2 预训练模型在情感分析中的微调策略](#6.3.2 预训练模型在情感分析中的微调策略)
    • [6.4 实战案例:社交媒体舆情情感分析与可视化](#6.4 实战案例:社交媒体舆情情感分析与可视化)
      • 任务目标
      • 完整实现步骤
        • [Step 1: 模拟数据(实际可用爬虫或 API 获取)](#Step 1: 模拟数据(实际可用爬虫或 API 获取))
        • [Step 2: 加载微调好的情感模型(或使用在线 API)](#Step 2: 加载微调好的情感模型(或使用在线 API))
        • [Step 3: 可视化情感分布](#Step 3: 可视化情感分布)
        • [Step 4: 生成情感关键词云(按情感分组)](#Step 4: 生成情感关键词云(按情感分组))
    • 补充:情感分析挑战与前沿方向
    • 小结
  • 资料关注

前言 情感分析

情感分析(Sentiment Analysis),又称意见挖掘(Opinion Mining),旨在自动识别和提取文本中表达的主观情感、态度或情绪。从用户评论到社交媒体,从产品反馈到政治舆情,情感分析已成为企业决策、品牌监控和人机交互的关键技术。本章将深入介绍情感分析的层级结构、核心技术、主流模型,并通过社交媒体舆情实战案例完整演示分析与可视化流程。


6.1 情感分析概述

6.1.1 情感分析的层级

情感分析可从细粒度到粗粒度分为三个层级:

层级 目标 示例
词级(Word-level) 判断单个词的情感倾向 "好" → 正面;"差" → 负面
句级(Sentence-level) 判断整个句子的情感极性 "这部电影太棒了!" → 正面
篇章级(Document-level) 判断整篇文档的总体情感 一篇商品评论整体是好评还是差评

原始文本
词级情感
句级情感
篇章级情感
'烂' → 负面
'虽然贵但质量好' → 正面
整篇影评 → 正面

💡 实际应用中,句级和篇章级最常用;词级主要用于构建情感词典或辅助分析。


6.1.2 核心任务类型

任务 说明 输出形式
情感极性判断 判断正面/负面/中性 三分类标签
情感强度分析 量化情感强烈程度 分数(如 -1.0 ~ +1.0)
情绪分类(Emotion Detection) 识别具体情绪类别 如喜、怒、哀、惧、惊讶、厌恶(Ekman 六情绪)

🌰 示例:

  • 极性:"服务很差" → 负面
  • 强度:"服务极其差" → 强度得分 -0.9
  • 情绪:"我气死了!" → 情绪 = "愤怒"

6.2 情感分析的关键技术

6.2.1 情感词典的构建与应用

情感词典(Sentiment Lexicon) 是包含词语及其情感极性/强度的资源库。

常见中文情感词典:
  • BosonNLP 情感词典:带强度分数(-1.0 ~ +1.0)
  • 知网 HowNet 情感词集
  • 台湾大学 NTUSD 情感词典
  • 自建词典:通过众包或远程监督构建
应用方式(基于规则):
  1. 分词
  2. 匹配情感词
  3. 加权求和(考虑否定、程度副词)
python 复制代码
# 示例:使用 BosonNLP 词典进行简单情感打分
# 下载地址:https://github.com/bosonnlp/sentiment/blob/master/SentimentDict.txt

def load_boson_dict(path):
    sentiment_dict = {}
    with open(path, 'r', encoding='utf-8') as f:
        for line in f:
            if line.strip():
                word, score = line.strip().split()
                sentiment_dict[word] = float(score)
    return sentiment_dict

# 简化版情感打分(忽略否定和程度)
def simple_sentiment_score(text, sentiment_dict, tokenizer):
    words = tokenizer(text)
    score = sum(sentiment_dict.get(w, 0) for w in words)
    return 1 if score > 0 else (0 if score < 0 else 0.5)  # 1:正, 0:负, 0.5:中性

# 使用 jieba 分词
import jieba
boson_dict = load_boson_dict("SentimentDict.txt")
text = "这个手机非常好用"
score = simple_sentiment_score(text, boson_dict, lambda x: jieba.lcut(x))
print("情感得分:", score)  # 1

⚠️ 缺陷:无法处理上下文(如"不好的好")、讽刺("这服务真是绝了")。


6.2.2 上下文情感消歧

同一词在不同上下文中情感可能不同:

  • "":价格高(负面) vs 质量高(正面)
  • "":杀人(负面) vs 杀价(正面,对买家)

解决方案

  • 使用上下文感知模型(如 BERT)替代静态词典
  • 引入依存句法分析,定位情感修饰对象

价格太高了
依存分析
高 --nsubj--> 价格
情感: 负面
质量非常高
依存分析
高 --nsubj--> 质量
情感: 正面

✅ 现代 NLP 模型(如 BERT)天然具备上下文消歧能力。


6.2.3 否定词与程度副词的处理

否定词(如"不"、"没"、"无")会反转情感极性:

"好" → 正面;"不好" → 负面

程度副词(如"非常"、"有点"、"极其")调节情感强度:

"好" → +0.5;"非常好" → +0.8

规则系统处理策略:
  1. 定义否定词表、程度副词表及权重
  2. 扫描句子,动态调整情感值
python 复制代码
# 简化规则示例
negation_words = {"不", "没", "无", "非"}
intensifiers = {"非常": 1.5, "极其": 2.0, "有点": 0.5, "稍微": 0.7}

def rule_based_sentiment(text, sentiment_dict):
    words = jieba.lcut(text)
    total_score = 0
    negate = False
    intensify = 1.0
    
    for w in words:
        if w in negation_words:
            negate = not negate  # 支持多重否定
        elif w in intensifiers:
            intensify = intensifiers[w]
        elif w in sentiment_dict:
            score = sentiment_dict[w]
            if negate:
                score = -score
            total_score += score * intensify
            # 重置状态(简化)
            negate = False
            intensify = 1.0
            
    return total_score

🔍 工业级系统(如百度情感分析 API)通常结合规则 + 深度学习


6.3 主流模型在情感分析中的应用

6.3.1 传统模型与深度学习模型对比

方法 优点 缺点 适用场景
情感词典 + 规则 可解释、无需训练数据 难以覆盖复杂语言现象 快速原型、领域词典丰富
TF-IDF + LR/SVM 训练快、效果稳定 忽略语序和上下文 中小数据集、基线模型
LSTM/CNN 自动学习特征、捕捉序列 需大量数据、训练慢 自有标注数据、追求性能
BERT 等预训练模型 SOTA 性能、上下文感知 计算资源要求高 高精度需求、有 GPU

📊 实验表明:在中文情感分析任务上,BERT 微调通常比传统方法高 5--10% 的 F1 值。


6.3.2 预训练模型在情感分析中的微调策略

BERT 为例的标准微调流程:
输入文本
BERT Tokenizer
BERT Encoder
CLS 向量
Dropout
全连接层 768→3
Softmax → 情感标签

关键实践技巧:
  1. 学习率2e-5 ~ 5e-5(不宜过大)
  2. Batch Size:16--32(显存允许下越大越好)
  3. Early Stopping:防止过拟合
  4. 类别平衡 :若数据不平衡,使用 class_weight 或 Focal Loss
python 复制代码
# 使用 transformers 微调 BERT 进行情感三分类
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
from datasets import load_dataset
import numpy as np

# 加载中文情感数据集(如 ChnSentiCorp 扩展为三分类)
dataset = load_dataset("seamew/ChnSentiCorp")  # 二分类,可自行构造中性样本

tokenizer = AutoTokenizer.from_pretrained("hfl/chinese-roberta-wwm-ext")
model = AutoModelForSequenceClassification.from_pretrained(
    "hfl/chinese-roberta-wwm-ext", 
    num_labels=3  # 正面/中性/负面
)

def tokenize_function(examples):
    return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=128)

tokenized_datasets = dataset.map(tokenize_function, batched=True)

training_args = TrainingArguments(
    output_dir="./sentiment-model",
    evaluation_strategy="epoch",
    save_strategy="epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=64,
    num_train_epochs=3,
    weight_decay=0.01,
    load_best_model_at_end=True,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["test"],
)

trainer.train()

🌐 中文推荐模型:

  • bert-base-chinese
  • hfl/chinese-roberta-wwm-ext(哈工大 & 讯飞,中文优化)
  • Langboat/mengzi-bert-base-fin(金融领域)

6.4 实战案例:社交媒体舆情情感分析与可视化

任务目标

  • 从微博/推特等平台采集关于某品牌(如"iPhone")的评论
  • 分析情感分布(正面/负面/中性)
  • 可视化情感趋势与关键词云

完整实现步骤

Step 1: 模拟数据(实际可用爬虫或 API 获取)
python 复制代码
# 模拟微博评论数据
comments = [
    "iPhone15 太贵了,不值得买",
    "拍照效果超棒,爱了爱了!",
    "电池续航一般,但系统流畅",
    "客服态度很差,再也不买了",
    "性价比还行吧,中规中矩"
]
labels = [0, 1, 2, 0, 2]  # 0:负面, 1:正面, 2:中性
Step 2: 加载微调好的情感模型(或使用在线 API)
python 复制代码
# 使用 pipeline 快速预测
from transformers import pipeline

classifier = pipeline(
    "sentiment-analysis",
    model="uer/roberta-base-finetuned-chinanews-chinese",  # 中文情感模型
    tokenizer="uer/roberta-base-finetuned-chinanews-chinese",
    return_all_scores=True
)

results = classifier(comments)
for comment, res in zip(comments, results):
    print(f"评论: {comment}")
    for r in res:
        print(f"  {r['label']}: {r['score']:.3f}")
    print()

💡 若需三分类,可微调自己的模型或使用多标签策略。

Step 3: 可视化情感分布
python 复制代码
import matplotlib.pyplot as plt
from collections import Counter

# 假设已获得预测标签 pred_labels
pred_labels = [0, 1, 2, 0, 2]  # 示例

label_map = {0: '负面', 1: '正面', 2: '中性'}
counts = Counter(pred_labels)
labels = [label_map[k] for k in counts.keys()]
sizes = list(counts.values())

plt.figure(figsize=(8, 6))
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140, colors=['red','green','gray'])
plt.title("iPhone 微博评论情感分布")
plt.show()
Step 4: 生成情感关键词云(按情感分组)
python 复制代码
from wordcloud import WordCloud
import jieba

# 按情感分组文本
positive_text = " ".join([c for c, l in zip(comments, pred_labels) if l == 1])
negative_text = " ".join([c for c, l in zip(comments, pred_labels) if l == 0])

# 中文分词
pos_words = " ".join(jieba.lcut(positive_text))
neg_words = " ".join(jieba.lcut(negative_text))

# 生成词云
wc_pos = WordCloud(font_path="simhei.ttf", background_color="white").generate(pos_words)
wc_neg = WordCloud(font_path="simhei.ttf", background_color="white").generate(neg_words)

plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.imshow(wc_pos, interpolation='bilinear')
plt.title("正面评论关键词")
plt.axis("off")

plt.subplot(1, 2, 2)
plt.imshow(wc_neg, interpolation='bilinear')
plt.title("负面评论关键词")
plt.axis("off")
plt.show()

📝 注意:需安装中文字体(如 simhei.ttf)以支持中文显示。


补充:情感分析挑战与前沿方向

挑战 解决方案
讽刺/反语 引入常识知识、多模态(表情符号、图片)
领域迁移 领域自适应(Domain Adaptation)、Prompt Tuning
低资源语言 跨语言迁移(XLM-R)、少样本学习
多模态情感 融合文本+图像+语音(如视频评论分析)

小结

情感分析作为 NLP 的经典任务,已从早期的词典规则发展为今天的深度学习驱动范式。尽管预训练模型(如 BERT)大幅提升了性能,但否定处理、上下文消歧、讽刺识别 等挑战依然存在。在实际应用中,应根据数据规模、领域特性、实时性要求选择合适技术栈------小项目可用规则+词典快速上线,大系统则推荐 BERT 微调以获得最佳效果。

未来,情感分析将与多模态理解因果推理可解释 AI 深度融合,迈向更智能、更人性化的文本理解。


资料关注

咚咚王

《Python 编程:从入门到实践》

《利用 Python 进行数据分析》

《算法导论中文第三版》

《概率论与数理统计(第四版) (盛骤) 》

《程序员的数学》

《线性代数应该这样学第 3 版》

《微积分和数学分析引论》

《(西瓜书)周志华-机器学习》

《TensorFlow 机器学习实战指南》

《Sklearn 与 TensorFlow 机器学习实用指南》

《模式识别(第四版)》

《深度学习 deep learning》伊恩·古德费洛著 花书

《Python 深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》

《深入浅出神经网络与深度学习 +(迈克尔·尼尔森(Michael+Nielsen)》

《自然语言处理综论 第 2 版》

《Natural-Language-Processing-with-PyTorch》

《计算机视觉-算法与应用(中文版)》

《Learning OpenCV 4》

《AIGC:智能创作时代》杜雨 +&+ 张孜铭

《AIGC 原理与实践:零基础学大语言模型、扩散模型和多模态模型》

《从零构建大语言模型(中文版)》

《实战 AI 大模型》

《AI 3.0》

相关推荐
Hefei GlobefishAI1 分钟前
合肥合豚AI硬件方案:专为智能售货柜厂商定制的无人零售接口套件
人工智能·零售·自动售货机·无人零售硬件·ai硬件方案·智能售货柜·接口套件
冬奇Lab7 分钟前
每日一个开源项目(第127篇):PM Skills Marketplace - 把顶级产品方法论塞进 AI Agent
人工智能·开源·资讯
吴佳浩21 分钟前
Hermes vs OpenClaw:基于源码的 Agent Loop 全面分析
人工智能·llm·agent
AI袋鼠帝23 分钟前
腾讯出手了!彻底入局企业级Agent。
人工智能
和平宇宙26 分钟前
AI笔记005. hermes-DeepSeek V4 Pro, 128K上下文引发的探索
前端·人工智能·笔记
56AI27 分钟前
360 智语 AI 企业智能体平台深度评测:从 L4 蜂群架构到政企落地实战
人工智能·架构
IT_陈寒39 分钟前
Redis持久化这个坑,我爬了一整天才出来
前端·人工智能·后端
kimi-22244 分钟前
LangChain 里的 chatmodel.bind_tools 和 ReAct Agent
人工智能
zhangfeng11331 小时前
计算机视觉vc 3D 希尔伯特曲线 基础介绍,人工智能
人工智能·计算机视觉·3d
没事别瞎琢磨1 小时前
十一、审计与 Run Session——每一步操作都被记录
人工智能·node.js