
简介这是一套面向高校计算机相关专业学生的Python课程设计资料主题为酒店评论情感分析适合用作期末大作业、课程设计或毕业设计参考。资源包共28个文件约4.42MB包含2个py源码文件、1个docx技术文档、1个pptx结题演示文稿以及大量txt情感词典与停用词表、rar语料压缩包、jpg词云图等辅助材料代码结构清晰且关键算法配有中文注释。系统集成了数据预处理、特征提取、模型训练与情感分类等完整流程并配有交互界面下载后经简易配置即可运行。目前已有32人学习下载。读者可从中获得完整可运行的源码、情感词典与停用词库、结题报告与演示文稿模板以及词云可视化结果便于快速理解文本情感分析的实现原理并迁移到同类课题。1. 从一份酒店评论情感分析源码包说起它到底能跑出什么结果如果你手头正压着一个 Python 期末大作业或者课程设计题目是「酒店评论情感分析」那这份资源大概率能直接救急。它不是一个空壳 demo而是一个带完整词典、停用词表、评分脚本和结题文档的压缩包解压后能看到emotion_score.py、run.py两个核心代码文件以及posdict.txt、negdict.txt、inversedict.txt、mostdict.txt、insufficientdict.txt等一整套情感词典还有哈工大、四川大学机器智能实验室等多份中文停用词表。它的定位很明确用基于词典的规则打分方式对酒店评论文本做情感倾向判断输出正面、负面或中性结果并配套词云图和 PPT 结题材料。这套东西适合谁一是被课程设计卡住、需要一份结构清晰可复现参考的本科生二是想快速理解中文情感分析「不训练模型也能做」这条技术路线的初学者。它不涉及深度学习框架不需要 GPU一台装了 Python 的普通笔记本就能跑。但正因为是词典法它的效果高度依赖词典覆盖度和否定词、程度副词的处理逻辑这也是后面要重点拆的部分。先把它是什么、能解决什么说清楚再动手。2. 词典法情感分析的原理与代码结构拆解2.1 为什么这份资源选词典法而不是机器学习中文情感分析主流有两条路一条是机器学习/深度学习用标注语料训练分类模型另一条是基于情感词典的规则打分。这份资源走的是后者原因很实际——课程设计周期短标注语料难获取而词典法不需要训练逻辑透明每一分的来源都能追溯。对于「酒店评论」这种领域相对固定、情感词比较集中的场景词典法的准确率在调好规则后并不难看。它的核心思路是把一条评论分词后逐个词去情感词典里查权重遇到否定词翻转极性遇到程度副词放大或缩小权重最后累加得到一个情感总分再按阈值判定正负。这套逻辑全写在emotion_score.py里配合run.py做流程调度。理解了这个打分链路你才能知道为什么同一句话换个说法结果就变了也才知道该往哪个词典里补词。2.2 资源目录里每个文件的实际作用解压后文件不少容易看花眼。我按功能把它们归成四类你对照着看就清楚了。类别文件作用核心代码emotion_score.py情感打分主逻辑含分词、查词典、否定与程度处理核心代码run.py程序入口读取评论、调用打分、输出结果情感词典posdict.txt/negdict.txt正面词、负面词基础权重表情感词典mostdict.txt/insufficientdict.txt程度副词很、非常 / 稍、有点权重情感词典inversedict.txt否定词表用于翻转极性停用词表htu_stopword.txt等哈工大、川大等多份停用词过滤无意义词文档材料酒店评论情感分析.docx/.pptx结题报告与答辩演示数据pos.rar/neg.rar正负样本评论数据其他wordcloud.jpg/house.jpg词云图与配图提示.zbak后缀是备份文件正常运行时用不到别误删原始 txt 就行。2.3 打分链路的关键代码与参数含义真正决定结果的是打分函数。下面这段是emotion_score.py里最核心的逻辑骨架我按常见实现还原出来你对照自己包里的代码看结构是否一致。# 情感打分核心逐词查词典处理否定与程度副词 def score_sentence(words, pos_dict, neg_dict, most_dict, insufficient_dict, inverse_dict): total 0 # 情感总分 i 0 while i len(words): word words[i] # 1. 命中正面词或负面词取基础权重 if word in pos_dict or word in neg_dict: score pos_dict.get(word, 0) neg_dict.get(word, 0) # 2. 向前看一个词判断是否被程度副词修饰 if i - 1 0 and words[i - 1] in most_dict: score * most_dict[words[i - 1]] # 放大如 2.0 elif i - 1 0 and words[i - 1] in insufficient_dict: score * insufficient_dict[words[i - 1]] # 缩小如 0.5 # 3. 再向前看判断是否被否定词翻转 if i - 2 0 and words[i - 2] in inverse_dict: score -score elif i - 1 0 and words[i - 1] in inverse_dict: score -score total score i 1 return total逻辑说明函数从左到右扫描分词结果只有命中情感词才计分。程度副词和否定词都通过「向前看」实现most_dict里通常存很:2.0、非常:2.5这类放大系数insufficient_dict存稍:0.5、有点:0.6这类缩小系数inverse_dict命中则把当前得分取反。参数上四个词典的键都是词、值是权重你可以直接改 txt 文件调整灵敏度。参数怎么改如果发现「不推荐」被判成正面多半是inversedict.txt里没收录「不」或否定词距离判断没覆盖到如果「非常好」和「好」得分一样检查mostdict.txt是否漏了「非常」。这些词典都是纯文本一行一个词或词:权重改完不用动代码。3. 从零跑通这套系统环境、分词与执行步骤3.1 环境准备与依赖安装这套代码依赖很轻主要是分词库和基础科学计算库。常见做法是用jieba做中文分词numpy或纯 Python 做累加词云部分用wordcloud。先确认 Python 版本建议 3.8 及以上然后装依赖。# 建议先建虚拟环境避免污染全局 python -m venv venv # Windows 激活 venv\Scripts\activate # macOS / Linux 激活 source venv/bin/activate # 安装核心依赖 pip install jieba numpy wordcloud matplotlib逻辑说明jieba负责把整句评论切成词序列是打分的前置步骤numpy用于批量评论的分数统计wordcloud和matplotlib用于生成词云图。如果你只跑情感打分不画图后两个可以不装。参数上没有特殊配置jieba默认精确模式即可酒店评论里如果有「性价比」「隔音」这类领域词可以后续加自定义词典。3.2 加载词典与停用词的正确顺序很多人跑出来结果全是 0问题就出在加载环节。正确顺序是先读停用词表再读情感词典最后读评论数据。停用词要在分词后立刻过滤否则「的」「了」会干扰否定词的距离判断。import jieba def load_words(path): 读取一行一词的词典文件返回 set 或 dict with open(path, r, encodingutf-8) as f: return set(line.strip() for line in f if line.strip()) def load_score_dict(path): 读取 词:权重 格式的程度/否定词典 d {} with open(path, r, encodingutf-8) as f: for line in f: line line.strip() if not line: continue if : in line: k, v line.split(:) d[k] float(v) else: d[line] 1.0 # 无权重默认 1.0 return d stopwords load_words(stopwords/哈工大停用词表.txt) pos_dict load_score_dict(posdict.txt) neg_dict load_score_dict(negdict.txt) most_dict load_score_dict(mostdict.txt) insufficient_dict load_score_dict(insufficientdict.txt) inverse_dict load_words(inversedict.txt)逻辑说明load_words返回集合适合停用词和否定词这种只判断存在性的场景load_score_dict返回字典适合带权重的程度副词和情感词。参数上编码统一用utf-8如果遇到gbk编码的旧词典会报UnicodeDecodeError改成对应编码即可。停用词表有多份选一份即可重复加载反而拖慢速度。3.3 单条与批量评论的打分执行加载完词典就能跑打分了。先拿单条评论验证逻辑再批量处理pos.rar、neg.rar里的样本。def analyze(text): words [w for w in jieba.lcut(text) if w not in stopwords] score score_sentence(words, pos_dict, neg_dict, most_dict, insufficient_dict, inverse_dict) if score 0: label 正面 elif score 0: label 负面 else: label 中性 return score, label # 单条测试 print(analyze(房间很干净服务态度非常好强烈推荐)) print(analyze(隔音太差了一晚没睡好不推荐)) # 批量读取评论文件逐行打分 results [] with open(reviews.txt, r, encodingutf-8) as f: for line in f: line line.strip() if line: results.append(analyze(line))逻辑说明analyze先分词再过滤停用词然后调用打分函数最后按分数正负零给标签。阈值这里用的是 0实际项目里可以调成1才算正面避免弱信号误判。批量部分逐行读取适合几千条量级如果数据在rar里先解压出 txt 再读。跑完可以统计正负比例和pos.rar、neg.rar的标注对比估算准确率。4. 避坑与排查词典法最容易翻车的五个地方4.1 结果全是中性或 0 分现象跑完一批评论标签几乎全是「中性」分数清一色 0。原因通常是词典没加载成功或者分词后词形和词典对不上。比如词典里是「干净」评论里是「干干净净」jieba切出来是叠词查不到。解决先打印len(pos_dict)确认词典非空再打印一条评论的分词结果肉眼比对是否命中。叠词、口语变体需要手动补进词典。4.2 否定词翻转失效现象「不推荐」被判成正面「不满意」得分还是正的。原因是否定词距离判断只向前看了一到两个词而实际句子里否定词和情感词之间隔了别的词比如「不是特别推荐」。解决把否定词判断的窗口放宽或者改用「否定词出现后后续 N 个词内的情感词都翻转」的策略。代价是可能误伤需要拿样本调窗口大小。4.3 程度副词权重不生效现象「非常好」和「好」得分一样。原因是mostdict.txt里没有「非常」或者代码里程度副词判断写在了情感词命中之后但索引算错了。解决检查mostdict.txt内容确认「很」「非常」「特别」都有权重再核对代码里words[i-1]的下标是否指向修饰词。这类下标错误在血泪经验里排前三。4.4 编码报错导致读取中断现象UnicodeDecodeError: utf-8 codec cant decode byte。原因是部分词典或评论文件是gbk编码尤其从 Windows 环境导出的 txt。解决读取时加errorsignore先跑通或者用chardet检测编码后指定。更稳妥的做法是统一转成utf-8再入库。4.5 停用词过滤顺序错误现象否定词被当停用词过滤掉导致翻转逻辑失效。原因是把「不」「没」这类词也放进了停用词表。解决停用词表里绝对不能包含否定词和程度副词过滤前先确认词表内容。哈工大停用词表本身不含否定词但如果你自己追加过要检查一遍。5. 进阶技巧用词云和阈值调优把结果做得更像样跑通基础流程后想让结题报告更好看有两个方向可以深挖。第一个是词云可视化把正面评论和负面评论分别聚合成词云直观展示「干净」「位置好」和「隔音差」「服务慢」的对比。wordcloud库对中文需要指定字体路径否则会显示成方框这是新手最常踩的坑。from wordcloud import WordCloud import matplotlib.pyplot as plt def draw_cloud(text, font_path, out): wc WordCloud(font_pathfont_path, width800, height400, background_colorwhite).generate(text) plt.imshow(wc) plt.axis(off) plt.savefig(out, dpi150) # font_path 指向系统中文字体如 simhei.ttf draw_cloud( .join(pos_words), simhei.ttf, pos_cloud.png)逻辑说明font_path必须指向支持中文的 ttf 文件Windows 一般在C:/Windows/Fonts/simhei.ttfmacOS 用PingFang.ttc。generate接收空格拼接的词串所以要先分词再拼。参数上width、height控制分辨率background_color建议白色方便贴进文档。第二个方向是阈值调优。默认 0 作为正负分界太粗糙弱正面和弱负面容易混。我一般会统计一批已知标注样本的得分分布找一个让准确率最高的分界点比如1.5才算正面、-1.5才算负面中间归中性。这个阈值没有标准答案取决于你的词典权重设置必须拿数据试。从那以后我每次拿到词典法项目都强制先跑一遍得分分布直方图再定阈值不然调参全靠猜。希望这套拆解能帮你把这份酒店评论情感分析源码真正跑起来而不是只躺在压缩包里。本文还有配套的精品资源点击获取