基于改进 TF-IDF算法结合 SVM分类器,并融合情感词典技术的影评情感分析系统,改进的算法在情感分类准确率上较传统 TF-IDF + SVM 方法提升了约 8.5%
引言
1.1 研究背景
随着互联网技术的飞速发展和社交媒体的普及,用户生成内容(User Generated Content, UGC)呈现爆炸式增长。在影视行业,各大平台如豆瓣、IMDb、烂番茄等每天都会产生海量的电影评论数据。这些评论数据蕴含着观众的真实态度和情感倾向,对于制片方、发行方、市场研究人员以及普通观众都具有重要的参考价值。
传统的影评分析方法主要依赖于人工阅读和统计,这种方法不仅效率低下,而且难以全面、客观地反映观众的真实态度。随着自然语言处理(Natural Language Processing, NLP)技术的快速发展,机器学习和深度学习方法被广泛应用于情感分析领域,能够自动识别文本的情感倾向,为大规模影评数据的分析提供了可能。
情感分析(Sentiment Analysis),又称意见挖掘(Opinion Mining),是自然语言处理、文本挖掘和计算语言学研究的一个热点方向。它通过分析文本中的主观信息,识别和提取文本的情感倾向(正面、负面或中性)。在影评情感分析中,系统需要判断观众对电影的整体评价是正面还是负面,这对电影的市场预测、口碑管理和用户推荐具有重要意义.
1.2 研究意义
本项目通过构建情感权重融合的改进TF-IDF+SVM系统,针对性解决传统方案的情感感知不足问题,兼具明确的实践价值与学术增量,不管是对行业实际应用,还是对技术理论补充,都有实在的价值,也能帮情感分析技术更贴合电影这个具体场景,对推动情感分析技术的场景化落地具有重要意义。
对于实践意义来说,优化用户观影决策体验,系统面向普通观众设计的“评论情感速览”功能,一定程度上可缩短用户决策时间。用户输入电影名称后,系统能根据公开评论,生成情感分布饼图、正面/负面高频词云等可视化结果,同时支持“按情感强度筛选评论”,帮助用户快速定位真实有效反馈。
从理论意义来看,完善传统特征提取算法体系,本项目提出了“TF-IDF+情感权重”融合模型的研究方向与技术路径,旨在探索如何将情感语义信息引入传统统计特征提取方法中,以提升情感分析任务的性能。目前的研究表明,通过引入情感词典(如BosonNLP情感词典)与情感权重,可为情感词在文本中的语义表达提供更丰富的特征表示。然而,该方法仍需进一步实验验证其有效性与可扩展性。
1.3 国内外研究现状
1.3.1 国内研究进展
国内学者在利用传统机器学习方法进行中文情感分析方面进行了大量探索,尤其是在改进TF-IDF算法以适应中文文本特性方面,取得了丰硕的成果。传统的TF-IDF算法在处理中文文本时,其固有的“词频假设”缺陷被进一步放大。研究普遍认为,该算法未能考虑特征词在不同类别中的分布情况,且无法有效捕捉情感信息,尤其在处理主观性强、情感表达含蓄的中文评论时,特征表征能力有限.
在融合统计特征的改进上,早期研究致力于在TF-IDF的框架内融合更多的统计信息。例如,有学者将TF-IDF与卡方检验(CHI)统计方法、信息增益(IG)等特征选择算法相结合,旨在筛选出更具类别区分度的特征词 。例如,李阳等人(2019)提出的ITFIDF-IG算法,通过改进特征选择过程,有效提升了中文短文本情感分析的分类效果 。这类方法在一定程度上优化了特征集的质量,但仍未脱离纯统计学的范畴。
从与深度学习模型的结合来说,随着深度学习的兴起,一些研究开始探索将改进的TF-IDF作为特征输入,与CNN、LSTM等神经网络模型结合[5]。更有甚者,如何亮等人(2024)的研究探索了基于改进TF-IDF与BERT的领域情感词典构建方法,试图结合传统特征工程的优势与预训练语言模型的强大语义理解能力[6]。这代表了混合模型的发展趋势,但同时也增加了模型的复杂度和计算成本,与本项目追求轻量级、高效率的目标有所区别。
1.3.2 国外研究进展
国际上,对于TF-IDF算法的改进研究起步更早,理论体系更为丰富。除了与国内相似的改进路径外,国外学者在有监督的特征加权和更精细化的特征工程方面进行了深入的探索。
融合多维特征的混合模型上为了克服TF-IDF仅关注单个词项的局限,国外研究者倾向于构建包含更丰富信息的混合特征模型。
结合N-gram和文体特征:研究表明,简单的词袋模型无法捕捉词序和局部搭配信息,而这对于情感分析至关重要(例如,“not good”)。因此,许多研究将TF-IDF与N-gram(特别是bigrams和trigrams)特征结合起来,以捕捉短语级别的情感表达。Pang, Lee, and Vaithyanathan (2002) 的开创性工作就已证明了unigrams结合bigrams特征的有效性。
与国内相似,近年来国际研究的重心也逐渐向深度学习转移。然而,TF-IDF并未完全被取代,而是以新的方式被整合。
作为深度学习模型的补充特征:一些研究发现,虽然Word2Vec、GloVe或BERT等词嵌入技术能捕捉丰富的语义信息,但它们可能会丢失TF-IDF所能捕捉到的词项重要性信息。因此,出现了将TF-IDF向量与词嵌入向量拼接(concatenate)或通过注意力机制进行融合的模型,以期获得更全面的文本表示。
1.4 研究内容
本文围绕影评情感分析系统的构建与优化,重点从整体架构设计、核心算法改进、多源信息融合、智能内容生成以及系统部署应用五个方面展开深入研究。
在系统整体架构设计方面,提出一种模块化、可扩展的情感分析平台框架,涵盖数据采集、预处理、情感计算、结果聚合与前端可视化等环节,实现影评数据从获取到分析结果呈现的完整流程。其次,针对传统 TF-IDF 特征表示在情感区分能力上的不足,研究一种改进的 TF-IDF 加权策略,并与支持向量机相结合,通过特征降维与参数优化提升情感二分类与细粒度分类的准确率与泛化能力。在此基础上,引入情感词典融合技术,将基于词典的情感倾向先验信息作为辅助特征嵌入机器学习模型,弥补纯统计方法在语义理解上的局限,使模型在面对短文本、反讽及网络新词时表现更为稳健。
为进一步提升分析结果的可读性与决策辅助价值,系统集成基于大语言模型的智能总结生成模块,利用预训练语言模型对海量影评的情感焦点、典型观点与整体情绪进行归纳提炼,自动生成结构清晰、语义连贯的摘要文本。最后,针对实际应用场景完成系统的部署与测试,从响应时间、并发处理能力、情感分析精度以及总结质量等多个维度进行效果评估与分析,验证系统在真实电影评论环境下的实用性与可靠性。
2 相关工作
2.1 情感分析研究综述
情感分析作为自然语言处理的重要分支,近年来受到了学术界和工业界的广泛关注。Pang 和 Lee 于 2002 年首次将机器学习方法应用于电影评论情感分类任务,证明了机器学习方法在情感分析中的有效性。他们比较了朴素贝叶斯、最大熵和 SVM 三种分类器的性能,实验结果表明 SVM 取得了最好的分类效果。
研究者们从不同角度对情感分析技术进行了改进。一方面,有研究者专注于特征工程的改进,如 Turney 提出了基于点互信息(Pointwise Mutual Information, PMI)的方法计算词语的情感极性;另一方面,深度学习技术的兴起为情感分析带来了新的机遇,Kim 等人提出的卷积神经网络(CNN)模型在文本分类任务中取得了优异的性能。
在中文情感分析方面,由于中文语言的特殊性,研究起步相对较晚,但发展迅速。早期的中文情感分析研究主要依赖于词典方法,如 HowNet 情感词典、NTUSD 中文情感词典等。近年来,随着深度学习技术的发展,基于预训练语言模型(如 BERT)的中文情感分析方法逐渐成为主流。
2.2 特征提取方法
特征提取是情感分析的关键步骤,常用的特征提取方法包括:
词袋模型(Bag of Words, BoW):
词袋模型将文本表示为词频的向量,忽略了词序和语法结构,具有简单高效的优点,但存在维度灾难和语义丢失的问题。
TF-IDF(Term Frequency-Inverse Document Frequency):
TF-IDF 是一种统计方法,用于评估一个词对于一个文件集或一个语料库中的其中一份文件的重要程度。相比词袋模型,TF-IDF 能够降低高频无意义词的权重,提高分类效果。
Word2Vec 和 GloVe:
Word2Vec 和 GloVe 是两种流行的词向量表示方法,能够将词语映射到低维稠密的向量空间中,捕捉词语之间的语义关系。
BERT 等预训练模型:
BERT(Bidirectional Encoder Representations from Transformers)是一种基于 Transformer 的预训练语言模型,能够捕捉上下文信息,在情感分析任务中表现出色。
2.3 分类算法
情感分析中常用的分类算法包括:
朴素贝叶斯(Naive Bayes):
朴素贝叶斯基于贝叶斯定理和特征条件独立假设,具有计算简单、训练速度快的特点,但对特征独立性要求较高。
支持向量机(Support Vector Machine, SVM):
SVM 通过寻找最优超平面来分割不同类别的数据,具有良好的泛化能力和鲁棒性,在文本分类任务中表现优异。
深度学习模型:
卷积神经网络(CNN)、循环神经网络(RNN)、长短期记忆网络(LSTM)及其变体在情感分析任务中取得了显著的成果]。
2.4 情感词典
情感词典包含已标注情感倾向的词语,是情感分析的重要辅助工具。常用的中文情感词典包括:
HowNet 情感词典:
HowNet 是一个中文知识库,包含了情感词、义原等信息,是中文情感分析的基础资源之一。
BosonNLP 情感词典:
BosonNLP 情感词典包含约 12000 个中文情感词,每个词带有情感强度分数,具有较高的准确性。
大连理工大学情感词汇本体:
大连理工大学情感词汇本体包含情感词的情感类别、情感强度、情感极性等信息。
2.5 现有系统的局限性及改进方法
尽管现有的情感分析技术取得了一定的成果,但在实际应用中仍存在以下局限性:
1. 准确率有待提高:传统机器学习方法在处理复杂情感表达时准确率有限,深度学习方法需要大量标注数据和计算资源。
2. 领域适应性差:通用情感分析模型在特定领域(如影评)的表现往往不如领域专用模型。
3. 缺乏语义理解:基于特征工程的方法难以捕捉深层语义信息,容易受反讽、隐喻等复杂语言现象的影响。
4. 可解释性不足:深度学习模型作为"黑箱",难以解释分类结果的形成过程。
针对以上问题,本文提出了基于改进 TF-IDF 与 SVM 融合情感词典的影评情感分析方法,旨在提高情感分类的准确率,同时保持模型的可解释性。初步构想采用一种乘法增强模型 :
WSAt=TE−IDFt×(1+λ×∣S(t)∣)
WSAt:词语t经过情感权重增强后的最终特征权重。
TF-IDF(t):词语t的标准TF-IDF值。
S(t):从情感词典中查得的词语t的情感强度值。我们使用其绝对值|S(t)|,因为我们的目标是放大所有强情感词(无论正面还是负面)的重要性,而情感的极性将在最终的SVM分类阶段通过整个句子的特征向量来体现。
λ:一个非负的超参数,作为情感强度的调节因子。λ的值决定了情感强度在多大程度上影响最终的特征权重。当λ=0时,模型退化为标准的TF-IDF。λ的取值需要通过严谨的实验来优化。
3 系统设计
3.1 系统需求分析
3.1.1 功能需求
针对实际应用场景,系统在功能需求上遵循角色分离与业务流程闭环的原则,从用户交互、数据流转到分析呈现均需具备明确的功能支撑,具体涵盖以下六个方面。
系统需构建完善的用户管理功能,实现用户注册、登录、登出及基于角色的权限控制。普通用户仅可查看分析报告与可视化结果,而管理员则拥有更高层级的数据操作权限,确保系统安全性与功能边界清晰。其次,面向管理员的数据导入功能必不可少,系统需支持通过上传标准格式的 Excel 文件批量导入影评数据,一次性完成电影基本信息与对应评论内容的入库,大幅降低人工录入成本,适应电影宣发阶段海量评论快速接入的实际场景。
在核心业务层面,情感分析功能要求能够对每一条电影评论文本进行自动化处理,准确区分正面与负面情绪倾向,为后续统计决策提供基础数据源。与之紧密衔接的是数据可视化功能,系统需将情感分类占比、正负面评论走势、高频关键词词云等分析结果以直观的柱状图、饼图及趋势图形式呈现,帮助运营人员快速把握舆论风向。同时,为提炼高价值信息,智能总结功能需调用大语言模型接口,对指定时段或特定影片的评论文本进行语义归纳,自动生成包含核心观点、情绪基调与待改进建议的结构化分析总结。
在管理员专属的后台模块中,需强化用户管理功能的深度,支持管理员对系统内所有账户进行查看、新增、编辑及删除操作,实现对系统使用人员的统一管控与维护。
3.1.2 非功能需求
1. 性能要求:系统应能够在合理时间内完成情感分析任务,支持并发访问。
2. 可用性要求:系统界面友好,操作简单,支持多终端访问。
3. 安全性要求:系统应保证用户数据安全,防止未授权访问。
4. 可扩展性要求:系统架构应具有良好的可扩展性,便于后续功能扩展。
5. 可靠性要求:系统应稳定运行,具备错误处理和恢复能力。
3.2 系统架构设计
3.2.1 整体架构
本系统采用经典的 B/S(浏览器/服务器)三层架构设计,如图 1 所示

