ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Python酒店评论情感分析源码:词典法高分课设实战

Python酒店评论情感分析源码:词典法高分课设实战 简介这是一套面向计算机相关专业学生与项目实战学习者的酒店评论情感分析完整方案适用于毕业设计、课程设计及期末大作业场景评审得分98分。资源包共23个文件以14个txt情感词典与停用词表、2个py核心脚本、2个rar语料压缩包为主另含docx设计文档、pptx答辩演示、md说明及jpg词云图整体约4.36MB结构清晰便于按模块查阅。已有304人学习下载。读者可获得基于Python的情感分析源码涵盖情感得分计算与运行入口脚本并配套哈工大、四川大学等多套中文停用词库及积极、消极、程度副词、否定词等细分情感词典同时提供约6000条正负样本评论语料便于直接复现实验、理解文本挖掘流程与词典匹配思路也可在此基础上调整算法完成二次开发与论文撰写。1. 从一份 98 分课设拆起这套 Python 酒店评论情感分析源码到底能跑出什么如果你正在搜「Python 酒店评论情感分析源码」大概率是两种情况一是期末大作业或毕设卡在选题上想找一个能跑通、有文档、答辩时讲得清楚的项目二是已经选了题但手里只有一堆爬下来的评论数据不知道怎么把「好评/差评」变成可量化的分数。这份资源就是冲着这两个场景来的——它是一套完整的基于 Python 的酒店评论情感分析项目包含可运行源码、情感词典、停用词表、数据集、PPT 和 Word 文档评审分 98 分属于导师认可通过的那类高分课设。它解决的核心问题很具体不依赖深度学习框架用「词典 规则」的方式对中文酒店评论做情感打分输出每条评论的正负倾向和情感分值。适合计算机相关专业做毕设、课程设计、期末大作业的学生也适合想练手文本挖掘但不想一上来就啃 BERT 的从业者。下面我按「资源结构 → 打分原理 → 跑通步骤 → 踩坑 → 进阶」的顺序拆一遍能抄的地方直接给代码。2. 资源结构与情感打分原理词典法为什么还值得学2.1 先看清压缩包里到底有什么拿到一个 zip第一步不是急着跑run.py而是先摸清目录。这份资源的文件构成大致分四类我按用途列一下类别代表文件作用代码emotion_score.py、run.py核心打分逻辑与入口词典posdict.txt、negdict.txt、ishdict.txt、insufficientdict.txt、mostdict.txt、verydict.txt、inversedict.txt、酒店情感词典.txt情感词、程度副词、否定词、反义词停用词stopwords/下哈工大、川大、中文停用词库等过滤无意义词数据与文档pos.rar、neg.rar、酒店评论情感分析.docx、.pptx、wordcloud.jpg正负样本、说明文档、词云这里有个容易被忽略的点词典被拆成了好几个文件不是随便拆的。posdict/negdict是基础情感极性词mostdict如「极其」「无比」和verydict如「非常」「很」是不同强度的程度副词ishdict如「有点」「稍微」是弱程度insufficientdict如「不太」「不够」是削弱词inversedict如「不」「没」是否定词。这套拆分直接决定了后面打分公式的权重设计所以别把它们合并成一个文件否则程度分级就没了。2.2 词典法打分的数学逻辑很多人以为情感分析就是「数正面词减负面词」真跑起来会发现「非常好」和「好」得分一样这显然不合理。这份源码用的是经典的中文情感词典加权算法核心公式可以简化成情感得分 Σ(情感词极性 × 程度权重 × 否定翻转)具体规则是先定位一个情感词往前看一个词是不是程度副词是就乘对应权重most 通常取 2very 取 1.5ish 取 0.5insufficient 取 0.5 并削弱再往前看有没有否定词有就把极性取反。这样「非常好」 1 × 1.5 1.5「不 好」 1 × (-1) -1「不是很好」 1 × 1.5 × (-1) -1.5。这套逻辑虽然不如深度学习泛化强但胜在可解释——答辩时老师问「为什么这条是负分」你能一条条指出来这是词典法在课设场景里最大的优势。2.3 为什么不用 LSTM 或 BERT这是选型时最该想清楚的问题。深度学习方案确实在公开数据集上 F1 更高但对课设来说有三个现实门槛一是需要标注数据酒店评论的标注成本不低二是训练环境要求 GPU很多同学本地跑不动三是调参玄学答辩时被问「为什么用这个学习率」容易翻车。词典法不需要训练、CPU 秒跑、逻辑透明正好匹配「高分课设」这个定位。如果你的目标是发论文或做产品那另说如果目标是两周内交出一个讲得清的项目词典法是更稳的选择。3. 把源码跑起来环境、入口与打分函数逐行拆3.1 环境准备与依赖确认这份项目是纯 Python 实现没有重依赖常见做法是建一个虚拟环境再装包。我一般会这么做# 创建虚拟环境避免污染全局 python -m venv venv # Windows 激活 venv\Scripts\activate # macOS / Linux 激活 source venv/bin/activate # 安装常用依赖具体以 README 为准 pip install jieba numpy pandas matplotlib wordcloud参数说明jieba是中文分词的核心词典法必须先分词才能匹配情感词wordcloud用于生成词云图pandas用来读评论数据。如果你的 Python 是 3.10 以上wordcloud有时装不上常见做法是降到 3.8/3.9或者用pip install wordcloud --only-binary:all:走预编译包。这一步别偷懒环境不对后面全是玄学报错。3.2 入口文件 run.py 的执行链路run.py是入口它做的事通常是读评论数据 → 分词 → 去停用词 → 调emotion_score.py打分 → 输出结果。跑之前先确认数据路径很多同学直接python run.py报FileNotFoundError就是因为数据文件路径写死在代码里了。常见做法是打开run.py找到读文件那几行改成相对路径# run.py 里读数据的部分按实际文件名调整 import pandas as pd # 用相对路径保证换机器也能跑 data pd.read_csv(./data/house_reviews.csv, encodingutf-8) # 如果报编码错误中文数据常见做法是换 gbk # data pd.read_csv(./data/house_reviews.csv, encodinggbk) print(data.head()) print(评论条数, len(data))逻辑说明先确认数据能读进来、条数对得上再往下走。参数上encoding是中文 CSV 最容易翻车的地方utf-8 读出来乱码就换 gbk反之亦然。这一步验证通过说明数据链路没问题可以进打分环节。3.3 情感打分函数的关键实现emotion_score.py是核心它的打分函数大致长这样按词典法通用写法还原import jieba def load_dict(path): 加载词典每行一个词 with open(path, r, encodingutf-8) as f: return set(line.strip() for line in f if line.strip()) # 加载各类词典 pos load_dict(posdict.txt) neg load_dict(negdict.txt) most load_dict(mostdict.txt) # 程度极其 very load_dict(verydict.txt) # 程度非常 ish load_dict(ishdict.txt) # 程度有点 insufficient load_dict(insufficientdict.txt) # 削弱不太 inverse load_dict(inversedict.txt) # 否定不、没 def score_sentence(sentence): words list(jieba.cut(sentence)) score 0 for i, w in enumerate(words): if w in pos or w in neg: polar 1 if w in pos else -1 weight 1.0 # 往前看一个词判断程度和否定 if i 0: prev words[i-1] if prev in most: weight 2.0 elif prev in very: weight 1.5 elif prev in ish or prev in insufficient: weight 0.5 if prev in inverse: polar -polar score polar * weight return score逻辑说明遍历分词结果命中情感词就取极性然后回看前一个词调整权重和方向。参数上most2.0、very1.5、ish/insufficient0.5是经验值你可以按语料微调——比如你的数据里「超级」出现很多就把它加进mostdict。注意这里只回看一个词处理不了「不是 特别 好」这种双修饰属于简化版够课设用但要知道边界在哪。3.4 停用词过滤与词云生成停用词表在stopwords/目录下哈工大、川大、中文停用词库都有用哪个都行常见做法是合并去重。词云是答辩加分项wordcloud.jpg就是成品你也可以自己重跑from wordcloud import WordCloud import matplotlib.pyplot as plt def load_stopwords(paths): stop set() for p in paths: with open(p, r, encodingutf-8) as f: stop | set(line.strip() for line in f if line.strip()) return stop stop load_stopwords([stopwords/哈工大停用词表.txt, stopwords/中文停用词库.txt]) text .join([w for w in jieba.cut(all_reviews) if w not in stop]) wc WordCloud(font_pathsimhei.ttf, background_colorwhite).generate(text) plt.imshow(wc) plt.axis(off) plt.savefig(my_wordcloud.png, dpi200)参数说明font_path必须指向中文字体否则词云全是方块这是血泪经验dpi200保证导出清晰答辩 PPT 里不糊。停用词合并后建议再手动加几个酒店场景的高频无意义词比如「酒店」「房间」否则词云里全是这些词看不出情感倾向。4. 避坑与排查词典法跑不通的五个真实原因4.1 现象所有评论得分都是 0原因分词后没有一个词命中情感词典通常是词典没加载成功或编码不对。解决先打印len(pos)看词典条数是否为 0为 0 就是路径或编码问题再打印一条评论的分词结果看情感词有没有被切碎比如「不错」被切成「不」「错」就会漏掉。4.2 现象正面评论被打成负分原因否定词和程度词的顺序判断错了或者inversedict里混进了非否定词。解决检查inversedict.txt内容确认只有「不」「没」「无」这类再拿「不是很好」单独测看得分是否为负逐步定位是权重还是翻转逻辑的问题。4.3 现象读 CSV 报 UnicodeDecodeError原因文件编码和encoding参数不匹配。解决utf-8 报错就换 gbkgbk 报错就换 utf-8-sig带 BOM 的 utf-8三个试一遍基本能中。别用errorsignore糊弄会静默丢数据。4.4 现象词云中文显示成方块原因WordCloud默认字体不支持中文。解决显式指定font_path指向系统里的中文字体Windows 一般在C:/Windows/Fonts/simhei.ttfmacOS 用/System/Library/Fonts/PingFang.ttc。4.5 现象换一批数据后准确率暴跌原因词典是通用情感词典没覆盖酒店领域词比如「隔音差」「床很软」这类。解决从你的语料里统计高频词人工挑出情感词补进posdict/negdict这是词典法提分最直接的手段也是答辩时能讲的「领域适配」工作。5. 进阶技巧把词典法结果做成可验证的评估报告跑通只是及格线想拿高分得让结果可验证。我一般会加一个简单的人工抽样评估从正负样本里各抽 50 条人工标一遍再和程序结果对比算准确率和召回率。代码不复杂# 假设 df 有 review 和 label 两列label 为 1 正 / 0 负 df[pred] df[review].apply(lambda x: 1 if score_sentence(x) 0 else 0) acc (df[pred] df[label]).mean() print(准确率, round(acc, 4)) # 看错分的例子定位词典盲区 errors df[df[pred] ! df[label]] print(errors[[review, label, pred]].head(10))参数说明score_sentence(x) 0是判定阈值你也可以设成 1减少中性误判。重点在errors那几行——错分样本就是词典的盲区把它们的情感词补进词典准确率通常能涨几个点。这套「跑分 → 看错例 → 补词典 → 再跑分」的循环比单纯调权重有效得多。还有个技巧是把情感得分按时间或房型分组做成趋势图。比如按月统计平均情感分能看出酒店口碑变化按房型分组能看出哪种房型差评集中。这类可视化在答辩时很讨喜因为它把「情感分析」从单条打分升级成了业务洞察。我踩过的坑是分组前一定要确认数据里有对应字段很多公开评论数据只有文本没有元信息硬凑分组只会得到一堆空值。从那以后我每次拿到这类词典法项目都强制先跑一遍人工抽样评估再动词典——不然你永远不知道分数是真实提升还是过拟合。希望帮到你。本文还有配套的精品资源点击获取
返回列表