简介: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 Analysis,ABSA)的经典 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光安检物品检测数据集 voc+yolo""kitti数据集下载"这类视觉相关的,还有"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="..."> <text>But the staff was so horrible to us.</text> <aspectTerms> <aspectTerm term="staff" polarity="negative" from="9" to="14"/> </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 term="sushi" polarity="conflict" from="12" to="17"/>conflict表示同一个方面在文本中既有肯定又有否定,比如"味道不错,但是价格太贵"这种对同一个对象混合评价的情况。官方当年把这四种极性的数据量统计过,大致比例是 positive 最多、neutral 次之、negative 较少、conflict 最少。我实测下来,conflict 样本在训练集里占比不到 2%,所以很多模型遇到 conflict 基本就是瞎猜,这也是这个任务的一个难点。
3. 两个子任务的评测逻辑:为什么必须对齐官方脚本
既然是官方评测任务,那就有对应的评测脚本。在tools目录下的eval.jar是当年用来计算官方指标的工具。这里要特别强调:千万不能自己随便写一个匹配逻辑就算分,因为官方的评测方式跟常见的序列标注评测不太一样。
3.1 子任务1:方面术语抽取的评测标准
子任务1要求模型从句子中抽取出所有方面术语,评测时计算的是精确匹配的 F1 值。所谓精确匹配,就是模型输出的(from, to, term)三元组必须与标注完全一致,差一个字符都算错。
举个例子,句子"这杯咖啡的味道很香"里,标注的term="味道",偏移是from=6, to=8。如果你的模型抽出了term="味道"但偏移算成了from=5, to=7,哪怕文本对上了,官方脚本照样判错。
所以很多参赛队伍都是把这个任务当序列标注来做,用 BIO 标签预测每个 token 是不是方面术语的一部分。但 token 化的时候要注意中文按字、英文按词的偏移差异。英文数据集相对好办,因为字符偏移天然稳定;但一旦你用了 subword tokenizer,比如 BERT 的 WordPiece,偏移对齐就变得麻烦。我记得当年很多人都在这里翻过车。
提示:做英文数据集时,如果你用 BERT 这类模型,记得用
tokenizer.encode_plus里的return_offsets_mapping=True来拿到每个 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[i+1][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-5,batch size 16,epoch 数 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-8,Windows 自带的解压工具可能不兼容,解压时用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', encoding='utf-8').read() content = content.replace('&', '&') # 简单粗暴,但要小心不要重复转义 root = ET.fromstring(content) return root但这样做有风险,如果某些文本里本来就写了&,再替换就成双转义了。稳妥一点的做法是用lxml配合recover=True参数来解析损坏的 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光安检物品检测数据集 voc+yolo" 这类视觉数据集,把文本和图像进行联合建模,做多模态情感分析。比如电商评论里既有文字又有产品图,可以尝试把图像特征和文本特征融合,再预测方面级情感。
不过延伸归延伸,回到这份 zip 本身,我觉得最值得做的还是先把官方数据格式吃透,能把评测脚本复现、能跑通一个 baseline,再谈改进。很多人一上来就调大模型,结果连数据都读不对,最后跑出来的分数完全不可复现,那就本末倒置了。
根据我个人实际踩坑的经验,最后再多说一句:如果你下载这个 zip 只是随手存着,那它跟普通压缩文件没有区别;但如果你认真把这个数据集的标注格式、评测逻辑和数据分布吃透了,它对你在细粒度情感分析方向的整个技术栈都会有长远的帮助。至少我在后来做很多真实业务的时候,都会回来参考它的标注规范和评测方式。
本文还有配套的精品资源,点击获取