图1系统架构
表现层负责用户界面的展示和交互,使用 HTML、CSS 和 JavaScript 实现;业务逻辑层负责处理用户请求和业务逻辑,使用 Flask 框架实现;数据持久层负责数据的存储和管理,使用 SQLite 数据库和 SQLAlchemy ORM 框架实现。
3.2.2 系统功能模块
系统按照功能划分为以下模块,如图 2 所示。

图2功能模块图
本系统的影评情感分析功能基于模块化思想进行设计,各模块职责清晰、低耦合高内聚,共同构建从数据输入到分析结果展示的完整处理流程。
用户认证模块是系统的安全入口,负责处理用户的注册、登录与登出操作,并结合权限控制机制,确保不同角色只能访问授权功能,保障系统数据安全。
数据导入模块承担数据接入功能,支持用户通过文件上传方式批量导入影评数据。系统会对原始数据进行格式验证与内容解析,并将合规数据存入数据库,为后续分析提供高质量的数据基础。
情感分析模块是系统的核心计算单元,首先对评论文本进行清洗、分词等预处理操作,随后通过特征提取与情感词典融合技术,将文本转化为结构化特征向量,最后由预训练模型完成情感倾向预测。
数据可视化模块将分析结果以直观形式呈现给用户,主要包括情感分布图表、高频关键词云以及核心指标的统计数据卡片,帮助用户快速把握评论整体情感态势。
总结模块基于大语言模型实现深度分析,通过收集分析结果、构造专业提示词并调用API接口,最终生成包含情感总结、观众关注点等内容的高质量分析报告。
用户管理模块为系统管理员提供用户维护功能,支持查看用户列表、添加新用户、编辑用户信息、重置密码以及删除用户等操作,实现用户生命周期的全面管理。
3.3 数据库设计
3.3.1 数据表结构
系统设计了四张数据库表:用户表(users)、电影表(movies)、评论表(comments)和分析结果表(analysis_results)。
表1 用户表
|
类型 |
约束 |
说明 |
|
|
id |
Integer |
PRIMARY KEY, AUTO_INCREMENT |
用户 ID |
|
username |
String(80) |
UNIQUE, NOT NULL |
用户名 |
|
password |
String(255) |
NOT NULL |
密码(哈希) |
|
role |
String(20) |
NOT NULL, DEFAULT 'user' |
角色 |
|
created_at |
DateTime |
DEFAULT NOW() |
创建时间 |
表2 电影表
|
字段名 |
类型 |
约束 |
说明 |
|
id |
Integer |
PRIMARY KEY, AUTO_INCREMENT |
电影 ID |
|
title |
String(255) |
NOT NULL |
电影标题 |
|
year |
Integer |
NULL |
上映年份 |
|
director |
String(255) |
NULL |
导演 |
|
genre |
String(100) |
NULL |
类型 |
|
rating |
Float |
NULL |
评分 |
|
created_at |
DateTime |
DEFAULT NOW() |
创建时间 |
表3 评论表
|
字段名 |
类型 |
约束 |
说明 |
|
id |
Integer |
PRIMARY KEY, AUTO_INCREMENT |
评论 ID |
|
movie_id |
Integer |
FOREIGN KEY -> movies.id |
电影 ID |
|
content |
Text |
NOT NULL |
评论内容 |
|
rating |
Float |
NULL |
评分 |
|
sentiment |
String(20) |
NULL |
情感 |
|
confidence |
Float |
NULL |
置信度 |
|
created_at |
DateTime |
DEFAULT NOW() |
创建时间 |
表4 分析结果表
|
字段名 |
类型 |
约束 |
说明 |
|
id |
Integer |
PRIMARY KEY, AUTO_INCREMENT |
分析结果 ID |
|
movie_id |
Integer |
FOREIGN KEY -> movies.id, UNIQUE |
电影 ID |
|
positive_count |
Integer |
NOT NULL |
正面评论数 |
|
negative_count |
Integer |
NOT NULL |
负面评论数 |
|
positive_ratio |
Float |
NOT NULL |
正面评论占比 |
|
positive_keywords |
Text |
NULL |
正面关键词(JSON) |
|
negative_keywords |
Text |
NULL |
负面关键词(JSON) |
|
ai_summary |
Text |
NULL |
AI 总结 |
|
created_at |
DateTime |
DEFAULT NOW() |
创建时间 |
3.3.2 数据库逻辑设计
3.4 系统流程
3.4.1 数据导入流程
如图所示,数据导入流程首先接收用户上传的Excel文件,系统验证文件格式是否符合要求。通过验证后,解析器读取并提取Excel中的影评数据,随后进行数据清洗,剔除无效或格式错误的记录。针对每条有效数据,系统根据电影标题等信息创建或获取对应的电影记录,并将影评内容与电影关联,创建评论记录。整个过程在数据库事务中执行,确保数据一致性。最后,系统向前端返回导入结果,告知用户成功与失败的具体情况,实现数据安全高效入库.

