Drug Reviews (UCI) — 21.5 万条患者药品评论 AI-Ready Wikipedia

215,063 条患者药品评论与 1-10 分自报评分的医疗 NLP 基准语料

来源 UCI Machine Learning Repository url: https://archive.ics.uci.edu/dataset/462/drug+review+dataset+drugs+com发布时间: 2026-09-16最后更新: 2026-09-25 阅读 36
Drug Reviews (UCI) — 21.5 万条患者药品评论 AI-Ready Wikipedia

信息速览

数据集名称Drug Reviews (UCI) — 21.5 万条患者药品评论 AI-Ready Wikipedia
数据类型215,063 条评论,7 字段 TSV,约 109.7 MB,CC BY 4.0 开放获取,2008-2017 十年跨度
规模约 21.5 万条患者评论(独立患者数官方未披露)
接入方式UCI Machine Learning Repository url: https://archive.ics.uci.edu/dataset/462/drug+review+dataset+drugs+com
AI 就绪度

数据集封面

Drug Reviews (UCI) — 21.5 万条患者药品评论情感分析基准 AI-Ready Wikipedia


INFOBOX

字段 内容
数据集名称 药品评价数据集(Drug Reviews)
英文全称 Drug Review Dataset (Drugs.com)
别名/简称 UCI Drug Review Dataset (Drugs.com)、Drugs.com Reviews、KUC Hackathon Winter 2018(Kaggle 镜像名)
疾病分类(ICD-11 编码+中文名) 无单一编码:condition 覆盖约 708 类疾病/用药情境;高频如 6A70 抑郁发作、6B00 广泛性焦虑障碍、MG30 慢性疼痛、EA80 痤疮(完整映射见 §2)
SNOMED CT 无单一编码;代表映射如 69896004 广泛性焦虑障碍、22253000 慢性疼痛、406506008 注意缺陷多动障碍(完整映射见 §2.1b)
数据模态 患者药品评论文本(自由文本)+ 1-10 分自报评分 + 有用性投票计数
AI 任务类型 情感分析/文本分类(主任务)、方面级情感分析、药物警戒信号挖掘、跨域迁移学习
样本总数 215,063 条评论(训练 161,297 + 测试 53,766)
数据大小 约 109.7 MB(两个 TSV 文件解压后)
数据格式 TSV(UCI 官方);CSV/Parquet(社区镜像)
许可证 CC BY 4.0
访问级别 开放
DUO 标签 NRES(无限制,须满足 CC BY 4.0 署名要求)
语言 英语
首发日期 2018
最后更新 2018(UCI 收录后未发布新版本)
发布机构 UCI Machine Learning Repository;创建者 Surya Kallumadi(Kansas State University)、Felix Gräßer(TU Dresden)
官方主页 UCI Drug Review Dataset (Drugs.com)
下载地址 UCI 数据页 Data Folder
DOI 10.24432/C5SK5S
引用次数 173+(Semantic Scholar,截至 2026-09)
AI 就绪度评分 ⭐⭐⭐⭐(4/5)— 官方提供 train/test 划分与统一 TSV,无需格式转换即可加载;扣分项:无官方预处理脚本,HTML 实体、condition 爬虫噪声与跨划分重复文本需手动清洗
页面状态 published

§0 E-E-A-T 信任声明与免责声明

医学审核者:千方病案医学编辑部交叉审核:§2 医学背景(ICD-11 与 SNOMED CT 映射、患者人群与临床任务定义、金标准描述)、§7 偏倚分析。

数据工程审核者:千方病案医学编辑部交叉审核:医疗 AI 数据工程师,审核范围:§4 DAIMS 数据字典、§5 数据划分策略、§6 预处理 Pipeline 和坑点。

审核日期:2026-09-05

医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。

技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。

数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。本数据集以 CC BY 4.0 许可发布于 UCI 机器学习仓库,无需注册或签署使用协议即可下载,但分发或使用时必须完整署名并注明来源;评论内容源自 Drugs.com 公开页面,商业再分发受 UCI 许可与源网站条款双重约束。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。

§1 数据集概览

§1.0 📌 30 秒速览

这是什么? 这是过去十年里医疗 NLP 领域最常被引用的患者评论语料之一:215,063 条发布在 Drugs.com 上的真实药品评论,每条都带有患者自己打出的 1-10 分评分、所治疾病条件、评论日期和其他读者投出的"有用"票数。数据由 Kansas State University 的 Surya Kallumadi 与德累斯顿工业大学的 Felix Gräßer 整理,2018 年发布于 UCI 机器学习仓库,并附带官方的训练/测试划分。

为什么重要? 药品上市后的真实体验大多不会进入病历,而是散落在患者社区里。这份数据把"患者视角的疗效与副作用叙事"变成了结构化表格,让研究者能系统性地从文本中抽取疗效感知、副作用抱怨与停药线索——这正是真实世界证据(RWE)与药物警戒(药物安全监测)的关键原料。它也是方面级情感分析(ABSA)跨入医疗领域的标志性基准。

我能用它做什么? 训练评论情感/评分预测模型、按药品与疾病条件抽取副作用主题、构建患者报告结局(PRO)分析管线、做跨站点迁移学习(迁移到 Druglib.com 姊妹语料),或把它当作医疗 NLP 课程的入门实战数据集。工程上它是单表 TSV,直接 pandas 即可加载,非常适合快速迭代。

§1.1 摘要

Drug Review Dataset (Drugs.com) 由爬取自 Drugs.com 的 215,063 条患者评论构成,采集窗口为 2008-02-25 至 2017-12-12,按约 75/25 随机划分为训练集 161,297 条与测试集 53,766 条(UCI 官方页)。每条记录 7 个字段:uniqueID、drugName、condition、review、rating(1-10 整数)、date、usefulCount。评论覆盖约 708 类疾病条件标签,Birth Control、Depression、Pain、Anxiety 与 Acne 占比最高;rating 呈典型双峰(1 与 9-10 两端聚集),据此常派生二分类标签(训练集正类 113,209 条 vs 负类 48,088 条,约 2.35:1)。源论文 Gräßer et al., DH '18 将其用于方面级情感分析与跨域/跨数据学习。数据以两个 TSV 文件发布(约 82.3 MB + 27.4 MB),CC BY 4.0 许可。

§1.2 战略价值

真实世界证据的入口级语料。 相比需要伦理审批与凭证化申请的住院病历库(如 MIMIC-III 这类 ICU 电子病历数据集),本数据集 CC BY 4.0 开放下载,是研究者进入"患者叙事文本 → 结构化健康信号"这条技术路线门槛最低的载体。它让 PRO 挖掘、药物警戒信号生成这类通常被数据获取卡住的研究方向,可以立刻起步。

医疗 NLP 的标准化练兵场。 215,063 条规模适中:小到单张消费级 GPU 数小时可完成 BERT 微调,大到足以支撑预训练表征评估与误差分析;官方 train/test 划分让论文间结果具备初步可比性。其姊妹语料 Druglib.com(UCI ID 461,4,143 条、8 字段)恰好构成跨域迁移的天然测试床——源论文的核心贡献之一正是证明"从 Drugs.com 学到的模型可迁移到 Druglib.com"。

§1.3 同类数据集横向对比

数据集 规模 模态/标注 差异化特点
Drug Review (Drugs.com)(本词条) 215,063 条 评论文本 + 1-10 评分 + usefulCount 规模最大、十年跨度、官方划分、CC BY 4.0 开放
Drug Review (Druglib.com)(UCI ID 461,站内另有词条) 4,143 条 评论 + 1-10 评分 + 5 级 effectiveness/sideEffects 含 5 级副作用与有效性有序标签,适合迁移目标域
CADEC(ADR 语料) 约 590 篇论坛帖子 帖子文本 + ADR 实体/关系人工标注 实体级细标注,规模小,适合序列标注而非大规模分类
Twitter ADR 提及语料(Nikfarjam et al. 2015) 约 6,600 条推文 推文 + ADR 提及标注 短文本、噪声大,侧重社交药物警戒

§1.4 版本时间轴

时间 事件
2018-04 源论文 Gräßer et al., “Aspect-Based Sentiment Analysis of Drug Reviews Applying Cross-Domain and Cross-Data Learning” 发表于 ACM DH '18(里昂),数据集随研究整理发布
2018-11 至 2018-12 Kaggle 以 KUC Hackathon Winter 2018 形式提供镜像(jessicali9530/kuc-hackathon-winter-2018),成为社区最常用的获取入口之一
2018 UCI 机器学习仓库正式收录(ID 462),发布两个 TSV 文件与官方 75/25 划分
2023 UCI 平台整体迁移改版,本数据集获配 DOI 10.24432/C5SK5S,许可证标注为 CC BY 4.0

§1.5 典型应用场景

  1. 药品体验情感分析:以 rating 派生标签训练评论级情感模型,量化患者对特定药品的满意与不满分布。
  2. 副作用主题与 ADR 线索挖掘:在负面评论中抽取副作用描述模式,为药物警戒提供信号生成线索(须人工复核,不可直接推因果)。
  3. 跨域迁移学习研究:Drugs.com → Druglib.com 的域适应实验,对应源论文的 cross-domain 设定。
  4. 患者报告结局(PRO)研究原型:把叙事文本映射为疗效/安全性维度的量化指标,补充临床试验外的体验证据。
  5. 教学与课程基准:开放许可 + 单表结构,适合作为医疗 NLP 课程的第一个端到端实战项目。
  6. 有用性投票建模:以 usefulCount 为目标研究"什么样的患者解释最有价值",支撑社区问答排序系统。

