一、项目背景与研究目标在线旅游平台积累了大量酒店评论评论反映客户对房间、位置、卫生和服务的真实感受。利用文本分类对评论进行情感初筛可以帮助酒店和平台优先处理潜在投诉。本案例重点完成数据质量检查、中文文本探索、基础模型比较、阈值分析和误判样本解释。为保证普通电脑可复现不使用深度学习、预训练语言模型或复杂参数搜索。文本表示采用字符级TF-IDF能够直接捕捉“服务很好”“态度恶劣”“不太方便”等中文固定搭配同时避免中文分词带来的额外依赖。代码数据和报告https://mbd.pub/o/bread/YZaUlJxpZw二、数据来源与质量检查数据集名称为 ChnSentiCorp_htl_allKaggle 上有同名酒店评论数据页面公开语料整理自携程酒店评论。交付CSV为规范化版本仅删除一条评论文本缺失记录未人工改写评论内容。项目结果有效记录数7,765条正向评论5,322条68.5%负向评论2,443条31.5%缺失评论原始数据1条已删除重复评论0条平均评论长度128.5字长度中位数84字字段含义评论编号规范化后生成的唯一编号情感标签1表示正向0表示负向情感类别中文类别名称评论内容酒店评论原文评论长度评论字符数量三、探索性数据分析与文本特征3.1 情感类别数量与占比label_counts df[情感类别].value_counts().reindex([正向,负向]) plt.figure(figsize(7.4,4.8)) bars plt.bar(label_counts.index, label_counts.values, color[BLUE, ORANGE], width0.58) plt.title(携程酒店评论情感类别分布, fontsize15, weightbold) plt.xlabel(情感类别); plt.ylabel(评论数量) for b, v in zip(bars, label_counts.values): plt.text(b.get_x()b.get_width()/2, v70, f{v:,}\n({v/len(df):.1%}), hacenter, fontsize11) plt.ylim(0, label_counts.max()*1.18) save_show(01_情感类别分布.png)数据中正向评论为5,322条占68.5%负向评论为2,443条占31.5%。正向样本约为负向样本的2.18倍存在一定类别不均衡。建模时采用分层抽样并为线性模型设置类别权重避免模型过度偏向多数类。3.2 评论长度总体分布评论长度呈明显右偏分布平均长度为128.5字中位数为84字最长评论达到2,924字。多数评论较短少量超长评论拉高均值因此图中截取99%分位以内展示主体分布。3.3 正负向评论长度对比3.4 不同长度区间的正向率3.5 正负向评论标点使用特征正负向评论在问号、感叹号等标点使用上存在差异负向评论更容易通过强烈标点表达质疑或不满。但标点只能反映表达强度不能替代正文语义。3.6 正向代表性短语四、模型构建与评价4.1 数据划分与特征表示数据按80%训练集和20%测试集进行分层划分训练集6,212条测试集1,553条。TF-IDF采用字符2-4元短语最多保留30,000个特征训练特征矩阵为6,212×30,000。模型仅比较朴素贝叶斯、逻辑回归和线性支持向量机没有进行网格搜索或复杂交叉验证。模型准确率精确率召回率F1值ROC-AUCPR-AUC线性支持向量机0.9010.9270.9300.9280.9550.979逻辑回归0.9000.9390.9140.9260.9570.980朴素贝叶斯0.8800.8980.9310.9140.9390.9714.2 三种基础模型核心指标对比meltmetrics.melt(id_vars模型,value_vars[准确率,精确率,召回率,F1值],var_name指标,value_name得分) model_ordermetrics[模型].tolist(); metric_order[准确率,精确率,召回率,F1值] xnp.arange(len(model_order)); w.19 plt.figure(figsize(9.0,5.2)) colors[BLUE,ORANGE,GREEN,GOLD] for i,metric in enumerate(metric_order): vals[float(metrics.loc[metrics[模型]m,metric].iloc[0]) for m in model_order] plt.bar(x(i-1.5)*w,vals,w,labelmetric,colorcolors[i]) plt.xticks(x,model_order); plt.ylim(.75,1.0); plt.ylabel(指标得分) plt.title(三种文本分类模型核心指标对比,fontsize15,weightbold); plt.legend(ncol4,loclower center) save_show(10_模型指标对比.png)三个基础模型均取得较好效果综合F1值最高的是线性支持向量机测试集准确率为90.15%F1值为0.928。朴素贝叶斯适合作为快速基线线性模型更适合高维稀疏文本。4.3 最优模型混淆矩阵4.4 三种模型ROC曲线plt.figure(figsize(7.2,5.5)) for name,score in scores.items(): fpr,tpr,_roc_curve(y_test,score); aucroc_auc_score(y_test,score) plt.plot(fpr,tpr,linewidth2,labelf{name}AUC{auc:.3f}) plt.plot([0,1],[0,1],--,colorGRAY,label随机基线) plt.xlabel(假正率); plt.ylabel(真正率); plt.title(三种模型ROC曲线,fontsize15,weightbold); plt.legend() save_show(12_ROC曲线.png)线性支持向量机的ROC-AUC为0.955说明模型具有较好的正负样本排序能力。三条曲线均明显高于随机基线文本中存在稳定的情感信号。4.5 三种模型PR曲线4.6 最优模型分类阈值分析4.7 不同评论长度区间的分类准确率五、误判样本分析真实类别预测类别长度评论节选负向正向112春节是住的位置不错交通方便周围环境也不错购物很方便。房间大卫生间超大个人感觉完全是浪费空间房间老旧。前台服务一般。早餐只有韭菜猪肉馅的饺子跟米汤。是我吃过的最糟糕的酒店早餐。电梯很恐怖。不过一楼的…负向正向85房间太旧卫生间是很多锈迹房间比较大大床不错我喜欢。价格还可以就是太旧了不舒服服务员水平差不多二十年前老国营的水平。下次会换一家住。不过据说小姐不错俺没试。负向正向93房间还可以,设施简单,不像是四星标准。早餐还算丰富,不过要早去。前台接待、结算速度和态度还不错。后院停车场很有特点一晚上有两台车被划伤真恐怖最关键的是保安及小头目还不想认帐气愤啊正向负向48从门面看硬件好像还能唬人仔细看房间的装修真不怎么样服务比招待所强不了多少。下次不会再住了。正向负向122一年不如一年说的好听还给了什么豪华标准间说是刚装修的绝对不会再有虫子结果房间感觉上还不如以前住的。装修的很没有品位马桶盖还是破的卫生间还是以前的恶心。晚上既然又出现了莫名的大虫子很失望。总之这个以…正向负向153首先我说说洗手间的问题,之前看了网友说这里的卫生间很小不太留意,可是去到才真的发现卫生间真的太小了,我们住的是标双,卫生间大概只有2-3平方的样子,而厨房其实是没有用的,真的不知道建筑师是怎么设计的.花洒就在马…六、结论与应用建议数据共7,765条有效评论正向评论占68.5%存在中等程度类别不均衡。评论长度和标点与情感有关但不能单独决定评论类别。字符级2-4元TF-IDF无需中文分词可识别固定搭配、程度词和否定结构。线性支持向量机综合效果最佳准确率90.15%、F1值0.928、ROC-AUC0.955。实际应用应根据投诉漏判成本调整分类阈值并安排人工复核边界样本。七、局限性数据未包含评论时间、酒店等级、城市和评分等结构化字段无法分析区域和酒店类型差异。标签是整体二分类一条评论可能同时包含多个方面的正负观点。字符级线性模型对反讽、隐含语义和长距离转折的理解有限。具体细节见原文创造不易谢谢各位多多点赞收藏
携程酒店中文评论情感分类基于字符级TF-IDF与基础机器学习模型
发布时间:2026/7/18 3:32:59
一、项目背景与研究目标在线旅游平台积累了大量酒店评论评论反映客户对房间、位置、卫生和服务的真实感受。利用文本分类对评论进行情感初筛可以帮助酒店和平台优先处理潜在投诉。本案例重点完成数据质量检查、中文文本探索、基础模型比较、阈值分析和误判样本解释。为保证普通电脑可复现不使用深度学习、预训练语言模型或复杂参数搜索。文本表示采用字符级TF-IDF能够直接捕捉“服务很好”“态度恶劣”“不太方便”等中文固定搭配同时避免中文分词带来的额外依赖。代码数据和报告https://mbd.pub/o/bread/YZaUlJxpZw二、数据来源与质量检查数据集名称为 ChnSentiCorp_htl_allKaggle 上有同名酒店评论数据页面公开语料整理自携程酒店评论。交付CSV为规范化版本仅删除一条评论文本缺失记录未人工改写评论内容。项目结果有效记录数7,765条正向评论5,322条68.5%负向评论2,443条31.5%缺失评论原始数据1条已删除重复评论0条平均评论长度128.5字长度中位数84字字段含义评论编号规范化后生成的唯一编号情感标签1表示正向0表示负向情感类别中文类别名称评论内容酒店评论原文评论长度评论字符数量三、探索性数据分析与文本特征3.1 情感类别数量与占比label_counts df[情感类别].value_counts().reindex([正向,负向]) plt.figure(figsize(7.4,4.8)) bars plt.bar(label_counts.index, label_counts.values, color[BLUE, ORANGE], width0.58) plt.title(携程酒店评论情感类别分布, fontsize15, weightbold) plt.xlabel(情感类别); plt.ylabel(评论数量) for b, v in zip(bars, label_counts.values): plt.text(b.get_x()b.get_width()/2, v70, f{v:,}\n({v/len(df):.1%}), hacenter, fontsize11) plt.ylim(0, label_counts.max()*1.18) save_show(01_情感类别分布.png)数据中正向评论为5,322条占68.5%负向评论为2,443条占31.5%。正向样本约为负向样本的2.18倍存在一定类别不均衡。建模时采用分层抽样并为线性模型设置类别权重避免模型过度偏向多数类。3.2 评论长度总体分布评论长度呈明显右偏分布平均长度为128.5字中位数为84字最长评论达到2,924字。多数评论较短少量超长评论拉高均值因此图中截取99%分位以内展示主体分布。3.3 正负向评论长度对比3.4 不同长度区间的正向率3.5 正负向评论标点使用特征正负向评论在问号、感叹号等标点使用上存在差异负向评论更容易通过强烈标点表达质疑或不满。但标点只能反映表达强度不能替代正文语义。3.6 正向代表性短语四、模型构建与评价4.1 数据划分与特征表示数据按80%训练集和20%测试集进行分层划分训练集6,212条测试集1,553条。TF-IDF采用字符2-4元短语最多保留30,000个特征训练特征矩阵为6,212×30,000。模型仅比较朴素贝叶斯、逻辑回归和线性支持向量机没有进行网格搜索或复杂交叉验证。模型准确率精确率召回率F1值ROC-AUCPR-AUC线性支持向量机0.9010.9270.9300.9280.9550.979逻辑回归0.9000.9390.9140.9260.9570.980朴素贝叶斯0.8800.8980.9310.9140.9390.9714.2 三种基础模型核心指标对比meltmetrics.melt(id_vars模型,value_vars[准确率,精确率,召回率,F1值],var_name指标,value_name得分) model_ordermetrics[模型].tolist(); metric_order[准确率,精确率,召回率,F1值] xnp.arange(len(model_order)); w.19 plt.figure(figsize(9.0,5.2)) colors[BLUE,ORANGE,GREEN,GOLD] for i,metric in enumerate(metric_order): vals[float(metrics.loc[metrics[模型]m,metric].iloc[0]) for m in model_order] plt.bar(x(i-1.5)*w,vals,w,labelmetric,colorcolors[i]) plt.xticks(x,model_order); plt.ylim(.75,1.0); plt.ylabel(指标得分) plt.title(三种文本分类模型核心指标对比,fontsize15,weightbold); plt.legend(ncol4,loclower center) save_show(10_模型指标对比.png)三个基础模型均取得较好效果综合F1值最高的是线性支持向量机测试集准确率为90.15%F1值为0.928。朴素贝叶斯适合作为快速基线线性模型更适合高维稀疏文本。4.3 最优模型混淆矩阵4.4 三种模型ROC曲线plt.figure(figsize(7.2,5.5)) for name,score in scores.items(): fpr,tpr,_roc_curve(y_test,score); aucroc_auc_score(y_test,score) plt.plot(fpr,tpr,linewidth2,labelf{name}AUC{auc:.3f}) plt.plot([0,1],[0,1],--,colorGRAY,label随机基线) plt.xlabel(假正率); plt.ylabel(真正率); plt.title(三种模型ROC曲线,fontsize15,weightbold); plt.legend() save_show(12_ROC曲线.png)线性支持向量机的ROC-AUC为0.955说明模型具有较好的正负样本排序能力。三条曲线均明显高于随机基线文本中存在稳定的情感信号。4.5 三种模型PR曲线4.6 最优模型分类阈值分析4.7 不同评论长度区间的分类准确率五、误判样本分析真实类别预测类别长度评论节选负向正向112春节是住的位置不错交通方便周围环境也不错购物很方便。房间大卫生间超大个人感觉完全是浪费空间房间老旧。前台服务一般。早餐只有韭菜猪肉馅的饺子跟米汤。是我吃过的最糟糕的酒店早餐。电梯很恐怖。不过一楼的…负向正向85房间太旧卫生间是很多锈迹房间比较大大床不错我喜欢。价格还可以就是太旧了不舒服服务员水平差不多二十年前老国营的水平。下次会换一家住。不过据说小姐不错俺没试。负向正向93房间还可以,设施简单,不像是四星标准。早餐还算丰富,不过要早去。前台接待、结算速度和态度还不错。后院停车场很有特点一晚上有两台车被划伤真恐怖最关键的是保安及小头目还不想认帐气愤啊正向负向48从门面看硬件好像还能唬人仔细看房间的装修真不怎么样服务比招待所强不了多少。下次不会再住了。正向负向122一年不如一年说的好听还给了什么豪华标准间说是刚装修的绝对不会再有虫子结果房间感觉上还不如以前住的。装修的很没有品位马桶盖还是破的卫生间还是以前的恶心。晚上既然又出现了莫名的大虫子很失望。总之这个以…正向负向153首先我说说洗手间的问题,之前看了网友说这里的卫生间很小不太留意,可是去到才真的发现卫生间真的太小了,我们住的是标双,卫生间大概只有2-3平方的样子,而厨房其实是没有用的,真的不知道建筑师是怎么设计的.花洒就在马…六、结论与应用建议数据共7,765条有效评论正向评论占68.5%存在中等程度类别不均衡。评论长度和标点与情感有关但不能单独决定评论类别。字符级2-4元TF-IDF无需中文分词可识别固定搭配、程度词和否定结构。线性支持向量机综合效果最佳准确率90.15%、F1值0.928、ROC-AUC0.955。实际应用应根据投诉漏判成本调整分类阈值并安排人工复核边界样本。七、局限性数据未包含评论时间、酒店等级、城市和评分等结构化字段无法分析区域和酒店类型差异。标签是整体二分类一条评论可能同时包含多个方面的正负观点。字符级线性模型对反讽、隐含语义和长距离转折的理解有限。具体细节见原文创造不易谢谢各位多多点赞收藏