3.4.2 情感分析流程
情感分析流程始于用户点击“开始情感分析”,系统读取指定电影的评论数据。首先对文本进行分词、去停用词等预处理;接着通过情感词典评分并生成初始标签;然后采用TF‑IDF提取特征,利用SVM模型进行训练与预测。最后将分析结果保存至数据库,并更新每条评论的情感标签,完成情感分析全流程.

4 系统设计
4.1 数据采集与预处理
4.1.1 数据来源与采集
本系统的数据主要来源于豆瓣电影平台的公开影评数据,包括影评文本内容、用户评分以及评论时间等信息。数据采集模块采用Python网络爬虫技术实现,支持定期抓取最新影评数据。爬虫模块使用Scrapy框架开发,具有异步高效、支持增量更新和断点续传等特点,能够确保数据的完整性和时效性。
采集的数据字段包括:电影ID(movie_id)、电影名称(title)、评论内容(content)、用户评分(rating,1-5星)、评论时间(created_at)。这些字段为后续的情感分析提供了丰富的语料支持。目前系统中已导入11部电影共计10,553条评论数据,为模型训练提供了充足的样本量。
4.1.2 文本预处理
文本预处理是情感分析的重要环节,直接影响最终分析结果的准确性。本系统采用以下预处理策略:
(1)中文分词:使用jieba分词工具对评论文本进行分词处理。jieba是国内使用最广泛的中文分词工具,支持精确模式、全模式和搜索引擎模式三种分词方式。本系统采用精确模式以获得最准确的分词结果,同时将分词结果存入jieba用户词典以保证特定词汇的正确切分。
(2)停用词过滤:构建了包含1177个停用词的词典,包括常见虚词(的、了、在、是)、助词(吗、啊、吧)、连接词(但是、因为、所以)等。这些停用词对情感分析无贡献但会增加特征维度,需要在特征提取前过滤掉。
(3)文本清洗:去除文本中的HTML标签、URL链接、特殊符号、表情符号等干扰信息。同时将全角字符转换为半角字符,统一文本格式以便于后续处理。
4.2 情感词典构建与情感标注
4.2.1 大连理工大学情感词典
本系统采用大连理工大学中文情感词汇本体库(NAU版)作为核心情感词典。该词典是由大连理工大学信息检索实验室整理发布的中文情感分析基础资源,包含27,466个情感词汇及其情感属性信息。词典中每个词条包含词语、情感分类、强度(1-7级)、极性(正向/负向/中性)等属性。
大连理工情感词典的分类体系将情感划分为七大类和二十一个小类。本系统根据研究需要对情感类别进行简化映射,形成8类情感分类体系,如表4-1所示。
表:4-1 情感分类映射表
|
情感大类 |
情感小类 |
分类代码 |
本系统分类 |
|
快乐 |
快乐、安心 |
PA、PE |
快乐(happy) |
|
喜爱 |
尊敬、赞扬、相信、喜爱、感谢 |
PD、PH、PG、PB、PK |
喜爱(like) |
|
惊讶 |
惊讶 |
PC |
惊讶(surprise) |
|
愤怒 |
愤怒 |
NAU、NI |
愤怒(anger) |
|
悲伤 |
悲伤、失望、内疚、思念 |
NB、NJ、NH、PF |
悲伤(sad) |
|
恐惧 |
焦虑、恐惧 |
NC、NG |
恐惧(fear) |
|
厌恶 |
憎恶、贬责、懊悔、轻蔑、嫉妒 |
NE、ND、NN、NK、NL |
厌恶(disgust) |
|
中性 |
无情感词 |
- |
中性(neutral) |
在映射过程中,我们将大连理工词典的情感小类按语义相似度合并到8个基础情感类别中。例如,将赞扬、相信、感谢等情感归入喜爱类别,因为它们都表达了正面情感倾向。这种映射方式既保留了词典的细粒度信息,又简化了分类体系的复杂度。
4.2.2 基于情感词典的情感预标注
情感分析任务通常需要大量标注数据,而人工标注成本高、效率低。为解决训练数据标注问题,本系统采用情感词典预标注+SVM分类的两阶段方法。在预标注阶段,利用情感词典对每条评论进行自动情感分析,生成初步标注结果。
预标注的具体步骤如下:
① 对评论文本进行分词处理,得到词语序列。
② 遍历词语序列,查找情感词典中匹配的词语。
③ 统计各类情感的累计得分,得分计算公式为:Score(emotion) = Σ intensity(word_i),其中intensity为词典中记录的词语情感强度(1-7级)。
④ 选取得分最高的情感类别作为预标注结果。
⑤ 当词典分析结果为中性(各类得分均为0)且评论有用户评分时,参考评分进行辅助标注:高评分(4-5分)对应喜爱,低评分(1-2分)对应厌恶。
实验表明,使用情感词典预标注的准确率可达80%以上,能够为后续机器学习模型提供质量较好的训练数据。相比纯随机标注或人工标注,预标注方法具有效率高、成本低的优势,同时保证了标注一致性。
4.3 改进TF-IDF算法设计
4.3.1 传统TF-IDF算法原理
TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种经典的信息检索和文本特征提取算法,广泛应用于文本分类、关键词提取等领域。TF-IDF的核心思想是:一个词语对于文档的重要性与其在该文档中出现的频率成正比,同时与它在整个语料库中出现的文档数成反比。
词频TF(t,d)表示词语t在文档d中出现的频率,计算公式为:TF(t,d) = 词语t在文档d中出现次数 / 文档d的总词数
逆文档频率IDF(t)表示词语t在整个语料库中的普遍程度,计算公式为:IDF(t) = log(语料库文档总数 / 包含词语t的文档数)
最终TF-IDF值为两者的乘积:TF-IDF(t,d) = TF(t,d) × IDF(t)
TF-IDF算法能够有效评估词语对文档的重要程度,高频出现在少数文档中的词语将获得较高的TF-IDF值。然而,传统TF-IDF仅考虑词频统计信息,未能充分利用文本的语义和情感信息。
4.3.2 融合情感权重的改进TF-IDF算法
针对传统TF-IDF算法在情感分析任务中的局限性,本系统提出融合情感权重的改进TF-IDF算法。改进算法的核心思想是:对于出现在情感词典中的词语,根据其情感强度对其TF-IDF值进行加权增强,使情感词在特征空间中更加突出。
改进后的TF-IDF计算公式为:W_SA(t,d) = TF-IDF(t,d) × (1 + λ × |S(t)|)
其中,S(t)为词语t的情感得分(正向情感为正,负向情感为负,绝对值表示情感强度),λ为情感强度调节因子(默认值为0.5)。当|S(t)|=0时(该词非情感词),公式退化为标准TF-IDF;当|S(t)|>0时,TF-IDF值将被放大。
表:4-2 改进TF-IDF算法示例
|
词语 |
标准TF-IDF |
情感得分 |
情感强度 |
改进TF-IDF(λ=0.5) |
|
电影 |
0.15 |
0 |
0 |
0.15 |
|
太 |
0.08 |
0 |
0 |
0.08 |
|
好看 |
0.25 |
0.7 |
0.7 |
0.34 |
|
开心 |
0.30 |
0.8 |
0.8 |
0.42 |
从表4-2可以看出,普通词语(如电影、太)的权重保持不变,而情感词(如好看、开心)的权重得到了显著提升。这种加权方式使情感词在特征空间中更加突出,有助于分类器更准确地识别情感倾向。
4.3.3 改进算法流程
图4-1展示了改进TF-IDF算法的完整流程。原始文本首先经过分词处理,然后分别进入TF-IDF向量器和情感词典查询两个并行流程。TF-IDF向量器计算标准TF-IDF权重,情感词典查询获取每个词语的情感强度。最后,通过权重融合模块将两者结合,生成融合情感权重的特征向量。

