
简介这份京东评论数据集面向从事自然语言处理、情感分析与文本挖掘的研究者和开发者提供真实电商场景下的消费者反馈语料可用于训练和评估情感极性识别模型也适合作为机器学习课程实验或毕业设计的练手数据。压缩包共16个文件约5.57MB以7个Python脚本为核心配套2个CSV数据文件、2张结果示意图以及README、JSON配置、TXT说明等辅助文件脚本覆盖单条与批量预测流程便于快速跑通分类实验。目前已有630人学习下载。数据集通常包含评论文本、星级评分、商品与用户标识、时间戳等字段读者可据此完成文本清洗、分词、词频与n-gram特征构建并尝试朴素贝叶斯、支持向量机或Transformer等模型观察情感随时间与商品类别的分布差异为电商运营与市场策略提供数据支撑。1. 京东评论数据集做情感词分析从原始文本到可解释结论的完整路径电商评论的情感分析很多人第一反应是“调个预训练模型跑一下”。但真到落地环节卡住你的往往不是模型而是数据本身——评论里混着“质量很好物流太慢”这种一句话两个极性的句子还有“还行吧”“凑合”这种靠语气词判断的模糊表达。京东评论数据集这类中文电商语料价值就在于它保留了真实用户的表达习惯短句多、口语化、带错别字、夹杂表情符号和追评。拿它做情感词分析目标不是刷一个准确率数字而是搞清楚用户到底在夸什么、骂什么以及这些词能不能被稳定提取出来指导业务。适合谁看做用户反馈分析的产品数据同学、想入门中文NLP的算法工程师、以及需要给运营团队交付“评论洞察报告”的技术负责人。下面按数据获取、清洗、词级分析、模型验证、避坑、进阶技巧的顺序把这条路走通。2. 数据拿到手先别急着跑模型字段拆解与清洗策略2.1 京东评论数据集的典型字段与情感分析可用性判断不同渠道拿到的京东评论数据集字段结构会有差异但核心字段通常包括评论ID、用户昵称脱敏后、评分1-5星、评论正文、评论时间、商品SKU、点赞数、追评内容、购买型号。做情感词分析时评分字段是你的“弱标签”——4-5星通常对应正向1-2星对应负向3星是灰色地带。但别直接把评分当情感标签用因为存在“五星差评”现象用户为了让评论被看到给五星但内容全是吐槽。我一般会先做一轮人工抽样看评分和文本情感的一致性比例如果低于85%就需要引入规则或人工标注来修正标签。评论正文的长度分布也要先看。京东评论大量集中在10-50字超过200字的深度评论占比通常不到5%。这意味着你的情感词分析方案要能处理短文本稀疏问题——一句话里可能只有一个情感词甚至没有显式情感词比如“用了一周屏幕就花了”。追评字段尤其值得单独处理因为追评往往包含使用后的真实反馈情感极性可能和首评相反。2.2 用Python做文本清洗去噪、分句与情感单元切分拿到原始数据后第一步不是分词而是清洗。下面这段代码覆盖了去HTML标签、去URL、统一标点、分句、以及按标点切分情感单元的基本流程。import re import pandas as pd def clean_text(text): if not isinstance(text, str): return # 去掉HTML标签和URL text re.sub(r[^], , text) text re.sub(rhttp[s]?://\S, , text) # 去掉多余空白和特殊符号保留中文、英文、数字和常用标点 text re.sub(r[^\u4e00-\u9fa5a-zA-Z0-9。、], , text) # 统一标点 text text.replace(, 。).replace(, 。) return text.strip() def split_sentences(text): # 按句号、分号、感叹号切分保留语义完整的情感单元 parts re.split(r[。], text) return [p.strip() for p in parts if len(p.strip()) 2] # 假设df有content和score两列 df pd.read_csv(jd_reviews.csv) df[clean_content] df[content].apply(clean_text) df[sentences] df[clean_content].apply(split_sentences) # 展开成句子级DataFrame方便后续逐句分析 df_sent df.explode(sentences).dropna(subset[sentences]) df_sent df_sent[df_sent[sentences].str.len() 1] print(f原始评论数{len(df)}切分后情感单元数{len(df_sent)})这段代码的关键参数在split_sentences的正则只按句号和分号切不按逗号切。原因是中文评论里逗号连接的两个分句经常共享同一个情感主体比如“质量很好物流也快”按逗号切会把“物流也快”单独拎出来丢失“也”这个关联词。切分后的情感单元数量通常是原始评论的1.5-2.5倍具体取决于评论长度分布。如果切分后单元数暴增但平均长度低于5个字说明切太碎了需要把最小长度阈值从2调到4。清洗完还要处理一个容易被忽略的问题表情符号和网络用语。京东评论里“yyds”“绝绝子”“踩雷”这类词通用情感词典往往覆盖不到。我的做法是维护一个领域补充词典在分词阶段用自定义词典加载进去避免被切碎。3. 情感词分析的三条路线词典法、统计法与预训练模型3.1 基于情感词典的极性打分快速出baseline词典法是最快能跑出结果的路线适合做第一版baseline和可解释性交付。核心逻辑是对每个情感单元分词匹配正向词典和负向词典结合否定词和程度副词做加权求和。import jieba from collections import defaultdict # 加载情感词典这里用简化的示例词典实际建议用知网HowNet或大连理工情感词典 pos_words set([好, 快, 满意, 喜欢, 推荐, 划算, 精致, 流畅, 清晰]) neg_words set([差, 慢, 失望, 垃圾, 卡顿, 模糊, 贵, 后悔, 粗糙]) negation_words set([不, 没, 无, 非, 别]) degree_words {很: 1.5, 非常: 1.8, 太: 1.6, 有点: 0.7, 稍微: 0.6} def sentiment_score(sentence): words jieba.lcut(sentence) score 0.0 i 0 while i len(words): w words[i] # 检查否定词和程度副词的前置修饰 neg 1.0 degree 1.0 j i - 1 while j 0 and (words[j] in negation_words or words[j] in degree_words): if words[j] in negation_words: neg * -1 if words[j] in degree_words: degree * degree_words[words[j]] j - 1 if w in pos_words: score 1.0 * neg * degree elif w in neg_words: score - 1.0 * neg * degree i 1 return score df_sent[dict_score] df_sent[sentences].apply(sentiment_score) # 按评论ID聚合取均值作为整条评论的情感分 review_score df_sent.groupby(review_id)[dict_score].mean()这段代码里否定词和程度副词的向前搜索窗口是“连续修饰”逻辑只往前看紧邻的修饰词遇到非修饰词就停。实际使用中窗口可以放宽到3个词但要注意“不”和“太”同时出现时的顺序比如“不太好”是负向“太不好”也是负向但程度更强。词典法的准确率在京东评论上通常能到65%-75%瓶颈在于新词和反讽。但它的优势是每个分数都能追溯到具体的情感词运营团队看得懂。3.2 用TF-IDF和卡方检验提取高区分度情感词词典法覆盖不全那就让数据自己说话。把评分1-2星设为负向、4-5星设为正向用TF-IDF加卡方检验找出区分度最高的词。from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.feature_selection import chi2 import numpy as np # 只取1-2星和4-5星3星丢弃 df_binary df[df[score].isin([1, 2, 4, 5])].copy() df_binary[label] df_binary[score].apply(lambda x: 0 if x 2 else 1) vectorizer TfidfVectorizer( tokenizerlambda x: jieba.lcut(x), max_features5000, min_df5, # 至少出现在5条评论中 max_df0.8, # 出现在超过80%评论中的词丢弃 ngram_range(1, 2) # 考虑二元词组捕捉物流快这类组合 ) X vectorizer.fit_transform(df_binary[clean_content]) y df_binary[label].values chi2_scores, p_values chi2(X, y) feature_names vectorizer.get_feature_names_out() # 按卡方值排序取Top 30 top_indices np.argsort(chi2_scores)[-30:][::-1] for idx in top_indices: print(f{feature_names[idx]}: chi2{chi2_scores[idx]:.2f}, p{p_values[idx]:.4f})参数说明min_df5过滤掉只出现一两次的噪声词max_df0.8过滤掉“商品”“京东”这类几乎每条都有的中性词ngram_range(1,2)让“物流快”“屏幕清晰”这类二元组合能作为整体特征参与筛选。卡方值越高说明这个词对正负情感的区分能力越强。跑完之后你会得到一份数据驱动的情感词表把它和词典法的词表做交集和差集差集部分就是领域特有词值得补充进自定义词典。3.3 预训练模型微调用京东评论数据做领域适配如果词典法和统计法的效果不够或者你需要处理“还行吧”这种没有显式情感词的句子就需要上预训练模型。用中文BERT在京东评论数据上做微调通常能把准确率拉到85%以上。from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments from torch.utils.data import Dataset import torch class ReviewDataset(Dataset): def __init__(self, texts, labels, tokenizer, max_len128): self.texts texts self.labels labels self.tokenizer tokenizer self.max_len max_len def __len__(self): return len(self.texts) def __getitem__(self, idx): encoding self.tokenizer( self.texts[idx], truncationTrue, paddingmax_length, max_lengthself.max_len, return_tensorspt ) return { input_ids: encoding[input_ids].squeeze(), attention_mask: encoding[attention_mask].squeeze(), labels: torch.tensor(self.labels[idx], dtypetorch.long) } tokenizer BertTokenizer.from_pretrained(bert-base-chinese) model BertForSequenceClassification.from_pretrained(bert-base-chinese, num_labels2) # 划分训练集和验证集 from sklearn.model_selection import train_test_split train_texts, val_texts, train_labels, val_labels train_test_split( df_binary[clean_content].tolist(), df_binary[label].tolist(), test_size0.2, random_state42 ) train_dataset ReviewDataset(train_texts, train_labels, tokenizer) val_dataset ReviewDataset(val_texts, val_labels, tokenizer) training_args TrainingArguments( output_dir./jd_sentiment_model, num_train_epochs3, per_device_train_batch_size16, per_device_eval_batch_size32, learning_rate2e-5, warmup_ratio0.1, weight_decay0.01, evaluation_strategyepoch, save_strategyepoch, load_best_model_at_endTrue, metric_for_best_modelaccuracy ) trainer Trainer( modelmodel, argstraining_args, train_datasettrain_dataset, eval_datasetval_dataset ) trainer.train()关键参数max_len128覆盖了绝大多数京东评论的长度超过128的截断处理learning_rate2e-5是BERT微调的经典值太高会破坏预训练权重太低收敛慢warmup_ratio0.1让前10%的步数用线性升温避免初期梯度震荡。训练完成后用验证集上的混淆矩阵看误判集中在哪——通常“3星中性评论”和“反讽评论”是主要错误来源。如果负向召回率明显低于正向说明负向样本太少需要做过采样或调整类别权重。4. 避坑指南京东评论情感分析里最容易翻车的五个点4.1 评分当标签用结果被“五星差评”带偏现象模型在验证集上准确率90%上线后运营反馈“明明在骂系统判成好评”。原因训练时直接把4-5星当正向标签但京东存在大量“五星差评”——用户为了曝光度给五星内容却是“大家别买用了三天就坏”。解决对4-5星但文本情感明显负向的样本做规则过滤用词典法先跑一遍把词典分低于-1的五星评论挑出来人工复核修正标签后再训练。4.2 分词把情感词切碎导致匹配失败现象词典法对“质量很好”能正确打分但对“质量杠杠的”判为中性。原因jieba默认词典里没有“杠杠的”被切成了“杠杠”“的”两个词都不在情感词典里。解决加载自定义词典把京东评论里高频的网络用语和口语表达加进去。具体做法是先用TF-IDF找出高频未登录词人工筛选后写入userdict.txt在jieba加载时指定jieba.load_userdict(userdict.txt)。4.3 否定词作用域判断错误把好评判成差评现象“不是不好用”被判为负向。原因否定词“不是”和“不”叠加简单的奇偶翻转逻辑处理不了双重否定。解决把否定词窗口从“连续修饰”改为“句内作用域”即一个否定词作用于其后直到下一个标点或转折词之前的所有情感词。同时维护一个双重否定词表“不是不”“不能不”优先匹配。4.4 追评和首评混在一起情感极性互相污染现象一条评论首评是“屏幕清晰”追评是“用了一个月就花了”整条评论被判为中性。原因聚合时取了均值正负抵消。解决追评单独作为一个情感单元处理不跟首评合并。在数据表里把追评字段拆出来生成独立的评论记录用同一个review_id关联但分别打分。业务上追评的权重应该高于首评因为它是使用后的真实反馈。4.5 模型在“3星”样本上过拟合泛化差现象训练集准确率95%测试集掉到78%。原因3星评论被强行归入正向或负向标签噪声大模型学到了噪声模式。解决把3星单独作为一类做三分类或者在二分类训练时直接丢弃3星样本但验证集里保留3星看模型的中性判断能力。如果业务只关心正负那就对3星样本做人工标注只保留情感明确的那些。5. 从词到洞察情感词分析结果的验证与业务落地技巧跑完模型拿到情感分只是第一步真正难的是验证这个分数靠不靠谱以及怎么把它变成业务能用的东西。我一般会做三层验证第一层是抽样人工核对从每个情感分段强正向、弱正向、中性、弱负向、强负向各抽50条人工判断模型分是否正确算一个修正后的准确率第二层是时间稳定性检查把评论按月份分组看情感均值的波动是否和已知的促销活动、物流事件对得上如果某个月情感分骤降但业务上没发生任何事大概率是数据管道出了问题第三层是交叉验证用词典法、TF-IDF统计法、BERT模型分别跑一遍看三者的分歧样本集中在哪分歧大的样本往往就是反讽或隐含情感值得单独拿出来分析。业务落地时别只给一个情感分。运营团队更想知道的是“用户在夸什么、骂什么”。我的做法是对负向评论做关键词聚类把“物流慢”“屏幕花”“客服差”分成不同主题每个主题给出典型原句和出现频次。正向评论同理提取“性价比高”“外观好看”“续航久”这些卖点词。这样交付出去的是一份带证据链的洞察报告而不是一个冷冰冰的准确率数字。还有一个技巧把情感词分析和评分趋势结合起来看。如果某商品评分稳定在4.5星但负向情感词占比从5%涨到了15%说明好评还在但差评在增加这是一个早期预警信号。反过来评分3.8星但正向情感词集中在“价格便宜”说明用户对价格满意但对品质有更高期待运营策略应该是推升级款而不是降价。最后说一个我踩过的坑早期做这个分析时我花了两周调模型把准确率从82%提到87%但运营团队根本不用因为他们看不懂混淆矩阵。后来我把交付物改成“每周负向评论Top10关键词及原句摘录”使用率立刻上来了。技术指标是给自己看的业务洞察才是给别人的。希望帮到你。本文还有配套的精品资源点击获取