§1.6 快速判断:这个数据集适合你吗

  • 适合:需要中大规模英文患者评论文本、关注情感/ABSA/ADR 挖掘、希望零门槛获取(无注册、无协议签署)的研究与工程团队。
  • 谨慎:需要患者级纵向追踪、人口统计分组或有序副作用强度标签的场景——本数据集均不提供(副作用强度标签见姊妹语料 Druglib.com)。
  • 不适合:临床决策支持、流行病学发生率估计、非英语语种建模。

§2 医学背景

§2.1 ICD-11 映射表

数据集的 condition 字段为自由文本疾病/用药情境(约 708 类,含噪声),并非受控术语。下表给出高频 condition 的 ICD-11 建议映射(映射由编辑部基于 ICD-11 浏览器公开内容整理,属编者建议性映射):

condition 标签 ICD-11 编码 ICD-11 中文名 说明
Birth Control 不适用 不适用(非疾病概念) 指避孕药具使用情境,评论量最高的单一条件
Depression 6A70 抑郁发作 高频精神科条件
Pain MG30 慢性疼痛 泛指慢性疼痛类目
Anxiety 6B00 广泛性焦虑障碍 高频精神科条件
Acne EA80 痤疮 高频皮肤科条件
Bipolar Disorder 6A60 双相 I 型障碍 双相谱系以 6A60 为代表
Insomnia 7A00 失眠(慢性失眠障碍) 睡眠-觉醒障碍章节
Weight Loss / Obesity 5B80 肥胖 减重情境评论多与肥胖管理相关
ADHD 6A05 注意缺陷多动障碍 高频神经发育条件
High Blood Pressure BA00 原发性高血压 心血管高频条件
Type 2 Diabetes 5A11 2 型糖尿病 内分泌高频条件

§2.1b SNOMED CT 映射表

condition 标签 SNOMED CT 编码 SNOMED 首选术语 映射说明
Birth Control 370143000 Family planning service (procedure) 以计划生育服务概念近似表达避孕情境
Depression 26929004 Depression (finding) 发现类概念,或用 35489007 抑郁障碍
Anxiety 69896004 Generalized anxiety disorder (disorder) 评论中 “Anxiety” 多为广泛性焦虑语境
Pain 22253000 Chronic pain (finding) 泛指评论语境下的长期疼痛
Acne 78464003 Acne vulgaris (disorder) 常见皮肤科疾病概念
Bipolar Disorder 13746004 Bipolar disorder (disorder) 双相谱系代表概念
Insomnia 193462001 Insomnia (finding) 发现类概念
Obesity 414916001 Obesity (disorder) 体重管理相关评论的映射锚点
ADHD 406506008 Attention deficit hyperactivity disorder (disorder) 高频神经发育概念
High Blood Pressure 38341003 Hypertensive disorder, systemic arterial (disorder) 高血压类目
Type 2 Diabetes 44054006 Diabetes mellitus type 2 (disorder) 内分泌高频概念

注:以上 SNOMED CT 映射为编辑部基于公开术语服务的建议性映射,正式科研使用前建议经术语专家复核。

§2.2 疾病背景与流行病学

本数据集评论高度集中于慢性病与自我管理型疾病。核心病种的流行病学背景:

病种/情境 全球流行概况 数据集内的角色
抑郁 WHO 估计约 2.8 亿人受抑郁困扰(WHO 官网概况页,截至 2026-09) 高频精神科条件,负面评论中副作用与换药叙事密集
焦虑 WHO 估计约 3 亿人受焦虑障碍困扰(WHO 官网概况页,截至 2026-09) 与抑郁、失眠评论高度共现
慢性疼痛 约五分之一成人受慢性疼痛影响(广泛引用的疼痛流行病学估计) Pain 为第三大条件,阿片类相关评论敏感性高
痤疮 约 85% 的 12-24 岁人群曾受影响(皮肤科文献常引用的估计) 高频皮肤科条件,疗程长、评论持续性好
避孕 非疾病情境 评论量最高的单一条件,月度级使用体验叙事

这类疾病有三个共同特征,恰好解释了本数据集的形态:其一,治疗周期长,患者有持续记录与分享体验的动机;其二,疗效与副作用个体差异大,患者叙事的信息量高;其三,自我用药与经验交流是常见行为,公开社区(Drugs.com)成为天然的观察窗口。评论中占比最高的 Birth Control 并非疾病,而是长期用药情境,其评论往往包含月度级的使用体验,因而评论量与有用性投票都最高。

§2.3 临床任务定义

本数据集支持的不是影像学意义上的"诊断"任务,而是患者报告结局(PRO)感知任务族:

任务 输入 → 输出 标签来源 典型用途
评论级情感/评分预测 review → 1-10 分或二分类 rating 自报分 药品满意度监测
方面级情感分析(ABSA) review → (方面词,极性) 文本抽取建模 疗效/副作用/可及性分维分析(源论文核心任务)
ADR 信号生成 负面评论 → 副作用主题 无监督/弱监督 药物警戒前置信号
停药/换药意图挖掘 review → 事件标签 规则或人工小样本 真实世界疗效感知研究

§2.4 患者人群表

维度 描述
来源 Drugs.com 注册用户自愿发布的公开评论
时间范围 2008-02-25 至 2017-12-12
年龄 官方未披露
性别 官方未披露(避孕类评论以女性用药经验为主)
种族/民族 官方未披露
地域 全球英语用户社区,官方未披露精确地理分布
就医类型 自选样本:自我用药管理、慢病长期治疗、避孕等情境的主动评论者

§2.5 临床价值

对患者叙事文本的结构化建模提供三方面临床价值。第一,疗效感知的量化补充:随机对照试验报告的是人工筛选人群下的疗效终点,而评论语料反映真实用药人群的长期体验,两者互补。第二,药物警戒的信号源:上市后副作用的上报渠道历来被动,评论区的大规模叙事可以在正式流行病学调查前提供线索(仅作信号,不作因果结论)。第三,医患沟通素材:分析患者最关心的方面(副作用、起效时间、价格),帮助临床沟通与用药教育内容的设计。

§2.6 金标准与标注方式

维度 描述
标签来源 评论作者自报评分 rating(1-10 整数),非独立专家标注
标注方式 自报/众包式弱监督;usefulCount 为社区读者投票聚合
标注者资质 评论作者本人(患者或照护者),无医学标注资质要求
一致性评估 不适用(无重复标注协议)
官方划分 约 75/25 随机划分:训练 161,297 / 测试 53,766
数据性质 弱监督文本分类语料;标签与文本天然对齐但含主观噪声

§3 数据集规格

§3.0 版本抉择矩阵

本数据集存在多个获取渠道,内容同源但格式与打包方式不同:

你的需求 推荐版本 大小 理由
论文复现、保证可追溯 UCI 原始 TSV(ID 462) 约 109.7 MB 官方出处 + DOI 10.24432/C5SK5S + 官方 75/25 划分
快速实验、交互式分析 Kaggle 镜像 CSV 约 110 MB 与 Kaggle Notebook 原生集成,一行 API 下载
大规模训练、现代化管线 Hugging Face Hub 社区 Parquet 镜像 约 67 MB 列式存储 + datasets 库流式加载
需要副作用/有效性有序标签 Druglib.com 姊妹语料(UCI ID 461) 小规模 4,143 条 8 字段,含 5 级 sideEffects 与 effectiveness(注意:本数据集无此二字段)

§3.1 模态详情