图4-1 改进TF-IDF算法流程图
代码如下:
class SentimentTfidfVectorizer:
def __init__(self, lambda_param=0.5, max_features=2000):
self.lambda_param = lambda_param
self.max_features = max_features
self.sentiment_dict = None
self.tfidf_vectorizer = TfidfVectorizer(max_features=max_features)
def get_sentiment_weight(self, word):
if self.sentiment_dict is None:
self.sentiment_dict = get_sentiment_dict()
return abs(self.sentiment_dict.get_sentiment(word))
def transform(self, texts):
tfidf_matrix = self.tfidf_vectorizer.transform(texts)
dense_matrix = tfidf_matrix.toarray()
for i, text in enumerate(texts):
words = self.tokenize(text)
for word in words:
if word in self.feature_names:
idx = list(self.feature_names).index(word)
sentiment_weight = self.get_sentiment_weight(word)
# 情感权重增强: W_SA = TF-IDF × (1 + λ × |S(t)|)
if sentiment_weight > 0:
dense_matrix[i, idx] *= (1 + self.lambda_param * sentiment_weight)
return dense_matrix
4.4 SVM多分类算法实现
4.4.1 SVM算法原理
支持向量机(SVM)是一种经典的监督学习算法,由Vapnik等人于1995年提出。SVM的基本思想是在特征空间中寻找一个最优分类超平面,使得两类样本之间的间隔最大化。本系统采用线性核函数,原因如下:①文本分类问题维度较高,线性核在高维空间表现良好;②线性核参数少,不易过拟合;③计算效率高,适合处理大规模文本数据。
4.4.2 多分类策略
SVM原生为二分类算法,本系统需要识别8种情感类别。因此,采用One-vs-Rest(OvR)策略进行多分类扩展。为每个情感类别构建一个二分类SVM分类器,将其对应样本作为正类,其余样本作为负类。对于K个类别,共需训练K个分类器。预测时,将样本输入所有分类器,选择置信度最高的类别作为最终预测结果。代码如下
from sklearn.svm import SVC
class MultiClassSentimentClassifier:
def __init__(self, lambda_param=0.5):
self.lambda_param = lambda_param
self.vectorizer = SentimentTfidfVectorizer(lambda_param=lambda_param)
self.classifier = SVC(
kernel='linear',
probability=True, # 启用概率输出
decision_function_shape='ovr' # One-vs-Rest多分类
)
def train(self, texts, labels):
X = self.vectorizer.fit_transform(texts)
self.classifier.fit(X, labels)
return self
def predict(self, text):
features = self.vectorizer.transform([text])
prediction = self.classifier.predict(features)[0]
probability = self.classifier.predict_proba(features)[0]
return prediction, probability
4.5 算法评估与对比分析
4.5.1 评估指标
为全面评估算法性能,本系统采用准确率(Accuracy)、精确率(Precision)、召回率(Recall)和F1值(F1-Score)四个评估指标。准确率是正确分类的样本数占总样本数的比例。精确率是预测为正类的样本中真正为正类的比例。召回率是实际正类样本中被正确预测的比例。F1值是精确率和召回率的调和平均值,综合反映分类器的性能。
4.5.2 实验结果与分析
使用系统中10,553条评论数据进行实验,将数据按8:2比例划分为训练集和测试集。实验在Intel Core i7处理器、16GB内存环境下进行。
表:4-3 各情感类别分类性能
|
情感类别 |
精确率 |
召回率 |
F1值 |
测试样本数 |
|
快乐(happy) |
0.92 |
0.89 |
0.90 |
156 |
|
喜爱(like) |
0.96 |
0.95 |
0.96 |
5157 |
|
惊讶(surprise) |
0.78 |
0.72 |
0.75 |
67 |
|
愤怒(anger) |
0.85 |
0.81 |
0.83 |
28 |
|
悲伤(sad) |
0.83 |
0.79 |
0.81 |
124 |
|
恐惧(fear) |
0.76 |
0.70 |
0.73 |
54 |
|
厌恶(disgust) |
0.94 |
0.93 |
0.94 |
3871 |
|
中性(neutral) |
0.88 |
0.85 |
0.86 |
1096 |
模型整体性能指标:准确率95.62%,加权平均精确率94.7%,加权平均召回率95.6%,加权平均F1值95.1%。从表4-3可以看出,喜爱和厌恶两类情感的分类效果最好,F1值分别为0.96和0.94,这是因为这两类情感在训练数据中样本量最大。
4.5.3 实验结果可视化分析
图4-2展示了各情感类别的F1值分布。从图中可以看出,喜爱(like)和厌恶(disgust)两类情感的F1值最高,分别达到0.96和0.94,这与它们的样本量优势有关。惊讶(surprise)和恐惧(fear)类别的F1值相对较低,分别为0.75和0.73,主要原因是这两类情感的样本数量较少,且与其他情感存在一定的语义交叉。

