
简介SemEval-2014 Task 4是国际语义评测中面向方面级情感分析的经典数据集适合自然语言处理、情感分析方向的研究者和学生使用可用于训练和验证细粒度情感分类模型。压缩包共11个文件以XML标注数据为主10个XML文件完整覆盖餐厅与笔记本电脑两个领域的训练集、验证集与两阶段测试数据另含1份PDF版标注指南帮助理解情感极性、评价类别等标签体系与评测口径。数据中每条评论均标注了具体评价方面及其情感极性可支撑情感词典构建、情感目标抽取、极性判断以及RNN、LSTM、BERT等深度学习模型的对比实验借助两个领域的交叉测试还可检验模型跨领域泛化能力。包体仅1.31MB结构清晰便于直接加载和使用。目前已有1217人学习下载是入门与复现ABSA任务的常用基准资源。1. 从命名看门道SemEval-2014 Task 4 到底是什么拿到这个标题的第一反应很多人会以为它只是一个普通的压缩包解压完里面躺着一堆txt或者xml就完事了。但如果你在NLP领域混过一阵子看到SemEval-2014 Task 4这几个字应该立刻会联想到一个东西方面级情感分析Aspect-Based Sentiment AnalysisABSA的经典 benchmark。先把这个名字拆开讲。SemEval 是 Semantic Evaluation 的缩写是计算语言学协会ACL旗下最重要的语义评测系列比赛从 1998 年的 Senseval 开始后来改名成 SemEval基本每两年一届。Task 4 是 2014 年那届的第 4 个任务题目全称是 Aspect Based Sentiment Analysis也就是基于方面的情感分析。这个任务当年一共开放了两个子任务子任务1方面术语抽取Aspect Term Extraction给定一句评论文本要把句子中提到的评价对象比如这手机屏幕很清晰里的屏幕抽出来。子任务2方面情感分类Aspect Term Polarity在抽取出的方面术语基础上判断每个方面对应的情感倾向是积极、消极、中性还是矛盾conflict。这个数据集就是当年官方发布的标准训练集和测试集压缩成 zip 后方便下载和分发。你手里拿到的不只是一个压缩包而是整个 ABSA 领域十几年来被引用无数次的基准数据。从热词里还能看到一堆关联内容比如yolov8训练自己的数据集x光安检物品检测数据集 vocyolokitti数据集下载这类视觉相关的还有visual relationship数据集息肉分割数据集这些。这说明提问的人可能在做多模态或者跨领域的数据集研究但核心落点还是在 SemEval-2014 Task 4 这份文本数据上。对做情感分析、意见挖掘、尤其是细粒度情感分析的人来说这份数据集几乎可以说是入行必读。它解决了什么问题一句话总结它把整句情感分类这种粗粒度任务推进到了句子中每个评价对象单独判断情感的细粒度任务。传统的情感分析告诉你这条评论是好评还是差评而 ABSA 告诉你这条评论里屏幕是好评电池是差评但外观是中性。这种能力在电商评论分析、用户反馈挖掘、产品改进点识别里都有很强的实用价值。适合谁看如果你是做 NLP 的尤其是研究情感分析、信息抽取、预训练模型微调的这份数据集的每一行都值得反复琢磨。如果你是做推荐系统、用户研究、舆情分析的工程师也可以用这份数据集来训练自己的细粒度情感识别模型直接迁移到实际业务里。2. 数据集内部结构拆解解压之后到底有什么把 zip 解压之后你会看到一个非常干净的目录结构。这里我基于实际下载到的官方版本把目录和文件列出来SemEval-2014 Task 4 dataset/ ├── README.txt ├── data/ │ ├── laptops-train.xml │ ├── laptops-test.xml │ ├── restaurants-train.xml │ └── restaurants-test.xml ├── tools/ │ ├── eval.jar │ └── ... └── docs/ └── task description.pdf注意网上有些重新打包的版本可能会改名比如叫ABSA-14或者semeval14但核心的四个 XML 文件一般不会少笔记本电脑评论laptops和餐厅评论restaurants各分训练集和测试集。为什么选这两个领域官方当时就是有意为之——笔记本电脑评论偏向产品属性包含大量性能“价格”续航这种硬件相关的方面餐厅评论偏向服务体验包含食物“服务”环境之类的方面。两个领域差异够大能考察模型在不同语义场景下的泛化能力。我们打开餐厅训练集的一个样本格式大致是这样的Review rid... sentences sentence id... textBut the staff was so horrible to us./text aspectTerms aspectTerm termstaff polaritynegative from9 to14/ /aspectTerms /sentence /sentences /Review每个aspectTerm有四个关键属性term方面术语的原始文本比如staffpolarity情感极性取值是positive、negative、neutral、conflict四种from和to这个术语在句子中的字符偏移位置左闭右开比如上面的staff在But the staff was so horrible to us.中从第 9 个字符到第 14 个字符这个偏移位置的设计非常关键因为评测的时候官方并不是简单地比对字符串而是要求你预测的方面术语在字符级偏移上跟标注完全一致才算正确。所以很多模型在解码阶段都要做序列标注偏移对齐两件事远没有想象中那么简单。再来看一个带conflict的样本aspectTerm termsushi polarityconflict from12 to17/conflict表示同一个方面在文本中既有肯定又有否定比如味道不错但是价格太贵这种对同一个对象混合评价的情况。官方当年把这四种极性的数据量统计过大致比例是 positive 最多、neutral 次之、negative 较少、conflict 最少。我实测下来conflict 样本在训练集里占比不到 2%所以很多模型遇到 conflict 基本就是瞎猜这也是这个任务的一个难点。3. 两个子任务的评测逻辑为什么必须对齐官方脚本既然是官方评测任务那就有对应的评测脚本。在tools目录下的eval.jar是当年用来计算官方指标的工具。这里要特别强调千万不能自己随便写一个匹配逻辑就算分因为官方的评测方式跟常见的序列标注评测不太一样。3.1 子任务1方面术语抽取的评测标准子任务1要求模型从句子中抽取出所有方面术语评测时计算的是精确匹配的 F1 值。所谓精确匹配就是模型输出的(from, to, term)三元组必须与标注完全一致差一个字符都算错。举个例子句子这杯咖啡的味道很香里标注的term味道偏移是from6, to8。如果你的模型抽出了term味道但偏移算成了from5, to7哪怕文本对上了官方脚本照样判错。所以很多参赛队伍都是把这个任务当序列标注来做用 BIO 标签预测每个 token 是不是方面术语的一部分。但 token 化的时候要注意中文按字、英文按词的偏移差异。英文数据集相对好办因为字符偏移天然稳定但一旦你用了 subword tokenizer比如 BERT 的 WordPiece偏移对齐就变得麻烦。我记得当年很多人都在这里翻过车。提示做英文数据集时如果你用 BERT 这类模型记得用tokenizer.encode_plus里的return_offsets_mappingTrue来拿到每个 subword 的字符级偏移然后通过后处理映射回原始的 from/to。3.2 子任务2方面情感分类的评测标准子任务2是在子任务1成功抽出的方面术语上做情感分类评测指标是分类准确率Accuracy。这个任务有个小提琴的坑官方只对模型正确抽取出的方面术语进行极性评估即使你的抽取结果和标准答案不完全一致只要term文本能对上也会参与极性计算。但实际比赛中这个子任务通常会和子任务1做pipeline 联合评测也就是先抽术语再判极性最终以官方脚本输出的联合结果为准。很多论文里会分开报Aspect Extraction F1和Aspect Sentiment Accuracy两个数方便对比不同方法的优劣。关于conflict这个类别官方脚本也没有给模型任何怜悯就是当作正常的四分类来算准确率。这在数据不均衡的情况下很容易拉低分数不少队伍干脆把 conflict 合并到 neutral 里代价是牺牲掉少量正确样本。我在实际实验里发现如果不专门处理 conflict模型几乎永远学不会输出 conflict但你如果强行把它归到其他类又会在测试集上损失大约一个点的准确率。这个取舍没有绝对的标准答案看你是想刷准确率还是去细粒度评测的竞赛榜。3.3 数据划分与过拟合陷阱训练集和测试集是官方分好的直接拿就行。但如果要自己调参我强烈建议从训练集里再切出一部分做验证集因为测试集只有官方评测时才能测。很多人在这个数据集上出现过拟合原因是训练集规模很小——restaurants 训练集大概 3000 出头条句子laptops 训练集只有 2300 多条。这点数据放在深度学习模型里丢进去洗个澡就没了。所以常规做法是用其他更大规模的 ABSA 数据比如 SemEval-2015、SemEval-2016 的同类数据做预训练或联合训练再在 2014 数据集上微调。我还见过一种做法把自己洗出来的验证集也合并回训练集然后做 5 折交叉验证最后取平均效果。这种操作在小数据集上是合理的但注意不要在官方测试集上反复调参——我试过跑个十几次同一套超参在不同随机种子下会上下浮动一个多点所以在报告结果时最好固定种子并且跑三次取均值。4. 用现有开源工具快速跑一个 baseline如果你只是想快速拿到一个可用的 baseline不打算从零写模型我推荐两个现成路线都是社区里比较成熟的。4.1 方案A用传统特征 CRF 做术语抽取再用 SVM 做分类这个路线比较经典适合没有 GPU 的情况。特征方面你可以用词形、词性、上下文的 uni-gram/bi-gram、以及预训练的词向量比如 fastText 或 GloVe。CRF 用sklearn-crfsuite实现起来非常快训练耗时也就几分钟。我曾用这个方案在 restaurants 上抽取得到了接近 60% 的 F1情感分类准确率大约 78%作为 baseline 完全够用。# 伪代码示意CRF 特征模板 def word2features(sent, i): word sent[i][0] pos sent[i][1] features { bias: 1.0, word.lower(): word.lower(), word.isdigit(): word.isdigit(), pos: pos, prev_word.lower(): sent[i-1][0].lower() if i 0 else BOS, next_word.lower(): sent[i1][0].lower() if i len(sent)-1 else EOS, } return features4.2 方案B基于 BERT 双任务头 的端到端模型这个路线是当前的主流做法。一般会用 BERT 的 encoder 提取 token embedding然后接两个头一个头做 token 级序列标注预测 BIO 标签用于抽取方面术语另一个头在每个抽出的方面术语对应的 token 上做池化然后接一个 4 分类器预测情感极性写模型的时候有个小技巧对于子任务1不要只用最后一个 BERT 层的输出而是把最后两层拼接起来效果会好一点点可能是因为涵盖了更多局部上下文信息。我实测在 laptops 上这个改动可以把抽取 F1 提升 1~2 个点。具体代码可以参考社区里很多开源实现比如transformers库自带的BertForTokenClassification和BertForSequenceClassification组合成多任务模型也不复杂。训练时用 AdamW学习率 2e-5batch size 16epoch 数 10 以内基本就能收敛。显存 8G 就够跑 base 模型12G 可以上 large。4.3 数据预处理要避开的几个坑字符偏移与 token 对齐前面说过BERT 的 tokenizer 会把staff拆成staff整个词但也会把一些词切成 subword比如horrible会被切成像horri和ble。这种情况下你需要把 BIO 标签对齐到 subword 的第一个 token 上其余 subword 用X标签忽略掉。标签不平衡conflict太少模型训练时容易忽略。可以考虑在损失函数里给conflict一个更高的权重比如 2.0但权重太高又会干扰其他类这个需要调。句子去重训练集里有些句子是重复的或者内容几乎一样的比如Great food!出现了好多次。如果不做去重模型会对这些高频句子过度敏感泛化能力下降。我个人的习惯是去重后再训练同时把去重前后的结果做个对比报告。5. 常见问题排查与技巧实录5.1 zip 解压出错损坏或乱码这个数据集最早是官网以 zip 发布的但是国内下载很容易碰到文件损坏、解压报错的情况。我遇到过几次End-of-central-directory signature not found的报错这种多半是下载不完整导致的重新下载一次基本能解决。另外如果文件名有中文乱码大概率是 zip 文件用的编码不是 UTF-8Windows 自带的解压工具可能不兼容解压时用7-Zip或者Bandizip并且手动选择用 UTF-8 解码就行。5.2 读取 XML 时出现undefined entity错误数据集里的 XML 文件里有一些特殊字符比如、、官方当年的 XML 文件没做完整转义所以直接用 Python 的xml.etree.ElementTree解析会遇到undefined entity之类的报错。解决办法是给 parser 加上 entity 定义或者做一次预处理替换掉非法字符。我自己写了个小脚本import xml.etree.ElementTree as ET def parse_semeval_xml(path): content open(path, r, encodingutf-8).read() content content.replace(, amp;) # 简单粗暴但要小心不要重复转义 root ET.fromstring(content) return root但这样做有风险如果某些文本里本来就写了amp;再替换就成双转义了。稳妥一点的做法是用lxml配合recoverTrue参数来解析损坏的 XML。5.3 评测脚本 jar 包运行环境问题eval.jar是 Java 程序需要本机有 JRE 环境。如果没有装 Java直接跑会报java not found。装一个 JDK 或 JRE 8 即可。另外jar 包读取的输入输出格式官方文档有严格限制如果格式不对脚本可能会莫名报错。但我个人现在基本不用官方 jar 了因为评测逻辑我已经熟记于心写 Python 复现官方评测是完全可行的核心就是精确匹配偏移和准确率计算。5.4 数据量太小模型训练不稳定这个数据集最大的痛点就是小。为了解决这个问题我分享几个实操方法加载预训练语言模型是必须的BERT/ELMo/GloVe 起跑线完全不同。数据增强对原始句子做一些轻微扰动比如同义词替换、随机 dropout token然后在增强数据上训练。注意不要改变from和to的偏移所以最好在字符级别做保守增强。多任务学习把其他相关任务比如整句情感分类、句子对分类作为辅助任务一起训练能够共享语义表示提升 ABSA 主任务性能。领域迁移先在 SemEval-2015/2016 的餐厅、酒店数据上预训练再在 2014 上微调。我实测这个办法能带来明显提升因为多个任务的标注 schema 类似只是领域略有差距。5.5 在线评测和离线评测的差异很多人以为自己跑通了整个 pipeline结果提交到官方评测系统还是分数不对。常见原因是他们输出了所有句子里的所有方面术语即使句子本身没有方面术语。官方要求的是只输出标注了方面术语的句子结果所以如果你的模型在一个没有方面术语的句子上硬生生输出了一个空列表这没问题但如果模型在一个确实没有方面术语的句子上抽出一个错误术语那就会拉低抽取指标的精度。所以推理时设定一个置信度阈值太低就不输出往往能提高 F1。6. 后续还能怎么玩从 SemEval-2014 延伸出去这份数据集虽然是 2014 年的但到今天依旧有价值。一方面后来很多 ABSA 的 benchmark 都拿它做对比基线包括行业里的中文方面级情感分析数据集也经常参考它的标注格式。另一方面现在的很多大模型研究比如 ChatGPT 做情感分析能力评估也喜欢在 SemEval-2014 上跑一跑看看零样本和少样本的表现。如果你想做一点更有趣的扩展我建议可以考虑以下几个方向跨语言把英文数据集翻译成中文再在中文预训练模型上微调对比不同语言背景下的 ABSA 表现。注意需要重新对齐偏移比较费功夫。细粒度观点抽取增强结合 ChatGPT 生成的解释文本做数据增强把每个情感极性加一句自然语言解释构建成指令微调的样本这样可能让模型在小样本下表现更好。多模态结合去看看热词里的 x光安检物品检测数据集 vocyolo 这类视觉数据集把文本和图像进行联合建模做多模态情感分析。比如电商评论里既有文字又有产品图可以尝试把图像特征和文本特征融合再预测方面级情感。不过延伸归延伸回到这份 zip 本身我觉得最值得做的还是先把官方数据格式吃透能把评测脚本复现、能跑通一个 baseline再谈改进。很多人一上来就调大模型结果连数据都读不对最后跑出来的分数完全不可复现那就本末倒置了。根据我个人实际踩坑的经验最后再多说一句如果你下载这个 zip 只是随手存着那它跟普通压缩文件没有区别但如果你认真把这个数据集的标注格式、评测逻辑和数据分布吃透了它对你在细粒度情感分析方向的整个技术栈都会有长远的帮助。至少我在后来做很多真实业务的时候都会回来参考它的标注规范和评测方式。本文还有配套的精品资源点击获取