单一模态:英文自由文本评论,平均长度数十词,包含_HTML 实体_(如 ')、药品名首字母大写、口语化表达与拼写变体。文本旁附带三个结构化锚点,各自承担不同建模角色:

锚点字段 形态 建模角色 使用注意
rating 1-10 整数,作者自报 主标签:二分类/有序回归/多分类 双峰分布(坑点 6)
condition 作者自选疾病/情境标签,约 708 类 分层维度、子群评估 爬虫噪声与 1,194 条缺失(坑点 5)
usefulCount 0-949 整数,读者投票累积 辅助信号、排序学习 时间累积构成泄漏(坑点 2)

date 字段(发布日期)使本数据集天然具备时间维度,可做时间感知划分与漂移分析。

§3.2 按子集样本数

子集 样本数 占比 说明
训练集 drugsComTrain_raw.tsv 161,297 75.0% 官方随机划分
测试集 drugsComTest_raw.tsv 53,766 25.0% 官方随机划分
合计 215,063 100% —
训练集正类(rating>5) 113,209 70.2% 二分类视角
训练集负类(rating≤5) 48,088 29.8% 正负比约 2.35:1

§3.3 数据格式

格式 提供方 文件 说明
TSV UCI 官方 drugsComTrain_raw.tsv、drugsComTest_raw.tsv 制表符分隔,评论文本含未转义引号
CSV Kaggle 镜像 train.csv/test.csv(内容同源) 逗号分隔打包
Parquet Hugging Face 社区镜像 多个数据卡托管 列式存储,压缩后约 67 MB

§3.4 存储大小

UCI 官方压缩包解压后两个 TSV 共约 109.7 MB(训练 82.3 MB + 测试 27.4 MB)。加载至 pandas 内存占用约 1-2 GB(含文本列),16 GB 内存的普通工作站即可全量处理;全量 BERT 微调的显存需求见 §6.8。

§3.5 标注方式

本数据集没有传统意义上的人工标注环节:rating 即标签,由评论作者在发布时自报(1-10 整数),属于自报弱监督。usefulCount 是第二种弱信号:其他读者对评论投出的"有用"票数,属于聚合式社区反馈,与评论发布时长强相关(详见坑点 2)。condition 是作者自选的情境标签,无受控词表约束。三种"标注"均为真实行为产物而非受控标注协议,这是使用时必须理解的基本性质。

§3.6 标注者资质与一致性

标注者即评论作者本人:患者、照护者或用药经历分享者,无医学资质门槛,无标注指南,无一致性指标(如 Cohen’s κ)可计算。对机器学习任务而言这意味着:标签噪声不可忽略(主观评分波动大),但标签与文本天然对齐(同一人写的文本与评分),适合自监督/弱监督范式,不适合当作金标准标签库。

§3.7 采集周期

2008-02-25 至 2017-12-12,近十年连续采集(Kaggle 镜像)。评论按时间自然分布,无明显断档。时间维度上的三点观察:

观察点 说明 建模含义
窗口两端 2008 年初与 2017 年末均有评论分布 可支持时间外推评估
后期占比 2015 年后评论量相对更高 随机划分中近期评论占比更大
药品代际 各药品评论量随上市时间起伏 长尾药品的时间覆盖不均匀

时间字段可用于时间感知划分(见 §5.3)。

§3.8 地域覆盖

Drugs.com 是面向全球英语用户的药品信息网站,评论者以美国用户为主,同时覆盖其他英语国家与非英语国家的英语使用者。官方未披露评论者的地理分布、年龄、性别等人口统计信息,任何关于人群代表性的推断都应保守。

§3.9 设备规格

不适用。纯文本数据集,无传感器、影像或波形设备信息。

§3.10 深度溯源链

完整溯源链:Drugs.com 网站公开评论区(原始信息源,患者自评)→ Surya Kallumadi 与 Felix Gräßer 爬取整理(2018 年,形成 7 字段表格)→ UCI 机器学习仓库 ID 462(官方托管,2018 年收录,2023 年获配 DOI 10.24432/C5SK5S)→ 社区镜像(Kaggle KUC Hackathon Winter 2018、Hugging Face Hub 多个 Parquet 数据卡)。中间无任何脱敏加工环节的公开记录(数据本身不含直接标识符,见 §7.4)。

§4 数据结构

§4.0 目录树

从 UCI 下载 drug+review+dataset+drugs+com.zip 并解压后:

drug+review+dataset+drugs+com/
├── drugsComTrain_raw.tsv      # 训练集,161,297 条,约 82.3 MB
└── drugsComTest_raw.tsv       # 测试集,53,766 条,约 27.4 MB

无 README、无官方脚本、无版本清单——这正是 AI 就绪度评分为 4 星而非 5 星的直接原因。

§4.1 DAIMS 字段字典

字段名 类型 说明 示例值 AI 用途 观测误差 信息性缺失编码 取值范围
uniqueID Integer 行级唯一标识,无患者含义 165661 索引、去重键 无 无缺失 非连续整数
drugName Text 药品名(首字母大写) Levonorgestrel 分组、分层抽样、跨药品泛化 拼写变体少量存在 无缺失 数千种药品,长尾分布
condition Text 作者自选疾病/用药情境 Birth Control 分层、按病种分析 爬虫噪声 + 缺失(见坑点 5) 缺失即空值(无特殊编码) 约 708 类(含噪声)
review Text 评论文本,含 HTML 实体 “I have only been…'” 主输入模态,情感/ABSA/ADR 抽取 HTML 实体、口语拼写 无缺失 数十至数百词
rating Integer 作者自报评分(标签) 10 主标签:二分类或多分类 主观性强、双峰 无缺失 1-10
date Date 评论发布日期 2016-05-18 时间划分、漂移分析 无 无缺失 2008-02-25 至 2017-12-12
usefulCount Integer 读者"有用"票数(累积) 27 辅助信号、排序学习;勿当标签直接用 随时间累积(泄漏源,见坑点 2) 无缺失 0-949

§4.2 标签分布

rating 为最常用标签。其分布呈典型的 J 型双峰:高频值集中于 10、9、1、8,中间分值(4-6)稀疏——患者要么非常满意、要么非常不满,中性评论少。下表为相对水平(以各分值评论量为"高/中/低"定性描述,精确计数请以实际数据统计为准):

rating 相对水平 说明
10 高 最高频分值之一,满意端峰值
9 高 满意端次峰
8 高 满意端第三位
7 低 过渡区稀疏
5-6 低 中性区稀疏
2-3 低 不满端过渡区
1 高 不满端峰值

据此,社区惯例把任务简化为二分类(rating>5 为正类):训练集 113,209 条正类 vs 48,088 条负类(约 2.35:1);若做 10 分类则中间类别样本极少,需要重加权处理(见坑点 6)。

§4.3 关键统计

统计项 数值 来源
时间跨度 2008-02-25 至 2017-12-12 多源 EDA 交叉核实
唯一 condition 数 约 708 个(含爬虫噪声字符串) 多源 EDA 交叉核实
Top 10 condition Birth Control、Depression、Pain、Anxiety、Acne、Bipolar Disorder、Insomnia、Weight Loss、Obesity、ADHD 多源 EDA 交叉核实
头部药品 Levonorgestrel、Etonogestrel(均为避孕药) 多源 EDA 交叉核实
满分评论聚集 rating=10 评论约 1,883 条高度集中于少数药品 多源 EDA 交叉核实
最大"药品-差评"聚集 miconazole 的 rating=1 评论约 767 条 多源 EDA 交叉核实
usefulCount 范围 0-949,中位数低、右尾极长 多源 EDA 交叉核实
condition 缺失 训练 899 条(0.557%)、合计 1,194 条 多源 EDA 交叉核实

药品分布呈典型长尾:头部避孕药凭借"月度复购式"使用场景积累大量评论,而绝大多数药品只有个位数到数十条评论——这直接决定了 §5.4 的分层抽样与 GroupKFold 建议。

§4.4 数据层级

扁平单表结构,层级为 行(评论)→ 药品(drugName)→ 疾病条件(condition)。没有患者主键:uniqueID 仅标识行,同一用户的多条评论无法关联(除非文本完全相同)。因此:不能做患者级切分、不能计算"同一患者跨时间"特征,所有"患者层面"的结论都只能以评论为近似单位——这是与 MIMIC-III 这类以患者为主键的院内数据集最本质的结构差异。

§4.5 缺失值与信息性缺失

字段 缺失情况 处理建议
condition 训练集 899 条(0.557%)、合计 1,194 条为空 保留为独立类别 “Unknown” 或按 drugName 回填;勿直接删行
其余 6 字段 官方与主流 EDA 未报告缺失 加载后仍建议全表断言校验

数据集不使用任何信息性缺失编码(如 -999);condition 缺失即真正的空值。注意"缺失"与"噪声"是两类不同问题:condition 列还存在爬虫混入的伪值(见坑点 5),数量级大于真实缺失。加载后的最小断言校验:

def assert_schema(df: pd.DataFrame, name: str) -> None:
    expected = {"uniqueID", "drugName", "condition", "review",
                "rating", "date", "usefulCount"}
    assert expected.issubset(df.columns), f"{name} 缺少预期列"
    assert df["uniqueID"].is_unique, f"{name} uniqueID 重复"
    assert df["rating"].between(1, 10).all(), f"{name} rating 越界"
    assert df["review"].notna().all(), f"{name} review 出现缺失"

assert_schema(train, "train")
assert_schema(test, "test")

§5 划分与使用建议

§5.1 官方划分

官方提供且唯一受 UCI 页面支持的划分:训练 161,297 条 / 测试 53,766 条,约 75/25 随机划分。官方未说明随机种子,社区无法精确重建该划分,因此任何需要严格可比性的论文都应直接使用官方文件,而非自行随机重划。

划分 文件 行数 用途
训练集 drugsComTrain_raw.tsv 161,297 训练 + 内部验证
测试集 drugsComTest_raw.tsv 53,766 最终评估

§5.2 社区惯例划分

惯例 做法 适用场景
官方划分 + 内部验证集 官方 train/test,训练集再切 5-10% 作验证 论文复现、最常见
5 折交叉验证 训练集内随机 5 折,报均值±标准差 竞赛、教学
80/10/10 重划 全量重新随机划分 不要求对齐官方划分的探索

无论采用哪种惯例,建议在结果中明确声明划分方式——本数据集社区成绩差异的最大来源之一就是划分不统一。

§5.3 划分策略与泄漏风险(重点)

本数据集至少有四个泄漏通道,按危险度排序:

  1. 重复文本跨划分:相同评论文本以不同 uniqueID 同时出现在 train 与 test 中,随机划分下模型"背过"了测试答案(见坑点 3)。
  2. usefulCount 时间累积:usefulCount 反映评论发布至今的累计投票,属于"未来信息"(见坑点 2)。
  3. 同一药品跨划分:同一 drugName 的评论同时出现在两侧,模型可依赖药品级捷径特征;若研究目标是跨药品泛化,必须 GroupKFold(按 drugName 分组)。
  4. 时间外推未评估:随机划分高估了面向未来的真实场景;严肃评估应补充按 date 的时间划分(如 2017 年评论作测试)。

§5.4 交叉验证建议

  • 通用情感/评分任务:官方划分 + 训练集 5 折 CV(随机分组),同时报告官方测试集成绩。
  • 跨药品泛化:GroupKFold(groups=drugName),或按药品集合做 leave-some-drugs-out。
  • 时间鲁棒性:以 date 排序,早期训练、后期测试(如 2008-2016 训练、2017 测试),并检查 usefulCount 是否已从特征中移除。

§5.5 外部验证建议

首选姊妹语料 Druglib.com(UCI ID 461):源论文已验证 Drugs.com → Druglib.com 的跨域迁移可行性,两者字段高度对齐但站点、评分分布与文本风格不同,是天然的域外测试集。次选 CADEC 等 ADR 标注语料(任务层面对齐副作用抽取)。避免仅在随机重划分上反复验证——那衡量的是方差而非泛化。

§6 AI 就绪指南

§6.0 云端快速启动

数据集原生托管于 Kaggle,用 Kaggle Notebook 是零配置起点(免费 GPU 即可完成 BERT 微调):

# 在 Kaggle Notebook 中:右侧面板 Add Input → 搜索
# "KUC Hackathon Winter 2018"(jessicali9530/kuc-hackathon-winter-2018)
# 挂载后数据位于 ../input/kuc-hackathon-winter-2018/drugsComTrain_raw.csv
import pandas as pd
train = pd.read_csv(
    "../input/kuc-hackathon-winter-2018/drugsComTrain_raw.csv",
    quoting=3,  # QUOTE_NONE:评论文本含未转义引号,默认解析会报错(见坑点 8)
)
print(train.shape)  # 预期 (161297, 7)

§6.1 快速上手

下面给出本地最小可用路径。目录结构预期:把 UCI 解压出的两个 TSV 放在 data_root 指向的目录下,代码用 os.path.join(data_root, 文件名) 拼接;最小可用子集可先用 head -n 20000 截取训练集做管线联调:

# 前置约定:data_root/ 下有 drugsComTrain_raw.tsv 与 drugsComTest_raw.tsv
# (UCI 官方 zip 解压产物;Kaggle 用户改用 csv 文件并把 sep 换成 ",")
import os
import html
import pandas as pd

data_root = "data/drug+review+dataset+drugs+com"  # ← 改成你的解压目录

# quoting=3 (csv.QUOTE_NONE) 是读取本数据集的必要参数,原因见坑点 8
train = pd.read_csv(
    os.path.join(data_root, "drugsComTrain_raw.tsv"),
    sep="\t", quoting=3, engine="python",
)
test = pd.read_csv(
    os.path.join(data_root, "drugsComTest_raw.tsv"),
    sep="\t", quoting=3, engine="python",
)
print(train.shape, test.shape)  # 预期 (161297, 7) (53766, 7)

# 第一步清洗:还原 HTML 实体(' → ' 等),见坑点 1
for df in (train, test):
    df["review"] = df["review"].astype(str).map(html.unescape)

# 最小二分类标签:rating>5 为正类
train["label"] = (train["rating"] > 5).astype(int)
print(train["label"].value_counts(normalize=True))  # 约 0.70 / 0.30

§6.2 数据获取

渠道 链接 内容 大小 前置条件
UCI 官方 UCI ID 462 页面 drug+review+dataset+drugs+com.zip(两个 TSV) 解压后约 109.7 MB 无(CC BY 4.0,无需注册)
Kaggle 镜像 KUC Hackathon Winter 2018 train.csv / test.csv 约 110 MB Kaggle 账号
Hugging Face HF Hub 搜索 “drug review” 多个社区 Parquet 数据卡 约 67 MB 无
姊妹语料 UCI ID 461(Druglib.com) 4,143 条、8 字段 小 无

Kaggle API 下载:

# 先 pip install kaggle 并在 ~/.kaggle/kaggle.json 配置 API token
kaggle datasets download -d jessicali9530/kuc-hackathon-winter-2018
unzip kuc-hackathon-winter-2018.zip -d data/drug-reviews-kaggle

§6.3 预处理全流程

生产级预处理五步:格式统一 → HTML 还原 → condition 清洗 → 去重 → 标签派生与转换。核心流程(30 行内):

import html
import pandas as pd

def load_split(path: str) -> pd.DataFrame:
    df = pd.read_csv(path, sep="\t", quoting=3, engine="python")
    df["review"] = df["review"].astype(str).map(html.unescape)   # 1. HTML 还原
    df["date"] = pd.to_datetime(df["date"], errors="coerce")
    return df

def clean_condition(df: pd.DataFrame) -> pd.DataFrame:
    # 2. condition 清洗:剔除爬虫噪声(含 </span>、数字开头的伪值),空值归为 Unknown
    mask_noise = df["condition"].astype(str).str.contains("</span>", na=False)
    df.loc[mask_noise, "condition"] = pd.NA
    df["condition"] = df["condition"].fillna("Unknown")
    return df

def dedup(df: pd.DataFrame) -> pd.DataFrame:
    # 3. 去重:同一 drugName+review 文本只保留一条(防泄漏,见坑点 3)
    return df.drop_duplicates(subset=["drugName", "review"], keep="first")

def add_labels(df: pd.DataFrame) -> pd.DataFrame:
    df["label"] = (df["rating"] > 5).astype(int)                 # 4. 二分类标签
    df["usefulCount"] = df["usefulCount"].clip(lower=0)          # 5. 仅作辅助信号
    return df

若需完整的 Parquet 转换 + GroupKFold 分组键生成 + 时间划分脚本,展开下方代码块:

<details>
<summary>完整预处理与划分脚本(约 40 行)</summary>

import numpy as np
import pandas as pd
from sklearn.model_selection import GroupKFold

def build_dataset(data_root: str) -> dict[str, pd.DataFrame]:
    train = dedup(clean_condition(load_split(f"{data_root}/drugsComTrain_raw.tsv")))
    test = dedup(clean_condition(load_split(f"{data_root}/drugsComTest_raw.tsv")))
    train, test = add_labels(train), add_labels(test)
    # 列式存储:文本数据集转 Parquet 可明显压缩体积并加速二次加载
    train.to_parquet(f"{data_root}/train.parquet", index=False)
    test.to_parquet(f"{data_root}/test.parquet", index=False)
    # 跨药品泛化的分组键:同药不跨折
    train["drug_group"] = train["drugName"].str.lower().str.strip()
    gkf = GroupKFold(n_splits=5)
    train["fold"] = -1
    for fold, (_, val_idx) in enumerate(
        gkf.split(train, groups=train["drug_group"])
    ):
        train.iloc[val_idx, train.columns.get_loc("fold")] = fold
    # 时间划分(补充评估):2017-06 之后的评论作时间外推测试集
    cutoff = pd.Timestamp("2017-06-01")
    train["time_split"] = np.where(train["date"] >= cutoff, "late", "early")
    return {"train": train, "test": test}

</details>

§6.4 PyTorch DataLoader

情感二分类的完整可运行示例(pip install torch transformers pandas pyarrow):

<details>
<summary>Dataset 类 + tokenizer + DataLoader 完整代码(约 45 行)</summary>

import html
import pandas as pd
import torch
from torch.utils.data import Dataset, DataLoader
from transformers import AutoTokenizer

class DrugReviewDataset(Dataset):
    """一条评论一个样本:review 为输入,rating>5 派生二分类标签。
    目录预期:data_root/drugsComTrain_raw.tsv(UCI 官方 TSV)。"""

    def __init__(self, tsv_path: str, tokenizer, max_len: int = 256):
        # quoting=3 必读参数,见坑点 8
        df = pd.read_csv(tsv_path, sep="\t", quoting=3, engine="python")
        df["review"] = df["review"].astype(str).map(html.unescape)
        self.texts = df["review"].tolist()
        self.labels = (df["rating"] > 5).astype(int).tolist()
        self.tok, self.max_len = tokenizer, max_len

    def __len__(self):
        return len(self.texts)

    def __getitem__(self, idx):
        enc = self.tok(
            self.texts[idx], truncation=True, max_length=self.max_len,
            padding="max_length", return_tensors="pt",
        )
        return {
            "input_ids": enc["input_ids"].squeeze(0),
            "attention_mask": enc["attention_mask"].squeeze(0),
            "label": torch.tensor(self.labels[idx], dtype=torch.long),
        }

tok = AutoTokenizer.from_pretrained("bert-base-uncased")
train_ds = DrugReviewDataset("data/drug+review+dataset+drugs+com/drugsComTrain_raw.tsv", tok)
val_ds = DrugReviewDataset("data/drug+review+dataset+drugs+com/drugsComTest_raw.tsv", tok)

train_loader = DataLoader(train_ds, batch_size=32, shuffle=True, num_workers=4)
val_loader = DataLoader(val_ds, batch_size=64, shuffle=False, num_workers=4)

</details>

训练目标侧接一个 nn.Linear(768, 2) 头、交叉熵(可配类权重)即可起步。下面给出与上述 DataLoader 对接的最小训练循环:

import torch
import torch.nn as nn
from transformers import AutoModel

class RatingClassifier(nn.Module):
    """BERT 编码 + 线性分类头,用于 rating>5 二分类。"""

    def __init__(self, model_name: str = "bert-base-uncased"):
        super().__init__()
        self.encoder = AutoModel.from_pretrained(model_name)
        self.head = nn.Linear(self.encoder.config.hidden_size, 2)

    def forward(self, input_ids, attention_mask):
        pooled = self.encoder(
            input_ids=input_ids, attention_mask=attention_mask
        ).pooler_output
        return self.head(pooled)

device = "cuda" if torch.cuda.is_available() else "cpu"
model = RatingClassifier().to(device)
optimizer = torch.optim.AdamW(model.parameters(), lr=2e-5)
criterion = nn.CrossEntropyLoss()  # 可改 weighted:按 1/类频率设置 weight

for epoch in range(3):
    model.train()
    for batch in train_loader:
        batch = {k: v.to(device) for k, v in batch.items()}
        logits = model(batch["input_ids"], batch["attention_mask"])
        loss = criterion(logits, batch["label"])
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

§6.5 八个必踩的坑

⚠️ 坑点 1:评论文本里的 HTML 实体没有还原(分类:预处理陷阱)

问题:Drugs.com 原始页面把引号、连字符等编码为 &#039;、&quot; 等实体后存入 TSV,直接分词会让 BERT 词表把这些序列拆成无意义子词,污染语义表征并影响重复文本判定。
症状:样本中出现大量 “'”、“"” 字符串;基于文本的去重(坑点 3)漏报重复;同一评论在清洗前后 token 长度差异明显。
解决:

  1. 简单方法:df["review"] = df["review"].map(html.unescape)(标准库即可覆盖绝大多数实体)。
  2. 进阶方法:html.unescape 之后再跑一遍 BeautifulSoup(text, "lxml").get_text(),兜底残余标签与转义。
  3. SOTA 方法:把"清洗后文本哈希"作为数据集版本指纹(如 SHA-1),持久化到 Parquet 元数据,保证所有实验基于同一清洗视图。
    参考:Kaggle 数据集页多个高赞 EDA notebook 均以此作为第一步。

⚠️ 坑点 2:usefulCount 是"未来信息",随机划分下构成时间泄漏(分类:数据泄漏)

问题:usefulCount 是评论发布后随时间持续累积的读者投票数。一条 2008 年的评论天然比 2017 年的评论有更多积累时间;把 usefulCount 作为特征预测 rating 时,模型会学到"老评论/高曝光评论→某评分"的捷径,而部署时根本拿不到评论发布之后才产生的投票。
症状:加入 usefulCount 后验证集指标显著虚高;按时间切分后同一模型性能骤降;特征重要性分析中 usefulCount 名列前茅。
解决:

  1. 简单方法:纯文本任务直接移除该特征。
  2. 进阶方法:需要使用时,按评论年龄归一(如 usefulCount / (评论发布至采集截止的天数)),或只用采集窗口内的历史投票。
  3. SOTA 方法:做时间划分敏感性分析(2008-2016 训练、2017 测试),报告含/不含 usefulCount 两个版本的结果,量化泄漏贡献。
    参考:源论文 Gräßer et al., 2018, ACM DH '18(DOI 10.1145/3194658.3194677)对时间维度的讨论。

⚠️ 坑点 3:完全相同的评论文本同时出现在 train 与 test(分类:数据泄漏)

问题:215,063 条评论来自真实用户,存在复制粘贴、模板化差评(同一人对同类药品发相似内容)等情况;官方随机划分按行切分,相同文本会同时落入两侧,测试集成绩被"背题"抬高。
症状:drop_duplicates(subset=["review"]) 后行数明显少于 215,063;对测试集逐条查询训练集中完全相同文本命中数大于 0;去重后模型指标下降(这才是诚实成绩)。
解决:

  1. 简单方法:在合并两份文件后按 review 全文(清洗+小写化后)去重,再按官方 uniqueID 对齐回 train/test。
  2. 进阶方法:train["dup_in_test"] = train["review"].isin(test["review"]),报告"去泄漏成绩"与原始成绩两套指标。
  3. SOTA 方法:以 MinHash/SimHash 找近重复(不只是完全相同),按近重复连通分量做分组切分。
    参考:Kaggle 社区对评论重复文本的 EDA 讨论;坑点 1 的文本归一化是本坑去重的前提。

⚠️ 坑点 4:双峰 + 不平衡分布下用 accuracy 挑模型(分类:评估误用)

问题:二分类正负比约 2.35:1,且各条件类别高度不均衡;accuracy 对多数类敏感——模型把避孕类满分评论的常见措辞学成"永远好评"即可拿到看起来不错的成绩,掩盖了对差评(恰恰是药物警戒最关心的部分)的低召回。
症状:accuracy 与 macro-F1 差距大;混淆矩阵中负类召回率远低于正类;换划分后指标波动剧烈。
解决:

  1. 简单方法:报 macro-F1 与每类 P/R,外加 ROC-AUC。
  2. 进阶方法:训练时用类加权交叉熵(权重取 1/类频率)或 focal loss;阈值按验证集 F1 搜索而非默认 0.5。
  3. SOTA 方法:按 condition 分层报告子群指标(如抑郁 vs 避孕),确保没有单一条件主导整体分数。
    参考:Chaudhary et al., 2025, J. Data Sci. Intell. Syst. 在本数据集上的多指标评估实践。

⚠️ 坑点 5:condition 列混入爬虫噪声与缺失(分类:预处理陷阱)

问题:condition 由作者在前端选择,但爬虫把部分页面元素一并抓了下来——形如 “3</span> users found this comment helpful” 的字符串出现在 condition 字段中;另有合计 1,194 条 condition 缺失(训练 899 条)。
症状:condition 唯一值统计出现几百个"只有 1 条样本"的怪异长尾;value_counts() 头部之外全是 HTML 残片;下游按 condition 分层时出现大量垃圾子群。
解决:

  1. 简单方法:过滤含 “</span>” 或以数字开头的取值,连同空值统一映射为 “Unknown”。
  2. 进阶方法:维护白名单(仅保留频次超过阈值、可对齐药品适应证词典的条件),其余归 “Other”。
  3. SOTA 方法:用 LLM 或规则把噪声值映射回标准疾病词表(ICD-11/SNOMED,见 §2),并输出映射审计日志。
    参考:UCI 官方页字段说明与社区 EDA。

⚠️ 坑点 6:rating 是双峰主观分,别当连续值回归(分类:标签理解)

问题:rating 集中在 1 与 9-10 两端、中间分值稀疏。把它当连续目标做 MSE 回归时,模型倾向于预测均值附近(约 7-8),既不符合分布也产生大量离谱误差;当 10 分类做时中间类样本不足。
症状:回归预测值集中在 7.5 附近;10 分类中 4-6 类的召回接近 0;有序关系的忽视导致"9 分与 1 分"错误代价等同。
解决:

  1. 简单方法:二分类(rating>5)或三分类(好评/中评/差评)。
  2. 进阶方法:有序回归(ordinal regression / CORAL),保留分数的有序结构。
  3. SOTA 方法:分层预测——先预测"满意/不满意",在差评子流上再细方面建模(与 ABSA 管线衔接)。
    参考:源论文 Gräßer et al., 2018 的方面级设定,以及 §4.2 分布表。

⚠️ 坑点 7:自选样本 ≠ 患者总体,结论禁止外推(分类:偏倚陷阱)

问题:评论者是主动上网写长评的人群,与真实用药人群在年龄、数字素养、疾病严重度上系统性不同;同一药品的评论量还受市场热度影响。把"评论中的副作用提及率"当成"人群副作用发生率"是本数据集最常见误用。
症状:某药品好评率与临床疗效文献明显冲突;避孕类评论占比远超疾病流行率应有的水平(写作动机与评论便利驱动)。
解决:

  1. 简单方法:所有结论加"评论人群"限定语,不与流行病学率混写。
  2. 进阶方法:按 condition 与年份对照外部参照(如处方统计)做倾向性讨论。
  3. SOTA 方法:把本数据集定位为"信号生成",用正式数据库(FAERS 等)做信号确认后再下结论。
    参考:源论文与药物警戒方法学文献对社交媒体信号定位的共识(Nikfarjam et al., 2015, JAMIA)。

⚠️ 坑点 8:TSV 里有未转义引号,pandas 默认参数直接报错(分类:工程陷阱)

问题:官方 TSV 的评论文本包含大量未转义的 ",pandas 默认引号解析会把这些位置当字段边界,触发 ParserError 或行错位;同时药品名长尾分布,随机抽样小批量时罕见药品完全缺席。
症状:pd.read_csv(...) 报 “Error tokenizing data” 或训练/测试列数不一致;抽 1,000 条统计 drugName 覆盖度时头部 20 种药品占了 90% 以上。
解决:

  1. 简单方法:pd.read_csv(path, sep="\t", quoting=3, engine="python")(quoting=3 即 QUOTE_NONE)。
  2. 进阶方法:转换成 Parquet 后统一用 pyarrow 读取;大内存不足时分块(chunksize=100_000)流式处理。
  3. SOTA 方法:分层抽样按 (condition, rating) 组合采样构建子集,保证小数据集也覆盖长尾类别。
    参考:Kaggle 数据集页讨论区与多个 EDA notebook 的读取参数实践。

§6.6 数据增强

  • ✅ 安全:EDA 式同义替换/随机删除(按 token 概率扰动)、回译(英→法→英)、同义药效短语替换后保持标签不变的验证式增强;对差评类做上采样缓解 2.35:1 不平衡。
  • ❌ 危险:直接替换药品名(会破坏"药品-适应证-体验"的语义绑定,制造不存在于现实的组合);跨标签复制文本;把 usefulCount 高的文本复制多次(注入时间泄漏)。

验证增强有效性的最小流程:固定同一验证集(不增强)→ 每次只开启一种增强 → 对比 macro-F1 变化;多种增强叠加前先确认单项增益为正。

# 负类上采样示例(仅在训练集内做,验证/测试集永不增强)
neg = train_df[train_df["label"] == 0]
pos = train_df[train_df["label"] == 1]
upsampled = pd.concat([pos, neg, neg], ignore_index=True)  # 简单复制放大约 1 倍负类
upsampled = upsampled.sample(frac=1.0, random_state=42)    # 洗牌

§6.7 模型推荐

模型 适用任务 起步成本 说明
TF-IDF + LinearSVC/LightGBM 快速基线 极低 数十分钟出基线,社区报告约 83%-89% acc
BERT-base 情感二分类/ABSA 中 学术与工业主流选择,本数据集上的常客
DistilBERT 资源受限部署 中 精度损失很小(社区报告约 86.6%),推理快一倍
Bio+Clinical BERT(如 BioBERT 系) 医疗域迁移 中 用医疗语料预训练权重初始化,跨域任务上更稳
LLM 微调/LoRA 方面级抽取、多任务 高 ABSA 的"方面词+极性"联合建模收益明显

§6.8 硬件需求

场景 显存/内存 说明
全表 pandas 分析 约 2 GB 内存 普通笔记本可行
TF-IDF + 线性模型基线 无 GPU 要求 CPU 数十分钟
BERT-base 微调(batch 32,max_len 256) 约 10-12 GB 显存 免费 Colab T4 / Kaggle P100 可跑
全量 3 epoch BERT 微调 1-3 小时(单卡) 215k 条规模完全在单卡射程内

§6.9 评估指标代码

import numpy as np
from sklearn.metrics import (
    accuracy_score, f1_score, roc_auc_score,
    classification_report, confusion_matrix,
)

def evaluate(y_true, y_prob, threshold: float = 0.5) -> dict:
    y_pred = (y_prob >= threshold).astype(int)
    report = {
        "accuracy": accuracy_score(y_true, y_pred),
        "macro_f1": f1_score(y_true, y_pred, average="macro"),  # 双峰不平衡下的主指标
        "auc": roc_auc_score(y_true, y_prob),
    }
    # 按 condition 分层抽查,防止单一条件主导整体分数(见坑点 4)
    print(classification_report(y_true, y_pred, digits=4))
    print(confusion_matrix(y_true, y_pred))
    return report

§6.10 MLOps 笔记

  • 数据版本化:清洗规则(HTML 还原、噪声过滤、去重阈值)一旦变更即产生新数据视图;建议用 DVC/Parquet 快照加哈希指纹,保证全部实验可追溯到同一清洗版本。
  • 漂移监控:上线后按月监控评论长度分布、rating 均值与药品分布的偏移;十年跨度语料(2008-2017)与当下药品格局已有代际差(GLP-1 类、新型抗抑郁药),定期用新评论做时间外推评估。
  • 可复现性:固定官方划分文件 + 随机种子 + transformers 版本;跨划分泄漏(坑点 3)修复与否必须写进实验记录。
  • 合规留痕:CC BY 4.0 要求署名——在模型卡与数据卡中固定引用 UCI DOI 10.24432/C5SK5S。
  • 成本控制:文本平均长度在 BERT 的 256 token 截断窗口内,无需长文档模型;全量训练单卡数小时,优先把算力花在清洗消融(有/无泄漏修复)而非模型放大上。

§7 质量评估与局限性

§7.1 已知偏倚

偏倚类型 描述 严重程度 缓解措施
自选样本偏倚 评论者是主动上网分享的人群,非患者总体随机样本;写作动机(极满意/极不满)放大两端 高 结论限定"评论人群";与外部参照对照讨论(坑点 7)
condition 不平衡 Birth Control、Depression、Pain 等少数条件主导样本分布,长尾条件样本稀少 高 分层抽样、宏平均指标、长尾条件单独评估
评分两极化 rating 双峰集中于 1 与 9-10,中段稀疏 中 二分类/有序回归替代 10 分类(坑点 6)
市场热度偏倚 药品评论量与当时市场曝光相关,不反映使用规模 中 按药品归一化;引证时注明评论量≠处方量
语言与地域偏倚 仅英语评论,以美国用户为主 中 跨语言结论需外部数据支持
爬虫噪声 condition 混入 HTML 残片、review 含 HTML 实体 低 §6.3 清洗流程(坑点 1、5)

§7.2 标注质量

rating 与 review 由同一作者同时产出,标签-文本对齐度高但客观性有限:评分反映个人主观体验,受期望管理、副作用敏感度与情绪影响。无标注指南、无多人标注、无可计算的一致性系数。

质量维度 状态 对建模的影响
标签-文本对齐 高(同一作者同时产出) 文本蕴含的立场与标签大体一致
标签客观性 低(纯主观自报) 相邻分数差异不可靠,宜粗粒度化
一致性指标 不可计算(无重复标注) 无法报告 κ,跨论文标签噪声水平未知
社区信号 usefulCount 聚合可得 可作质量加权,但含时间累积偏倚

实践建议:把 rating 当作"作者立场的代理标签"而非"疗效金标准";在药物警戒用途中只把负面评分评论当作待人工复核的信号源,而非结论。

§7.3 泛化性

目标场景 失效风险 证据
迁移到 Druglib.com 评论 中:站点、评分分布与文本风格不同,跨域性能下降 源论文 DH '18 以跨域/跨数据学习为核心议题并验证了迁移可行性
外推到 2018 年后新药 高:评论截止 2017-12-12,新药与新型疗法完全缺位 时间跨度字段直接可见;GLP-1 类药品时代未覆盖
迁移到非英语社区 高:语言、医疗体系与表达习惯差异 语料本身仅含英语评论
面向临床决策 不可用:自选样本与主观评分不构成临床证据 §7.1 偏倚分析;仅可作为信号生成输入

§7.4 伦理

数据不含姓名、账号、地理坐标等直接标识符,uniqueID 为匿名行级编号,官方未记录额外去标识化加工过程。但评论内容本身是作者主动公开的自述健康经历,按研究伦理惯例仍应按健康相关敏感文本处理:不做作者重识别尝试(如文本指纹去匿名化)、不在展示示例中直接引用含强个人信息的原文。发布方以 CC BY 4.0 许可,使用时须署名(§9 引用指南)。YMYL 提示:任何基于本数据集的模型输出都不得用于个体用药决策。

§7.5 公平性

  • 性别:官方未披露作者性别;占比最高的 Birth Control 条件下评论以女性用药经验为主,直接训练"通用药品评论理解"模型会隐含性别语境偏移。
  • 年龄与种族:官方未披露,无法评估代表性与 subgroup 性能,任何公平性结论只能到"未知"层面。
  • 疾病覆盖:精神科与自我管理型疾病主导,罕见病与住院场景疾病近乎缺位,模型在后者上不可信。
  • 缓解建议:按 condition 做 subgroup 评估(至少覆盖 Top 10 条件),报告各子群 F1 而非只报总体。
# 最小子群公平性检查:各高频 condition 的 macro-F1
top_conditions = df["condition"].value_counts().head(10).index
for cond in top_conditions:
    sub = df[df["condition"] == cond]
    f1 = f1_score(sub["label"], sub["pred"], average="macro")
    print(f"{cond:<25} n={len(sub):>6}  macro-F1={f1:.4f}")

§7.6 数据漂移

语料窗口止于 2017-12:此后上市的药品(如新一代减重与肿瘤疗法)、平台界面与评分习惯的变化都不在分布内。SS(2017-2026)间药品舆论环境(社交媒体、直接面向消费者的广告)也发生了明显演化。上线模型应按月监控评论长度、rating 均值与药品分布的偏移,并以滚动新数据做时间外推评估(§5.4)。

§7.7 DAIMS 24 项评估

# 检查项 状态 说明
1 宽格式 ✅ 单表宽格式,7 列一行一评论
2 唯一标识 ✅ uniqueID 行级唯一,可作主键
3 特殊字符 ⚠️ HTML 实体与未转义引号,需清洗(坑点 1、8)
4 重复行 ⚠️ 相同文本跨划分重复,需去重(坑点 3)
5 缺失编码 ✅ 缺失以空值呈现,无 -999 类虚假编码
6 标签标识 ✅ rating 显式标签列,语义清晰
7 罕见类分组 ⚠️ 药品与条件长尾,子群样本不足
8 偏倚评估 ⚠️ 自选样本偏倚真实存在但官方未量化(§7.1)
9 数据字典 ✅ UCI 页面给出 7 字段定义
10 信息性缺失解释 ⚠️ condition 缺失无官方解释,动机需自行推断
11 设备记录 ✅ 纯文本数据,无设备依赖
12 共线性 ✅ 字段间无数值共线性问题
13 编码映射 ⚠️ condition 无官方 ICD-11/SNOMED 映射,需自行构建(§2)
14 时间戳处理 ✅ date 为标准日期,可直接解析
15 划分建议 ✅ 官方 75/25 划分随数据发布
16 泄漏讨论 ⚠️ 官方未讨论;重复文本与 usefulCount 泄漏需自行处理(坑点 2、3)
17 标签分布 ✅ 分布可直接统计,双峰模式明确(§4.2)
18 测量偏倚 ⚠️ 自报评分的主观性无校准机制
19 外部验证建议 ✅ Druglib.com 姊妹语料构成现成域外测试集
20 版本记录 ⚠️ 无版本号与变更日志,UCI 收录后未再更新
21 预处理脚本 ❌ 官方未提供任何清洗/加载脚本
22 合规要求 ✅ CC BY 4.0 清晰,无注册门槛
23 多模态对齐 ✅ 单模态数据,无跨模态对齐负担
24 去标识化 ✅ 无直接标识符,行级匿名 ID

DAIMS 评分:18.5 / 24

评分解读:扣分集中在"数据工程自动化"维度——无官方预处理脚本(21)、跨划分重复(4)、HTML 实体与引号(3)、condition 噪声与缺失(10)以及官方对泄漏与偏倚的零讨论(16、8);而数据可用性维度几乎满分:清晰的许可、显式标签、标准时间戳、官方划分与现成的域外验证集。一句话概括:数据本身干净可信,但"开箱即跑"程度不足,清洗责任完全在使用者。

对你意味着什么:如果你的任务是快速出论文基线,直接用官方划分 + 本词条 §6.3 五步清洗即可,预计半天内完成管线;如果你要做药物警戒或面向生产的系统,必须先完成坑点 1-3 的三项修复(HTML 还原、usefulCount 摘除、跨划分去重)再谈指标,否则所有成绩都带水分;如果你需要有序副作用标签(如 5 级 sideEffects),本数据集没有——请改用姊妹语料 Druglib.com(UCI ID 461,4,143 条、8 字段),并把它作为本数据集的域外验证集组合使用。

§7.8 外部验证矩阵

外部数据集/场景 来源机构 评估任务 性能指标 相对内部变化 关键发现
Druglib.com(UCI ID 461) UCI ML Repository 跨域评论情感迁移(Drugs.com → Druglib.com) 准确率/F1(论文内部多组设定) 相对域内下降(定性) 源论文证明跨站迁移可行,共享方面结构是关键
同站随机划分(文献常规设定) 多项研究 二分类 rating>5 BERT 约 0.96 acc(Chaudhary et al. 2025) — 顶级成绩须结合泄漏修复后解读
方面级任务(ATEdrug 设定) PLOS ONE 2025 方面词抽取 + 方面极性 ATE F1 0.97;极性 F1 0.82-0.89 极性任务明显更难 方面抽取接近解决,情感判别仍是瓶颈

§8 基准性能与生态

§8.1 排行榜

⚠️ 以下数字来自不同论文与社区报告,任务设定(二分类/多分类/方面级)、子集规模与划分方式互不相同,数值不可直接横向比较,仅供量级参考:

排名 模型 性能 年份 关键技术 完整引用 代码
1 BERT 约 0.96 acc(二分类,自定划分) 2025 预训练 Transformer 微调 Chaudhary S, et al., 2025, J. Data Sci. Intell. Syst., DOI 10.47852/bonviewJDSIS52024468 未公开
2 Passive Aggressive 93.91% acc 2018 在线线性分类 + TF-IDF(社区 kernel,非同行评审) Kaggle 社区 kernel(作者公开于数据集页讨论区) 未公开
3 LightGBM 88.89% acc 2021 特征工程 + 梯度提升树 Mishra, 2021(独立研究,完整书目未能核实) 未公开
4 BERT 86.74% acc / F1 87.22%(40k 平衡子集) 2026 平衡子集 + 微调 J. Artif. Intell. Technol.(JAIT),2026(检索核实) 未公开
5 DistilBERT 86.56% acc(40k 平衡子集) 2026 蒸馏 Transformer 同上(JAIT 2026,同研究对照组) 未公开
6 SVM(linear) 约 83% acc(15k 子采样) — TF-IDF + 线性核 检索核实(OUCI 收录研究) 未公开
7 LSTM + GloVe 83.16% acc(40k 平衡子集) 2026 词向量 + 序列模型 同上(JAIT 2026,同研究对照组) 未公开

说明:第 1 名与第 4-7 名的差距主要由划分与子集设定差异贡献,而非模型能力差距;Passive Aggressive 的 93.91% 未经理由同行评审,引用时应注明性质。

§8.2 SOTA 总结与选型建议

在本数据集上,"BERT 级模型 + 官方划分"是社区事实上的标准配置;超过 90% 的公开成绩几乎都应先检查泄漏(重复文本、usefulCount)再采信。选型建议:快速基线用 TF-IDF + 线性模型(半小时);主线实验用 BERT-base/DistilBERT;方面级任务直接采用 ABSA 框架(ATEdrug 设定);医疗域增强需求用 Bio+Clinical BERT 系权重初始化。

你的约束 推荐路径 预期量级
一天内要可交付基线 TF-IDF + LogisticRegression,官方划分 acc 约 80% 量级
论文主实验 BERT-base 微调 + 泄漏修复消融 acc 约 86%-96%(取决于设定)
生产部署 DistilBERT 蒸馏 + ONNX/TensorRT 精度损失 <1%,推理加速约一倍
方面级需求 ABSA(ATEdrug 式)两阶段框架 ATE F1 约 0.97、极性 F1 0.82-0.89

§8.3 评测协议

协议要素 推荐设定 说明
任务定义 二分类(rating>5 vs rating≤5)为主流 10 分类与有序回归为扩展;ABSA 单列方面级协议
数据划分 官方 train/test + 训练集内验证 补充时间划分与 GroupKFold(by drugName)做鲁棒性检查(§5.3)
指标 accuracy + macro-F1 + ROC-AUC 双峰不平衡下以 macro-F1 为主指标(坑点 4)
子群报告 按 condition 分层报告 至少覆盖 Top 10 条件,防止单一条件主导
泄漏披露 披露清洗规则与特征表 是否含 usefulCount、是否去重必须写明(坑点 2、3)

四条铁律:同一论文内所有对比模型共用同一清洗视图;不同划分的成绩不放进同一张表;引用他人数字时注明其划分设定;所有结论附"评论人群"限定。

数据集 机构/来源 规模 与本数据集的关系
Drug Review (Druglib.com) UCI ML Repository(ID 461) 4,143 条、8 字段 姊妹语料,含 5 级 sideEffects/effectiveness,站内另有词条
MIMIC-III MIT-LCP / PhysioNet 约 200 万住院、26 表 站内词条;院内 EHR 视角,与本数据集的院外自报视角互补
CADEC 悉尼大学等 数百篇论坛帖 实体级 ADR 标注,任务互补
Twitter ADR 提及语料 Nikfarjam et al. 2015 数千条推文 社交媒体药物警戒的短文本对应物

§8.5 关键论文

  1. Gräßer F, Kallumadi S, Malberg H, Zaunseder S. Aspect-Based Sentiment Analysis of Drug Reviews Applying Cross-Domain and Cross-Data Learning. DH '18, Lyon, 2018-04-23 至 2018-04-26, pp.121-125, ACM. DOI 10.1145/3194658.3194677 — 数据集源论文:提出方面级情感分析 + 跨域/跨数据学习设定,验证 Drugs.com 模型向 Druglib.com 迁移。
  2. Nikfarjam A, Sarker A, O’Connor K, Ginn R, Gonzalez G. Pharmacovigilance from social media: mining adverse drug reaction mentions using sequence labeling with word embedding. J Am Med Inform Assoc, 2015;22(3):671-681. DOI 10.1093/jamia/ocu041 — 社交媒体 ADR 挖掘的奠基工作,确立了"评论/社媒文本作为药物警戒信号源"的方法学。
  3. Sarker A, Nikfarjam A, O’Connor K, et al. Utilizing social media data for pharmacovigilance: A review. J Biomed Inform, 2015;54:202-212. DOI 10.1016/j.jbi.2015.02.004 — 系统综述社交媒体药物警戒管线,为评论数据定位提供框架。
  4. Cavalcanti D, Prudêncio RB. Word Embeddings as Features in Supervised Drug Reviews Classification. EPIA 2017, Springer. — 词向量特征用于药品评论分类的先行研究。
  5. Denecke K. 相关研究(2015)— 探讨社交媒体健康文本的医学可用性与概念抽取,为评论语料的临床定位提供依据。
  6. Chaudhary S, et al. 2025. J. Data Sci. Intell. Syst. DOI 10.47852/bonviewJDSIS52024468 — 本数据集上 BERT 系模型的高成绩参照(须结合 §8.1 划分说明解读)。
  7. ATEdrug 框架论文. PLOS ONE, 2025. DOI 10.1371/journal.pone.0344296 — 方面级抽取 + 极性判别的近期 SOTA 参照。

§8.6 社区活跃度

截至 2026-09:源论文 Semantic Scholar 引用 173+;Kaggle 镜像页(KUC Hackathon Winter 2018)持续有社区 fork 与 EDA notebook 更新,是该站药品评论主题访问量最高的数据集之一;Hugging Face Hub 存在多个社区 Parquet 数据卡。没有官方维护的排行榜或 GitHub 基线仓库,社区复现以 notebook 文化为载体。

社区载体 活跃形态 截至 2026-09 的状态
Kaggle 镜像页 EDA/建模 notebook、讨论区 持续有新 notebook,社区读取参数实践的主要沉淀地
Semantic Scholar 学术引用 173+,DH '18 会议论文中引用量显著者
Hugging Face Hub Parquet 数据卡 多个社区镜像,无单一官方卡
GitHub 官方基线仓库 无官方仓库;论文代码散见于作者主页

§8.7 生态快照

资源 类型 链接 推荐理由
UCI 数据集页(ID 462) 官方托管 archive.ics.uci.edu 一手出处 + DOI + 官方划分
UCI DOI 页 持久标识 doi.org/10.24432/C5SK5S 论文引用锚点
Kaggle 镜像 社区托管 KUC Hackathon Winter 2018 Notebook 即开即用 + 海量社区 EDA
源论文 ACM DL 论文 dl.acm.org 任务设定与跨域实验原始描述
UCI ID 461(Druglib.com) 姊妹语料 archive.ics.uci.edu 域外验证集 + 有序副作用标签
Hugging Face Hub 社区镜像 huggingface.co 搜索 “drug review” Parquet 现代管线加载

§9 相关资源与引用

§9.1 官方与权威资源

§9.2 BibTeX 完整引用

@misc{kallumadi2018drug,
  title      = {Drug Review Dataset (Drugs.com)},
  author     = {Kallumadi, Surya and Gr{\"a}{\ss}er, Felix},
  year       = {2018},
  publisher  = {UCI Machine Learning Repository},
  doi        = {10.24432/C5SK5S},
  url        = {https://archive.ics.uci.edu/dataset/462/drug+review+dataset+drugs+com}
}

@inproceedings{grasser2018aspect,
  title      = {Aspect-Based Sentiment Analysis of Drug Reviews Applying
                Cross-Domain and Cross-Data Learning},
  author     = {Gr{\"a}{\ss}er, Felix and Kallumadi, Surya and
                Malberg, Hagen and Zaunseder, Sebastian},
  booktitle  = {Proceedings of the 2018 International Conference on Digital Health
                (DH '18)},
  year       = {2018},
  address    = {Lyon, France},
  pages      = {121--125},
  publisher  = {ACM},
  doi        = {10.1145/3194658.3194677}
}

@article{nikfarjam2015pharmacovigilance,
  title      = {Pharmacovigilance from social media: mining adverse drug reaction
                mentions using sequence labeling with word embedding},
  author     = {Nikfarjam, Azadeh and Sarker, Abeed and O'Connor, Karen and
                Ginn, Rachel and Gonzalez, Graciela},
  journal    = {Journal of the American Medical Informatics Association},
  volume     = {22},
  number     = {3},
  pages      = {671--681},
  year       = {2015},
  doi        = {10.1093/jamia/ocu041}
}

@article{sarker2015utilizing,
  title      = {Utilizing social media data for pharmacovigilance: A review},
  author     = {Sarker, Abeed and Nikfarjam, Azadeh and O'Connor, Karen and
                Ginn, Rachel and Upadhyaya, Sweta and Gonzalez, Graciela},
  journal    = {Journal of Biomedical Informatics},
  volume     = {54},
  pages      = {202--212},
  year       = {2015},
  doi        = {10.1016/j.jbi.2015.02.004}
}

§9.3 引用指南

  • 引用数据集本身:使用第一条 @misc{kallumadi2018drug}(UCI 官方要求引用数据集出处)。
  • 引用方法学背景:使用第二条 @inproceedings{grasser2018aspect}(源论文,描述任务设定与跨域实验)。
  • 药物警戒方向:建议同时引用 Nikfarjam 2015 与 Sarker 2015 综述,为"评论语料 → 安全信号"的方法学定位提供支撑。
  • 引用数快照:173+(Semantic Scholar,截至 2026-09),引用时注明快照日期。

两条实务提醒:其一,CC BY 4.0 的署名义务落在"再分发"与"改编"环节——仅在实验中使用不触发,但发布衍生数据集或模型卡时应完整引用;其二,注意区分数据集引用与源论文引用:多数论文只引源论文会导致数据出处不可追溯,UCI 官方明确建议两者并引。

§10 AI 使用声明卡

§10.1 AI 模型使用

AI 模型 版本 用途
deep-model(WorkBuddy) 2026-09 初稿生成:INFOBOX 数据汇编、§1-§9 结构化写作、§6 代码示例生成、JSON-LD 构建
WebSearch(多源检索) 2026-09 8 组检索:UCI/Kaggle/HF 页面、源论文与 DOI、引用数快照、基准数字与坑点线索交叉验证

§10.2 AI 参与范围

AI 参与范围:初稿生成 + 资料整理 + 代码生成 + 格式化排版。

AI 在本页面的工作中负责:(1) 从 UCI 官方页、DOI 页、ACM 源论文、Kaggle/Hugging Face 镜像与多项基准研究中整理结构化信息;(2) 生成 §6 的 Python 代码示例与预处理管线;(3) 系统化组织 §6.5 的 8 个坑点与 §7.1 偏倚表;(4) 执行 G1/G2/G3 排版规范检查与中英文格式标准化;(5) 构建 §C 统一 JSON-LD @graph。

§10.3 输入来源

  1. UCI ML Repository 数据集页 Drug Review Dataset (Drugs.com)(ID 462)
  2. UCI DOI 页 10.24432/C5SK5S(许可与引用元数据)
  3. Gräßer et al. (2018), ACM DH '18, pp.121-125(DOI: 10.1145/3194658.3194677)
  4. Semantic Scholar 引用快照(DOI: 10.1145/3194658.3194677,截至 2026-09)
  5. Kaggle 镜像 KUC Hackathon Winter 2018(jessicali9530/kuc-hackathon-winter-2018)页面与社区 EDA notebook
  6. Hugging Face Hub 社区 Parquet 镜像数据卡(搜索 “drug review”,截至 2026-09)
  7. UCI ML Repository 姊妹语料 Drug Review Dataset (Druglib.com)(ID 461,DOI: 10.24432/C55G6J)
  8. Chaudhary et al. (2025), J. Data Sci. Intell. Syst.(DOI: 10.47852/bonviewJDSIS52024468)
  9. ATEdrug 框架论文 (2025), PLOS ONE(DOI: 10.1371/journal.pone.0344296)
  10. J. Artif. Intell. Technol. (JAIT) 2026 基准研究(BERT/DistilBERT/LSTM 对照组,40k 平衡子集)
  11. Mishra (2021) LightGBM 独立研究报告(检索核实)
  12. Nikfarjam et al. (2015), JAMIA 22(3):671-681(DOI: 10.1093/jamia/ocu041)
  13. Sarker et al. (2015), J Biomed Inform 54:202-212(DOI: 10.1016/j.jbi.2015.02.004)
  14. Cavalcanti & Prudêncio (2017), EPIA, Springer
  15. WHO 官网疾病概况页(抑郁、焦虑流行病学,截至 2026-09)

§10.4 人工校验表

内容模块 审核者 审核方式 审核状态
§2 医学背景(ICD-11/SNOMED 映射、人群、金标准) 千方病案医学编辑部 交叉审核 ✅ 已通过
§3 数据集规格(规模、划分、版本矩阵) 千方病案医学编辑部 与 UCI 官方页及 Kaggle 页交叉比对 ✅ 已验证
§4 数据结构(字段字典、统计、缺失) 千方病案医学编辑部 与官方字段说明及多源 EDA 交叉比对 ✅ 已验证
§5 划分策略与泄漏风险 千方病案医学编辑部 交叉审核 ✅ 已通过
§6 代码示例与坑点 千方病案医学编辑部 逻辑审查 + 社区实践比对 ✅ 已通过
§7 质量评估与 DAIMS 评分 千方病案医学编辑部 交叉审核 ✅ 已通过
§8 排行榜与引用数表述 千方病案医学编辑部 与原论文及 Semantic Scholar 快照交叉比对 ✅ 已验证
§C JSON-LD @graph 千方病案医学编辑部 Schema 字段逐项校验 ✅ 已通过

§10.5 AI 生成章节标注

以下章节由 AI 生成初稿并经人工审核:§1.0 30 秒速览、§3.0 版本抉择矩阵、§6.0-§6.4 代码示例、§6.5 八个坑点、§6.9 评估指标代码、§7.7 DAIMS 评估表与评分、§8.1 排行榜、§8.7 生态快照、§C JSON-LD。

§10.6 最后审核

最后一次人工审核日期:2026-09-05

页面状态:published(全部内容已完成审核并发布)


相关数据集导航

以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:

  • cadec — 共享标签:医疗NLP / 药物发现与化学 / 药物安全
  • sider — 共享标签:医疗NLP / 药物发现与化学 / 药物安全
  • meddialog — 共享标签:医疗NLP / 药物发现与化学 / 临床文本
  • rxnorm — 共享标签:医疗NLP / 药物发现与化学
  • mimic-iv-ext-pe — 共享标签:医疗NLP / 临床文本
  • rad-coreference-resolution — 共享标签:医疗NLP / 临床文本
  • radgraph2-radiology-reports — 共享标签:医疗NLP / 临床文本
  • toxcast — 共享标签:药物发现与化学 / 药物安全
  • imcs-21 — 共享标签:医疗NLP / 临床文本
  • pmc-oa-subset — 共享标签:医疗NLP / 临床文本

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集