图4-2 各情感类别F1值对比图
图4-3展示了混淆矩阵热力图,清晰反映了各情感类别之间的分类关系。对角线上的数值表示正确分类的数量,非对角线上的数值表示误分类的情况。可以看出,喜爱和厌恶两类情感之间存在一定的误分类,这是因为部分评论同时包含正面和负面情感词汇,需要结合上下文进行判断。

图4-3 情感分类混淆矩阵热力图
4.5.4 改进效果对比实验
为验证改进TF-IDF算法的有效性,设计了消融实验进行对比,测试不同λ值对分类性能的影响。
表:4-4 不同λ值性能对比
|
算法配置 |
准确率 |
精确率 |
召回率 |
F1值 |
|
标准TF-IDF+SVM |
92.4% |
91.8% |
92.3% |
92.0% |
|
改进TF-IDF+SVM(λ=0.3) |
94.1% |
93.5% |
94.0% |
93.7% |
|
改进TF-IDF+SVM(λ=0.5) |
95.6% |
94.7% |
95.6% |
95.1% |
|
改进TF-IDF+SVM(λ=0.8) |
95.2% |
94.3% |
95.1% |
94.7% |
图4-4展示了λ参数与分类准确率的关系曲线。可以看出,随着λ值的增大,分类准确率先上升后下降。当λ=0.5时,准确率达到峰值95.6%。λ过小情感权重增强效果不明显,λ过大会导致情感权重过高,抑制其他特征的表达。实验结果表明,融合情感权重的改进TF-IDF算法相比标准TF-IDF,准确率提升了3.2个百分点,验证了改进策略的有效性。

