资讯详情

资讯详情

Python酒店评论情感分析:基于情感词典的评分系统实现

简介一套面向高校Python课程期末大作业的酒店评论情感分析项目包含完整可运行的源码与配套文档适合需要完成情感分析实训、毕业设计或自学NLP入门的学习者。压缩包共23个文件涵盖Python脚本、情感词典与停用词表txt、项目说明与报告docx/md、演示文稿pptx及示例图片等整体大小仅4.36MB结构清晰便于按模块查阅。已有157人学习下载内容经助教审定且评审得分95分以上实用性强。资源不仅提供情感分析核心算法实现还附带了多部情感词典、停用词库、运行截图和README说明可帮助读者快速理解从文本预处理到情感判别的完整流程并直接用于课程展示或二次开发。1. 酒店评论情感分析用 Python 给用户情绪打分做期末大作业最尴尬的时刻是你把模型讲得天花乱坠老师一句「数据哪来的标注了吗」直接问穿。这份基于 Python 的酒店评论情感分析项目好就好在它不依赖标注数据、不依赖深度学习环境靠情感词典就能把评论拆成积极/消极得分把「酒店服务差」「房间隔音不好」这类口语化短句变成可量化的分数。源码本地编译过可运行评审分 95 分以上助教审定过适合正在选课程设计方向、又不想在环境配置上折腾太久的人。它能解决的核心问题很直接拿到一批中文酒店评论怎么用词典法算出情感倾向再可视化成结论写进报告。2. 词典法情感分析的原理为什么先选情感词典而不是机器学习2.1 情感词典的三个核心部件情感词、程度副词、否定词情感分析在 2025 年已经不是新鲜词从文本情感分析到多模态情感分析都有大量方案但期末大作业里用机器学习你得先解决标注数据的问题——6000 条评论人工标正负类标到半夜这还不算训练集和测试集划分的事。这份资源走了另一条路情感词典。思路是把评论拆成词拿每个词去查词典词典告诉你「这个情感词是正还是负权重是多少」。正向词命中1.0 分 负向词命中-1.0 分这么干看着简单真正麻烦的是修饰成分。比如「房间不算干净」「干净」是正向词但前面加了个「不算」整句就变成负向了。所以完整的情感词典至少要有三个表词典文件作用举例posdict.txt正向情感词表干净、舒适、贴心negdict.txt负向情感词表脏、吵、差劲verydict.txt程度副词词典非常、极其、太inversedict.txt否定词词典不、没、无、别程度副词影响权重倍数「非常好」的「非常」如果是 1.5 倍那这条评论的积极得分就是 1.5否定词则负责把情感方向反转「不干净」的「干净」是 1遇到「不」得分变成 -1。emotion_dict 目录里还有 mostdict、moredict、insufficientdict分别对应高程度、中程度、低程度副词配合 multi 算法权重能让得分粒度更细而不是一刀切。2.2 为什么是词典法而不是机器学习模型选型理由要能写进大作业报告这是老师最看重的地方。词典法对比机器学习的逻辑链条是第一中文酒店评论口语化严重「床板硬得跟石头似的」「早餐一言难尽」这种句子标注规则很难定第二深度学习需要 GPU 和框架环境教室电脑跑不动第三词典法可解释性强老师说「为什么这条评论是负向」你可以直接翻出 hit 到的词列表指出「隔音」这个词命中了负向词典。这份资源的 6000 条评论放在 neg.rar 和 pos.rar 里压缩包解压后是文本数据配合 stopwords 目录里的哈工大停用词表、四川大学机器智能实验室停用词库能直接完成分词前的清洗工作。注意停用词表不是越多越好哈工大停用词表偏通用四川大学的偏学术两个合起来用反而会把「服务员」这种酒店场景的高频词误杀后面避坑章会细说。2.3 情感得分计算的完整流程整个 pipeline 在代码里分为五步我把它拆开讲1. 读入评论数据 → 用 jieba 分词 2. 去停用词 → 过滤哈工大 四川大学停用词表 3. 遍历分词结果逐个查情感词典 4. 命中情感词后向前回溯两格找否定词和程度副词 5. 累加得分输出正向分/负向分/总分核心代码逻辑在 emotion_score.py 里关键函数长这样def get_weight(word, words_list, index): # words_list 是分词后的列表index 是当前情感词的位置 # 向前回溯最多两个词判断是否被否定词或程度副词修饰 weight 1.0 if index - 1 0 and words_list[index - 1] in negdict: weight * -1 # 否定词反转情感方向 if index - 1 0 and words_list[index - 1] in verydict: weight * 2.0 # 程度副词放大权重 return weight这段代码的逻辑说明情感词本身带正负分比如「干净」1「脏」-1但在整句话里的真实情感强度取决于它前面紧邻的词。否定词出现方向反转程度副词出现权重放大。只回溯两个位置是因为中文修饰结构通常不会隔太远「非常非常干净」也能覆盖到——两个「非常」都命中索引往前两格的范围。参数「2.0」就是程度副词的放大倍数你可以改成 1.5 或 3.0看测试集效果调。这个值不是公式推出来的是调出来的——你先跑一轮把分界线定在 0 分以上为正向、以下为负向然后拿 100 条人工标注的评论对比准确率再回来调倍数。这是典型的工程做法不是理论推导。3. 跑通酒店评论情感分析从分词到得分出报告3.1 环境准备与目录结构梳理拿到这份资源的 zip 包解压后先别急着双击 run.py把目录结构看清楚再说。资源里的顶层文件有 house.jpg、wordcloud.jpg、酒店评论情感分析.pptx、README.md代码层是 emotion_score.py、run.py 两个主文件数据层是 6000 neg.rar、pos.rar、stopwords 目录、emotion_dict 目录。建议运行前把压缩包解压确保 neg 和 pos 文件夹是裸露文本。Python 环境不需要 GPU建议 3.8 到 3.11 之间核心依赖只有 jieba 和 wordcloud。安装命令pip install jieba wordcloud matplotlibjieba 负责中文分词wordcloud 负责生成词云图matplotlib 画情感分布图。装完后把 emotion_dict 和 stopwords 放在 run.py 同目录下注意路径别用绝对路径——电脑用户名如果带中文jieba 加载自定义词典时可能会报编码错后面避坑章会细说。3.2 跑训练主流程run.py 里发生了什么run.py 是入口文件它做的事情是读取 pos.rar 解压出来的正向评论和 6000 neg.rar 解压出来的负向评论 → 逐条调 emotion_score.py 计算情感得分 → 按阈值判定正负 → 统计准确率 → 输出词云图wordcloud.jpg和 PPT 素材。评论原文酒店位置很好前台服务热情但房间隔音太差晚上睡不着。 分词结果酒店/位置/很好/前台/服务/热情/但/房间/隔音/太差/晚上/睡/不着逐词查词典「很好」的「好」是正向词 1程度副词提前回溯「很」命中 verydict权重放大 2 倍这词得 2「热情」正向 1「太差」的「差」是负向词向前回溯「太」命中程度副词权重 2 倍得 -2。整条评论加总分数接近 0落在判定边界附近。这种评论就是报告里的「模糊样本」值得单独拿出来分析。跑完的终端输出大概是正向评论 3000 条平均得分 2.31 负向评论 3000 条平均得分 -1.87 整体准确率 86.4%这个准确率是拿词典法打分的结果和 pos/neg 原始标注比出来的不是拿测试集训练出来的写报告时要说清楚。如果你跑的准确率低于 80%优先检查 stopwords 目录的停用词表有没有合并加载——两个表叠加后把「不」字误删了整個否定逻辑直接失效准确率掉到 50% 都有可能。3.3 可视化输出词云和 PPT 素材from wordcloud import WordCloud import matplotlib.pyplot as plt # 读取正向评论合并文本 text .join(open(pos/1.txt).readlines()) wc WordCloud(font_pathsimhei.ttf, width800, height600, background_colorwhite).generate(text) plt.imshow(wc) plt.axis(off) plt.savefig(wordcloud.jpg, dpi200)这段代码生成正向评论的词云图font_path 指定中文字体Windows 用 simhei.ttfMac 需要换否则词云全是方块。dpi 调到 200 是方便打印进纸质报告不糊。wordcloud.jpg 就是这个流程产出的你复现时会重新生成一份。4. 调整与优化搞定方言、口语与否定结构4.1 情感词典扩展把网络新词加进去酒店评论和新闻语料不一样用户会写「yyds」「踩雷」「绝绝子」这种词基础情感词典根本覆盖不到。资源自带的酒店情感词典.txt 已经收了一批酒店场景词但如果你想提升准确率我一般会手动扩充在 posdict.txt 末尾追加 贴心 1 卫生 1 智能化 1 在 negdict.txt 末尾追加 踩雷 -1 吵闹 -1 不值 -1追加完用 emotion_score.py 重新跑一遍。注意格式是「词 空格 分值」分值取整数——不要写 0.5 这种小数词典加载时按 split() 分割小数点会解析出错这是个容易翻车的细节。4.2 否定词后移处理从「不」到「无」的边界很多词典法实现只处理「不」「没」「别」这三个否定词但酒店评论里高频出现「无线网络」「无早餐」「无停车场」——「无」后面跟的是名词不是情感词。如果「无」被当成否定词处理把「干净」这种正向词反转成负向就出现了「房间无干净」这种语义完全不对劲的情况。现象某条评论写「早餐无惊喜」被判定为负向但用户其实只是描述事实情绪是中性。 原因「无」被 inversedict.txt 收录回溯逻辑看到「无」就反转没判断后续词性。 解决给否定词加一个白名单限制只有后面紧跟情感词时才生效def neg_reverse(words_list, index): if index - 1 0 and words_list[index - 1] in negdict: # 加一个词性判断下一个词必须也是情感词 if index - 2 0 and words_list[index - 2] in posdict negdict: return -1 return 1这个改动是把「否定词 情感词」才当成否定结构「否定词 名词」则忽略。改完跑一遍整体准确率能提升 2 到 4 个百分点——前提是你把哈希表和列表查询改成 set 查询要不然大语料下这层判断会拖慢速度。4.3 制作演示 PPT把得分映射到报告里资源自带酒店评论情感分析.pptx里面应该放了流程图、词典表、准确率截图。你改代码后需要同步更新 PPT 里的数据建议把准确率、参数调整记录比如 verydict 权重从 2.0 改成 3.0 后的对比做成一张表放进去老师问「你怎么验证的」你把调整前后两张表拍出来就行。5. 避坑与常见问题排查从编码到词典冲突5.1 编码问题GBK 和 UTF-8 的对抗现象run.py 一跑就报 SyntaxError 或者 UnicodeDecodeError位置在 jieba.load_userdict 附近。 原因Windows 下部分 txt 文件是 GBK 编码保存的而 Python 默认按 UTF-8 读取或者反过来词典文件是 UTF-8但代码里 open() 没指定 encoding 参数。 解决统一编码格式。全部改成 UTF-8 with BOM或者全部改成 GBK然后代码里显式声明with open(posdict.txt, encodingutf-8) as f: pos_words f.readlines()经验是文本数据统一 utf-8 最省事但如果原始文件是从 Windows 记事本另存出来的记得改成 utf-8-sig带 BOM 的那个否则首行第一个词会多出不可见字符词典命中率直接少一个词。5.2 停用词表冲突哈工大表和四川大学表合并的副作用现象准确率不升反降尤其「服务」「前台」这类词被过滤掉正向评论得分普遍偏低。 原因停用词表合并后把「服务员」之类的词性成分误当停用词删掉了。哈工大停用词表偏口语场景四川大学机器智能实验室停用词库偏学术场景两者合并后交集之外的那部分「噪音词」会影响分词效果。 解决合并前先看差异行而不是直接拼接。我一般会把两个停用词表读进来跑一个对比脚本def diff_stopwords(hit_stop, scu_stop): # 找出两个表的差异人工过一遍 set_hit set(hit_stop.readlines()) set_scu set(scu_stop.readlines()) return set_hit ^ set_scu那段「stopwords/htu_stopword.txt」「stopword.txt」里的内容值得逐行扫一眼。如果发现「不」「没」这类否定词在停用词表里马上去掉——这会让情感分析的否定模块完全失效。5.3 分词粒度问题jieba 词典里没有「隔音差」现象Python 跑出来 hot words 是「隔音」和「差」但词频统计里出现「隔音差」这种整词。 原因jieba 默认分词粒度偏细两个词合成一个词后情感词典查不到「隔音差」这个整词。 解决往 jieba 自定义词典里添加词条import jieba jieba.add_word(隔音差, freq10, taga)「freq10」是词频加权如果你发现加了自定义词后分词结果反而乱了把这参数调小一点让它别那么强势地合并。这个改动放在 run.py 初始化部分jieba.load_userdict 后面。5.4 负面评论偏向问题负向词表权重过高现象6000 条评论里负向评论判定准确率 92%但正向评论只有 74%。 原因negdict.txt 里收录了大量程度副词「非常差」「极其烂」导致负向评论整体得分绝对值偏大正向评论如果写得很委婉「还算行」得分容易被吞掉。 解决在 emotion_score.py 尾部判定正负向的阈值不是 0而是 -0.5——相当于给负向判定加了个门槛if total -0.5: result pos else: result neg这个阈值也是调出来的跑 100 条测试评论看误判集中在哪一侧往反方向挪就行。别追求 50/50 的对称中文表达就是「负向情绪更尖锐正向情绪更含蓄」阈值该偏就得偏。5.5 数据格式陷阱pos.rar 解压后文件命名现象jieba 加载自定义词典时报错提示「line 12: 词性标注错误」。 原因pos.rar 解压后的文件里部分 txt 首行有 BOM 标记或者行尾有 \r\n 残留导致词典读取时把 \r 当成词的一部分。 解决预处理一次数据def clean_txt(path): with open(path, r, encodingutf-8-sig) as f: lines f.readlines() lines [line.strip() for line in lines] return lines6. 验证与进阶拿「得分分布直方图」替换「单条评论展示」做课程设计最容易被追问的点是「你怎么证明你的分析是可靠的」除了准确率对比我建议你把 run.py 的产出加一张图情感得分分布直方图然后截图放进报告。具体做法是在 emotion_score.py 里把每条评论的最终得分追加到列表里scores.append(total_score)跑完整个语料后用 matplotlib 画个直方图横轴是得分区间-5 到 5纵轴是评论数量把正向和负向分成两个颜色叠在同一个图上。正向评论应该集中在 1 到 3 区间负向评论集中在 -1 到 -3 区间。如果你跑出来的直方图俩区间大面积重叠说明情感词典覆盖不够得回第 4 章扩词。这个方法比词云图更有说服力。词云只能看到高频词分布直方图能说明你的词典法做到了「正态区分」——这不是玄学是数据分布的真实呈现。也是从那以后我每次做情感分析项目都会强制走一遍这个验证流程先看整体准确率再看分数分布最后才挑个案分析。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →