本文所使用数据来自于梯田景区评价数据。
一、数据预处理
数据清洗
去除重复值、空值及无关字符(如表情符号、特殊符号等)。
提取中文文本,过滤非中文字符。
统一文本格式(如全角转半角、繁体转简体)。
中文分词与去停用词
使用 jieba 分词工具进行分词。
加载自定义词典(如景点名“多依树”“老虎嘴”等专有名词)。
去除通用停用词(如“的”“了”)和自定义停用词(如“同程”“门票”)。
情感标签分类
统计情感分布(好评、中评、差评占比)。
若数据不均衡,采用过采样(SMOTE)或调整类别权重。
二、可视化分析
词云生成
全局词云:所有评论文本的词频统计。
分情感词云:分别生成好评、中评、差评的词云,对比关键词差异。
工具:WordCloud + matplotlib。
高频词条形图
按词频排序,展示Top 20高频词。
分情感统计高频词(如好评中的“壮观”“方便”,差评中的“堵车”“贵”)。
情感分布饼图
可视化好评、中评、差评的比例。
三、特征工程
文本向量化
TF-IDF:提取文本的TF-IDF特征,生成词-文档矩阵。
Word2Vec:训练词向量模型,获取语义特征。
BERT(可选):使用预训练模型提取深度语义特征。
情感标签编码
将“好评”“中评”“差评”映射为数值标签(如0,1,2)。
四、数据建模
分类模型(情感预测)
模型选择:逻辑回归、随机森林、SVM、LSTM(深度学习)。
输入:TF-IDF向量 + 情感标签。
输出:预测情感类别,评估准确率、F1值。
主题模型(LDA)
提取评论文本中的潜在主题,分析用户关注点(如“交通”“门票价格”“风景”)。
结合情感标签,统计不同主题的情感倾向。
情感强度分析
使用情感词典(如BosonNLP)计算每条评论的情感强度值。
分析不同情感类别的强度分布(如差评是否情绪更强烈)。
五、关键分析方向
好评驱动因素
高频词:方便、壮观、震撼、自驾、日出。
潜在主题:取票便捷、风景优美、天气影响。
差评改进点
高频词:堵车、贵、管理差、服务态度。
潜在主题:交通拥堵、门票性价比、配套设施不足。
中评矛盾点
高频词:一般、季节、不值。
潜在主题:景色依赖天气、性价比争议。
完整代码如下:
import pandas as pd
import re
import jieba
import jieba.analyse
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
# 在文件顶部导入matplotlib后添加字体配置
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei' # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
from wordcloud import WordCloud
from collections import Counter# 数据预处理函数
def preprocess_text(text):# 去非中文字符(保留中文标点)text = re.sub(r'[^\u4e00-\u9fa5,。!?;:、]', '', str(text))# 合并重复标点text = re.sub(r'([,。!?;:、])\1+', r'\1', text)return text.strip()# 加载自定义词典(需要用户提供路径)
jieba.load_userdict('custom_dict.txt') # 请替换为实际词典路径# 加载停用词(需要用户提供路径)
def load_stopwords(path):with open(path, 'r', encoding='utf-8') as f:return set([line.strip() for line in f])
stopwords = load_stopwords('stopwords.txt') # 请替换为实际停用词路径# 中文分词处理
def chinese_segment(text):# 确保输入为字符串if not isinstance(text, str):text = str(text)words = jieba.lcut(text)return [w for w in words if w not in stopwords and len(w) > 1]# 生成词云函数
# 修改生成词云函数中的字体路径
def generate_wordcloud(text, title):wordcloud = WordCloud(font_path='C:/Windows/Fonts/simhei.ttf', # 使用绝对路径确保找到字体background_color='white',width