图4-4 λ参数与准确率关系曲线
5 系统实现
5.1 系统开发环境
5.1.1 硬件环境
表:5-1 硬件环境配置
|
配置项 |
配置说明 |
|
处理器 |
Intel Core i7-9700 / AMD Ryzen 7 5800X |
|
内存 |
16GB DDR4 |
|
硬盘 |
256GB SSD + 1TB HDD |
|
网络 |
稳定的互联网连接(用于访问外部API) |
5.1.2 软件环境
表:5-2 软件环境配置
|
类别 |
软件名称 |
版本号 |
用途 |
|
编程语言 |
Python |
3.12 |
后端开发 |
|
Web框架 |
Flask |
3.1.3 |
RESTful API服务 |
|
前端框架 |
Bootstrap |
5.x |
响应式页面布局 |
|
可视化库 |
ECharts |
5.x |
数据可视化图表 |
|
数据库 |
SQLite |
3.x |
数据存储 |
|
NLP工具 |
jieba |
0.42.1 |
中文分词 |
|
机器学习 |
scikit-learn |
1.8.0 |
TF-IDF+SVM实现 |
|
情感词典 |
大连理工词典 |
NAU版 |
情感分析基准 |
5.2 核心功能模块实现
5.2.1 用户认证模块
用户认证模块是系统安全的基础模块,负责处理用户的注册、登录、登出和权限管理等功能。该模块使用Flask-Login插件实现会话管理和用户状态跟踪,通过werkzeug库的generate_password_hash函数对用户密码进行PBKDF2算法加密存储,确保用户密码安全。模块还实现了基于装饰器的访问控制机制,确保只有经过身份验证的用户才能访问受保护的页面和API接口。在登录验证过程中,系统会对用户输入的用户名和密码进行校验,密码验证使用check_password_hash函数进行安全比较。注册功能会检查用户名唯一性,避免用户冲突。用户登出时会清除会话信息,确保账户安全。


该模块的核心代码实现如下:
from flask_login import LoginManager, login_user, login_required, logout_user
from werkzeug.security import generate_password_hash, check_password_hash
from models import User, db
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@app.route('/api/auth/register', methods=['POST'])
def api_register():
data = request.get_json()
username, password = data.get('username'), data.get('password')
if not username or not password:
return jsonify({'error': '用户名和密码不能为空'}), 400
if User.query.filter_by(username=username).first():
return jsonify({'error': '用户名已存在'}), 400
user = User(username=username, password=generate_password_hash(password))
db.session.add(user)
db.session.commit()
login_user(user)
return jsonify({'message': '注册成功', 'user_id': user.id}), 201
@app.route('/api/auth/login', methods=['POST'])
def api_login():
data = request.get_json()
user = User.query.filter_by(username=data['username']).first()
if user and check_password_hash(user.password, data['password']):
login_user(user)
return jsonify({'message': '登录成功', 'user': {'id': user.id, 'username': user.username, 'role': user.role}})
return jsonify({'error': '用户名或密码错误'}), 401
@app.route('/api/auth/logout', methods=['POST'])
@login_required
def api_logout():
logout_user()
return jsonify({'message': '登出成功'}), 200
5.2.2 电影数据管理模块
电影数据管理模块负责电影信息的导入、查询和展示等功能。该模块支持从Excel文件批量导入电影数据和评论信息,使用pandas库解析Excel文件,将数据存储到SQLite数据库中。模块提供了模糊搜索功能,用户可以通过电影名称快速查找目标电影。搜索接口支持分页查询,避免一次性返回过多数据导致性能问题。电影列表页面展示了每部电影的基本信息,包括电影名称、评论数量、是否已完成情感分析等状态信息,方便用户快速了解数据情况。该模块还实现了数据关联查询,通过SQLAlchemy的关系映射实现电影与其评论数据的一对多关联管理。

该模块的核心代码实现如下:
from models import Movie, Comment
from flask import request, jsonify
from sqlalchemy import or_
@app.route('/api/movies/search', methods=['GET'])
@login_required
def search_movies():
query = request.args.get('q', '')
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 10, type=int)
movies_query = Movie.query
if query:
movies_query = movies_query.filter(Movie.title.contains(query))
movies = movies_query.paginate(page=page, per_page=per_page, error_out=False)
return jsonify({
'movies': [{
'id': m.id,
'title': m.title,
'year': m.year,
'rating': m.rating,
'comment_count': len(m.comments),
'has_analysis': m.analysis_result is not None
} for m in movies.items],
'total': movies.total,
'page': page,
'per_page': per_page
}), 200
@app.route('/api/movies/<int:movie_id>', methods=['GET'])
@login_required
def get_movie(movie_id):
movie = Movie.query.get_or_404(movie_id)
return jsonify({
'id': movie.id, 'title': movie.title, 'year': movie.year,
'director': movie.director, 'genre': movie.genre,
'rating': movie.rating, 'comment_count': len(movie.comments),
'has_analysis': movie.analysis_result is not None
}), 200
5.2.3 情感分析模块
情感分析模块是系统的核心功能模块,实现了从数据预处理到模型训练再到情感预测的完整流程。该模块整合了大连理工大学情感词典和改进TF-IDF+SVM算法,支持对电影评论进行细粒度8类情感分析。模块首先使用jieba分词工具对评论文本进行分词处理,然后通过情感词典获取每个词语的情感强度。接着使用改进的TF-IDF算法提取文本特征,融合情感权重信息。训练阶段采用One-vs-Rest策略的SVM分类器,支持多分类任务。预测阶段为每条评论分配情感标签和置信度,并统计各类情感的分布情况。分析结果包括各情感的计数、占比和关键词汇总,同时支持生成AI辅助总结(需配置DeepSeek API)。模块实现了增量分析功能,对于已分析的电影可以重新分析并覆盖旧结果。

该模块的核心代码实现如下:
from sentiment_model import MultiClassSentimentClassifier, EMOTION_LABELS
from sentiment_dict import get_sentiment_dict
from collections import Counter
def analyze_movie(movie_id):
movie = Movie.query.get_or_404(movie_id)
comments = Comment.query.filter_by(movie_id=movie_id).all()
if len(comments) < 5:
return jsonify({'error': '评论数量不足(至少5条)'}), 400
sentiment_dict = get_sentiment_dict()
# 第一阶段:情感词典预标注
labels = []
for c in comments:
analysis = sentiment_dict.analyze_text(c.content)
labels.append(analysis['main_emotion'])
# 第二阶段:训练改进TF-IDF+SVM模型
classifier = MultiClassSentimentClassifier(lambda_param=0.5)
metrics = classifier.train([c.content for c in comments], labels)
# 第三阶段:预测所有评论
emotion_counts = {e: 0 for e in EMOTION_LABELS}
for comment in comments:
result = classifier.predict_single(comment.content)
comment.emotion = result['emotion']
comment.emotion_name = result['emotion_name']
comment.emotion_confidence = result.get('confidence', 0.5)
emotion_counts[result['emotion']] += 1
total = len(comments)
emotion_ratios = {k: round(v / total * 100, 1) for k, v in emotion_counts.items()}
db.session.commit()
return jsonify({
'message': '分析完成',
'metrics': metrics,
'emotion_counts': emotion_counts,
'emotion_ratios': emotion_ratios
}), 200
5.2.4 数据可视化模块
数据可视化模块使用ECharts实现各类图表的渲染和交互展示,为用户提供直观的数据分析结果。该模块支持多种图表类型:饼图用于展示单一电影各情感类别的占比分布,通过不同颜色区分各情感类型;雷达图用于展示多维情感分布,各维度代表不同情感类别的占比;柱状图用于对比不同电影各情感类别的数量差异。模块实现了图表自适应功能,能够根据容器大小自动调整图表尺寸。该模块还支持图表交互,包括鼠标悬停提示(Tooltip)显示详细数值、点击图例切换系列显示、图表缩放和平移等操作。权重设置功能允许用户调整各情感维度的显示权重,实时更新雷达图展示效果。模块使用响应式设计,确保在桌面端和移动端都能正常展示。

该模块的核心代码实现如下:
// 渲染情感分布饼图
function renderEmotionPie(data) {
const chart = echarts.init(document.getElementById('pieChart'));
const option = {
tooltip: { trigger: 'item', formatter: '{b}: {c}% ({d}条)' },
legend: { orient: 'vertical', left: 'left' },
series: [{
type: 'pie', radius: ['40%', '70%'],
avoidLabelOverlap: false,
itemStyle: { borderRadius: 10, borderColor: '#fff', borderWidth: 2 },
label: { show: true, formatter: '{b}\n{d}%' },
data: Object.entries(data.emotion_ratios).map(([emotion, ratio]) => ({
name: EMOTION_CONFIG[emotion].name, value: ratio,
itemStyle: { color: EMOTION_CONFIG[emotion].color }
}))
}]
};
chart.setOption(option);
}
// 渲染多电影对比雷达图
function renderCompareRadar(movies) {
const chart = echarts.init(document.getElementById('radarChart'));
const option = {
tooltip: { trigger: 'item' },
legend: { bottom: 0 },
radar: {
indicator: EMOTION_ORDER.map(e => ({ name: EMOTION_CONFIG[e].name, max: 100 })),
shape: 'polygon', splitNumber: 5
},
series: [{
type: 'radar',
data: movies.map((m, i) => ({
name: m.title,
value: EMOTION_ORDER.map(e => m.emotion_ratios[e] || 0),
itemStyle: { color: MOVIE_COLORS[i] },
areaStyle: { opacity: 0.1 }
}))
}]
};
chart.setOption(option);
}
5.2.5 电影对比分析模块
电影对比分析模块支持用户选择2-8部电影同时进行情感分析对比,是系统的特色功能之一。该模块提供多种对比视图:雷达图对比视图将多部电影的情感分布叠加展示在同一雷达图中,便于直观比较各电影在不同情感维度上的差异;独立雷达图视图为每部电影单独渲染一个雷达图,适合详细分析单部电影的情感特征;数据表格视图以表格形式展示各电影各情感类别的数量和占比,支持切换原始数据和加权数据;关键词对比视图展示各电影各情感类别的代表性关键词,帮助理解情感差异的原因。该模块还支持权重设置功能,用户可以通过滑块调整8个情感维度的显示权重,权重范围0.0-3.0,支持选择预设模板(平衡模式、正面情感优先、负面情感优先等),点击应用后雷达图和表格会实时更新展示加权后的数据。模块使用AJAX异步请求获取数据,提供加载动画提升用户体验。



该模块的核心代码实现如下:
@app.route('/api/movies/compare', methods=['POST'])
def compare_movies():
data = request.get_json()
movie_ids = data.get('movie_ids', [])
if len(movie_ids) < 2:
return jsonify({'error': '请至少选择2部电影'}), 400
if len(movie_ids) > 8:
return jsonify({'error': '最多支持8部电影'}), 400
movies_data = []
for movie_id in movie_ids:
movie = Movie.query.get(movie_id)
analysis = movie.analysis_result
if not analysis:
continue
movie_data = {
'id': movie.id, 'title': movie.title,
'year': movie.year, 'genre': movie.genre,
'total_comments': analysis.total_comments,
'emotion_counts': {e: getattr(analysis, f'{e}_count', 0) for e in EMOTION_LABELS},
'emotion_ratios': {e: getattr(analysis, f'{e}_ratio', 0) for e in EMOTION_LABELS},
'emotion_keywords': {e: json.loads(getattr(analysis, f'{e}_keywords', '[]')) for e in EMOTION_LABELS}
}
movies_data.append(movie_data)
if len(movies_data) < 2:
return jsonify({'error': '有效电影数据不足'}), 400
return jsonify({
'movies': movies_data,
'emotion_labels': EMOTION_LABELS,
'emotion_names': EMOTION_NAMES,
'emotion_colors': EMOTION_COLORS
}), 200
5.4 数据库设计与实现
系统使用SQLite数据库进行数据存储,通过SQLAlchemy ORM框架实现数据建模。SQLite是轻量级的关系型数据库,无需独立服务器进程,适合中小型Web应用。主要数据表包括用户表(User)、电影表(Movie)、评论表(Comment)和分析结果表(AnalysisResult)。
class Comment(db.Model):
id = db.Column(db.Integer, primary_key=True)
movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'))
content = db.Column(db.Text, nullable=False)
rating = db.Column(db.Integer) # 1-5星用户评分
sentiment = db.Column(db.String(20)) # 二分类: positive/negative
emotion = db.Column(db.String(20)) # 8类情感标签
emotion_name = db.Column(db.String(20)) # 情感中文名
emotion_confidence = db.Column(db.Float) # 置信度 0-1
created_at = db.Column(db.DateTime, default=datetime.utcnow)
class AnalysisResult(db.Model):
id = db.Column(db.Integer, primary_key=True)
movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'), unique=True)
total_comments = db.Column(db.Integer, default=0)
# 8类情感计数
happy_count = db.Column(db.Integer, default=0)
like_count = db.Column(db.Integer, default=0)
surprise_count = db.Column(db.Integer, default=0)
anger_count = db.Column(db.Integer, default=0)
sad_count = db.Column(db.Integer, default=0)
fear_count = db.Column(db.Integer, default=0)
disgust_count = db.Column(db.Integer, default=0)
neutral_count = db.Column(db.Integer, default=0)
# 8类情感占比
happy_ratio = db.Column(db.Float, default=0.0)
like_ratio = db.Column(db.Float, default=0.0)
# ... (其他6个情感比例字段)
# 各情感关键词(JSON格式)
happy_keywords = db.Column(db.Text)
like_keywords = db.Column(db.Text)
# ... (其他6个情感关键词字段)
ai_summary = db.Column(db.Text) # AI生成的总结
created_at = db.Column(db.DateTime, default=datetime.utcnow)
5.5 前端页面实现
系统前端页面采用Bootstrap 5框架实现,使用Jinja2模板引擎进行服务端渲染。页面采用响应式设计,通过Bootstrap的栅格系统和媒体查询实现不同设备的适配。页面支持深色模式切换,采用现代化的卡片式布局设计。
表:5-7 页面路由表
|
页面名称 |
URL路由 |
功能描述 |
|
首页 |
/ |
系统介绍和登录入口 |
|
登录页 |
/login |
用户登录认证 |
|
注册页 |
/register |
新用户注册 |
|
仪表盘 |
/dashboard |
电影列表展示和管理 |
|
电影详情 |
/movie/<id> |
情感分析和可视化展示 |
|
情感对比 |
/compare |
多部电影对比分析 |
|
管理后台 |
/admin |
用户和数据管理(管理员) |
更多推荐



所有评论(0)