信息速览

COMETA — 社媒医学实体链接语料库 AI-Ready Wikipedia
INFOBOX
| 字段 | 内容 |
|---|---|
| 数据集名称 | COMETA(Corpus of Online Medical EnTities) |
| 英文全称 | COMETA: A Corpus for Medical Entity Linking in the Social Media |
| 别名/简称 | cometA corpus、COMETA dataset |
| 疾病分类(ICD-11) | 非单病种语料;覆盖症状、用药、身体结构等多域概念(示例:广泛性焦虑障碍 ICD-11 6B00,对应 SNOMED CT 370143000) |
| SNOMED CT | 3,645 个 General 概念 + 4,003 个 Specific 概念(SCTID 标注) |
| 数据模态 | 社交媒体文本(Reddit 公开帖文例句) |
| AI 任务类型 | 实体链接(Entity Linking)/ 医学概念规范化 / 缩写消歧 |
| 样本总数 | 20,015 条实体提及(19,911 条唯一例句、6,404 个唯一术语) |
| 数据大小 | 轻量级纯文本数据集(ZIP 分发,MB 级;官方未公布精确体积) |
| 数据格式 | TSV(表格文本,ZIP 压缩分发) |
| 许可证 | MIT License(官方 GitHub 仓库,2025-03 添加) |
| 访问级别 | 开放下载(Google Drive / Dropbox,无需注册) |
| DUO 标签 | 不适用(非基因组/临床队列数据) |
| 语言 | 英语 |
| 首发日期 | 2020-10-07(arXiv v1);2020-11 数据随 GitHub 仓库发布 |
| 最后更新 | 2025-03-06(仓库添加 LICENSE 文件) |
| 发布机构 | 剑桥大学语言技术实验室(Cambridge LTL)+ 伦敦大学学院(UCL) |
| 官方主页 | GitHub cambridgeltl/cometa |
| 下载地址 | Google Drive / Dropbox |
| DOI | 10.18653/v1/2020.emnlp-main.253 |
| 引用次数 | 91+(Semantic Scholar,截至 2026-09) |
| AI 就绪度评分 | ⭐⭐⭐⭐(4/5)— 有官方四划分、20 个基线代码与预训练向量,但需手动下载数据并自建 SNOMED 概念索引(扣分项:无 pip 化加载器、无官方预处理 pipeline) |
| 页面状态 | published |
§0 E-E-A-T 审核声明
医学审核:[千方病案医学编辑部] 交叉审核:§2 医学背景(SNOMED CT 域分布与 ICD-11 映射)、§7 偏倚分析。
数据工程审核:[千方病案医学编辑部交叉审核] 医疗 AI 数据工程师,审核范围:§4 DAIMS 数据字典、§5 数据划分策略、§6 预处理 Pipeline 和坑点。
审核日期:2026-09-05
医疗免责声明:本页面提供的医学信息仅供研究和教育目的,不构成医疗建议、诊断或治疗方案。数据集的医学描述基于公开发表的文献,未经逐一临床验证。任何基于该数据集训练的 AI 模型在应用于临床决策前,必须经过独立的临床验证和监管审批。
技术免责声明:本页面的代码示例、预处理建议和基准性能数据基于公开资料整理,不保证在特定环境下的准确性和适用性。使用者应自行验证代码安全性和数据预处理流程的正确性。千方病案医数集不对因使用本页面信息而导致的任何直接或间接损失承担责任。
数据使用合规:使用本页面描述的数据集前,请务必阅读并遵守数据集原始许可协议。COMETA 依托 MIT License 的官方 GitHub 仓库以开放下载方式分发,例句来源于 Reddit 公开帖文并经发布方匿名化处理;SNOMED CT 本身受 SNOMED International 许可条款约束,检索与使用概念时需遵守相应许可。DUO 标签仅供参考,具体使用限制以数据集官方协议为准。
§1 数据集概览
§1.0 30 秒速览
这是什么? COMETA 是一个"大众健康语言翻译词典"式语料库。普通人在 Reddit 上聊健康问题时,不说"磷酸二酯酶抑制剂",而说"benzos"“gad”“bloods”。这个数据集把 20,015 条这样的通俗说法,交由拥有生物医学博士学位的专业标注员,逐条标注成 SNOMED CT 标准概念编码,而且每个术语标了两层含义:字面义(General)和上下文义(Specific)。
为什么重要? 临床术语系统处理病历(EHR)能达到 95% 以上准确率,但碰到社交媒体文本会骤降到约 50%——大众的健康表达是另一个"语言世界"。想倾听"公众的声音"做药物警戒、公共卫生监测、患者教育,就必须先解决通俗术语到标准概念的映射问题,而 COMETA 是该方向上规模最大、质量最高的公开评测资源之一。
我能用它做什么? 训练和评测医学实体链接/概念规范化模型(如 SapBERT 这类双编码器);研究缩写消歧与一词多义(4.5% 的提及两层标注不同);为药物警戒和健康舆情系统构建语义理解底座;或把它作为零样本评测集,检验你的模型在"没见过的概念"上的真实泛化能力。
§1.1 摘要
COMETA 由剑桥大学语言技术实验室团队构建(Basaldella 等,EMNLP 2020)。团队通过 Pushshift 与 Reddit API 爬取 68 个健康主题 subreddit 在 2015-2018 年的全部 80 万余条讨论,先在 10 万条随机子样本上运行以 HealthUnlocked 论坛数据训练的 Flair 命名实体识别系统,得到 6.5 万余个候选医学术语;经匿名化(剔除个人可识别信息、仅保留至少 5 名不同用户提及过的词项)后,由 2 名生物医学博士标注员对最热门的 8K 实体进行 SNOMED CT 概念标注,最终产出 20,015 条实体提及。每条记录包含表面术语、Reddit 例句、来源子版块,以及 General(字面义)与 Specific(上下文义)两个 SNOMED SCTID。官方提供 Stratified(概念分层)与 Zero-Shot(概念全新)两种采样方式 × General/Specific 两层标注,共四套 train/dev/test 划分,并对 20 个从字符串匹配到神经模型的基线做了系统评测:最佳回退式集成在分层通用划分上达 Acc@1 0.79,零样本特定划分上仅 0.54,揭示了社媒实体链接的巨大挑战。
§1.2 战略价值
维度一:填补"公众语言"与"标准术语"之间的数据空白。 此前的医学实体链接资源(MedMentions、BC5CDR、NCBI Disease)几乎全部构建于 PubMed 摘要等科学文本之上,而患者在互联网上使用的口语(“scratchy throat”“anti nausea meds”)与科学语言存在系统性鸿沟。COMETA 是首批将专家级 SNOMED CT 标注系统性地施加到社交媒体健康话语上的资源之一,且规模(2 万条)与质量(93.5% 标注获评估满分)均显著超过此前同类社媒语料,使其成为"患者语言 NLP"这一新兴方向的事实基准。
维度二:独特的双层标注设计,天然支持多义与上下文研究。 同一表面形式在不同上下文中指向不同概念(“bloods"字面是"血液”,上下文中指"验血";“gad"可以是"广泛性焦虑障碍"也可以是"谷氨酸脱羧酶”)。COMETA 为每条提及同时给出 General 与 Specific 两层 SCTID,其中 4.5% 的提及两层概念不同——这使它不仅是一个链接数据集,更是一个可研究"上下文如何决定语义"的受控实验场,直接服务缩写消歧、语境化表示学习等前沿课题。
维度三:零样本协议先行,为真实部署设标。 论文明确论证"为全部 35 万 SNOMED 概念构建覆盖式训练数据代价高昂",因此 Zero-Shot 场景(测试概念全新)被设计为与 Stratified 并列的主协议,而非附带消融。这种"把最难场景制度化"的做法领先于同期多数基准,使 COMETA 天然适合评估 UMLS 预训练模型(如 SapBERT 零样本 65.9)与检索增强方法(如 BioELQA 85.2)的真实泛化边界,也让它成为大模型时代"无微调能力评测"的常驻考题。
§1.3 同类数据集横向对比
下表对比社媒医学概念规范化方向的代表性公开语料(规模数字取自各数据集论文或综述统计,统计口径不完全一致,仅供量级参考):
| 数据集 | 年份 | 来源平台 | 规模 | 标注目标 | 与 COMETA 的差异化 |
|---|---|---|---|---|---|
| COMETA | 2020 | 20,015 条提及 | 3,645/4,003 个 SNOMED CT 概念(双层) | 唯一双层标注 + 四套官方划分 + 20 基线 | |
| AskAPatient | 2020 | AskAPatient 论坛 | 约 10,600 条推文式品牌名 | 药品 RxNorm 概念 | 专注药品口语名,无上下文层标注 |
| MedNorm | 2019 | 聚合社媒 | 23,292 条短语 | 3,607 个 MedDRA/SNOMED 概念 | MedDRA 为主,面向不良事件表述 |
| PsyTAR | 2019 | 药物评论 | 6,556 条 | 618 个 UMLS/SNOMED 概念 | 精神科药品评论,规模小 |
| MedRed | 2020 | 1,980 条 | 3,511 个 CADEC 概念 | 规模小一个量级,无零样本协议 | |
| SMM4H-2021 | 2021 | 18,833 条 | 2,237 个 MedDRA 概念 | 聚焦不良事件提及,竞赛制数据 |
§1.4 版本时间轴
| 时间 | 事件 | 说明 |
|---|---|---|
| 2020-10-07 | arXiv v1 发布(arXiv:2010.03295) | 论文首次公开 |
| 2020-09/11 | GitHub 仓库 cambridgeltl/cometa 创建并分批补全 | 2020-11-17 完成 stratified specific 划分上传 |
| 2020-11 | EMNLP 2020 正式发表 | 页码 3122-3137,DOI 10.18653/v1/2020.emnlp-main.253 |
| 2024-04-30 | README 最后更新 | 维护下载链接与预训练向量入口 |
| 2025-03-06 | 仓库添加 MIT LICENSE 文件 | 许可证正式显式化 |
§1.5 典型应用场景
- 社媒医学实体链接基准评测:用四套官方划分对双编码器/交叉编码器模型做标准化评测,Acc@1/Acc@5 与社区可比。
- 药物警戒信号挖掘底座:把患者论坛中的口语药名与症状描述链接到 SNOMED CT,支撑不良事件信号聚合与舆情监测。
- 缩写消歧与多义研究:利用 General/Specific 双层标注研究"gad"“UI”"MSM"等缩写在上下文中的语义消解。
- 零样本概念泛化评估:Zero-Shot 划分专门暴露模型对训练中未见概念的泛化短板,适合作为新模型上线的压力测试。
- 患者语言资源预训练:配套的 Bioreddit-FastText 与 BioRedditBERT 向量基于同一 80 万条 Reddit 语料训练,可作下游模型的领域初始化。
§2 医学背景
§2.1 ICD-11 与 SNOMED CT 概念映射
COMETA 不是单病种数据集,其标注空间是整个 SNOMED CT 概念图。下表给出语料中高频主题域的代表性概念映射(SNOMED SCTID 直接取自论文正文示例;ICD-11 编码为对应主流概念的编码,供跨术语系统参考):
| 主题/标签示例 | ICD-11 编码 | SNOMED CT 码(SCTID) | 术语 |
|---|---|---|---|
| 广泛性焦虑障碍 | 6B00 | 370143000 | Generalized anxiety disorder(缩写 “gad”) |
| 强迫障碍 | 6B04 | 191736004 | Obsessive compulsive disorder |
| 克罗恩病 | DD71 | 34000006 | Crohn’s disease |
| 泌尿道感染 | GC08 | 68566005 | Urinary tract infectious disease(缩写 “UI”) |
| 口服避孕药 | — | 5935008 | Oral contraception |
| 咽干(症状) | — | (论文未列 SCTID) | Pharyngeal dryness / “scratchy throat” |
| 愤怒情绪(处境性) | — | 75408008 | Feeling angry(“pissed off”) |
| 感觉不适(处境性) | — | 225013001 | Feeling bad |
说明:ICD-11 与 SNOMED CT 的官方映射随 WHO/SNOMED International 版本演进,上表 ICD-11 编码仅覆盖论文示例中可直接对应的主流概念;带"—"者为症状或处境性概念,ICD-11 无一一对应编码。
§2.2 主题谱系与健康话语背景
COMETA 覆盖 68 个健康主题 subreddit(如 r/health、r/cancer、r/mentalhealth 等),其标注概念的 SNOMED 域分布为:Clinical finding(临床发现)44.4%、Substance(物质)23.1%、Body structure(身体结构)10.9%、Procedure(操作)7.8%、Pharmaceutical/biologic product(药物/生物制品)3.7%,五域合计覆盖超过 90% 的实体。这一分布刻画了大众健康话语的真实结构:患者最多谈论的是症状感受(而非确诊疾病名),其次是药物与物质、身体部位,再次是检查与操作。心理卫生、胃肠疾病、疼痛、用药体验是语料中最活跃的讨论主题(论文示例涵盖焦虑、强迫、克罗恩病、泌尿感染、避孕等)。需要强调:标注反映的是术语所指概念,而非发帖者本人的确诊情况——一篇提到 “my Crohn’s” 的帖子,例句链接到克罗恩病概念,但不构成任何流行病学计数。
论文 Table 1 给出的挑战样例表可直接当作"大众语言难度分级"来读:
| 输入术语 | 金标准 SNOMED 标签 | 挑战类型 |
|---|---|---|
| scratchy throat | Pharyngeal dryness | 口语化症状描述 |
| lower right abdomen | Structure of right lower quadrant of abdomen | 术语组合性 |
| anti nausea meds | Medicinal product acting as antiemetic agent | 药物功能性描述 |
| MSM | Dimethul sulfone | 替代产品名(缩写歧义) |
| up all night cleaning | Obsessive compulsive disorder | 复杂推理 |
| bloods(“get bloods done”) | Blood test | 上下文多义 |
| gad(“diagnosed with gad”) | Generalized anxiety disorder | 缩写+上下文消歧 |
这组样例揭示了一个重要事实:大众健康话语中的"术语"远不止名词性实体,还包括动词短语、功能描述与情境推理,这是它与经典医学 NER 语料(实体多为名词短语)的本质差异。
§2.3 临床任务定义:通俗语言实体链接
COMETA 对应的 AI 任务是**医学实体链接(Medical Entity Linking, MEL)在社交媒体语域的特例,也常被称为医学概念规范化(Medical Concept Normalization, MCN)**在患者生成内容(PGC)上的变体。任务形式化定义为:给定提及 m(表面术语)及其上下文例句 c,从 SNOMED CT 概念空间中检索出正确概念 e,使得 e 恰当表达 m 在 c 中的含义。与临床文本 MEL 相比,该任务有三重额外难度:其一,口语化与拼写变体("bloods"指验血、"anti nausea meds"指止吐药);其二,缩写高度歧义("gad"可指广泛性焦虑障碍或谷氨酸脱羧酶,需依赖同句的"benzos"线索消歧);其三,复杂推理("up all night cleaning"需推断为强迫障碍)。官方在两种评测场景下衡量性能:Stratified(测试概念均出现于训练集)与 Zero-Shot(测试概念全新),后者被认为更贴近真实部署。
临床语域与社媒语域的任务条件对照:
| 维度 | 临床 EHR/PubMed 语域 | 社媒 UGC 语域(COMETA) |
|---|---|---|
| 表面形式 | 规范术语、拼写统一 | 口语、俚语、缩写、拼写照 |
| 上下文 | 结构化病历/摘要句式 | 帖子碎片、情绪化叙述 |
| 概念分布 | 集中于疾病/操作/药物 | 临床发现+物质+身体结构长尾 |
| 成熟管线 | cTAKES/QuickUMLS 可达 95%+ | 同管线在 COMETA 跌至约 50% |
| 评测协议 | 文内实体多为首次出现即定义 | 需 Stratified/Zero-Shot 双场景 |
§2.4 贡献者画像
| 维度 | 描述 |
|---|---|
| 文本来源 | Reddit 68 个健康主题 subreddit 公开帖文 |
| 时间范围 | 2015-2018 年全部帖子(约 80 万条讨论) |
| 语言/地域 | 英语(Reddit 用户以英语区为主,官方未公布地域分布) |
| 人口属性 | 匿名化后不可得(官方未公布发帖者年龄/性别/种族统计) |
| 就医类型 | 患者自述与照护者经验为主,兼有提问与健康讨论 |
| 纳入标准 | 术语被至少 5 名不同用户提及、位于最热门 8K 实体之列、在 SNOMED CT 中存在对应概念(NIL 已排除) |
§2.5 临床与公共卫生价值
对医疗 AI 系统而言,COMETA 解决的是"听懂患者说什么"这一前置环节。其价值链条包括:药物警戒——监管方与药企在 FAERS 等 spontaneous 报告之外,可以从社媒早期捕捉不良事件信号,而这要求先把口语药名和症状链接到标准编码;公共卫生监测——抑郁、成瘾、疫情话题的舆情分析同样依赖实体级语义理解;医患沟通工具——可读性改写、患者教育问答系统需要双向的"通俗↔标准"映射能力;检索与推荐——健康信息检索系统需将用户口语查询规范化到术语系统才能命中权威内容。论文用一个对照数字概括了这一空白的价值:临床管线 cTAKES 在 EHR 文本上准确率超过 95%,在 COMETA 上跌至约 50%——如果不针对公众语言专门建模,任何直接复用临床 NLP 的方案都将在真实患者声音面前失效一半。
| 应用链路 | COMETA 提供的环节 | 典型下游系统 |
|---|---|---|
| 不良事件信号挖掘 | 口语药名/症状 → SNOMED 概念 | 药物警戒聚合平台、信号检测器 |
| 健康舆情监测 | 症状与疾病表述的实体级归一 | 公共卫生早期预警仪表盘 |
| 患者教育改写 | 标准 → 通俗映射语料 | 可读性改写器、问答系统 |
| 健康检索规范化 | 口语 query → 术语编码 | 医学搜索引擎、内容推荐 |
| 患者语言研究 | 双层标注的多义受控样本 | 缩写消歧、语境化表示研究 |
§2.6 金标准与标注体系
| 维度 | 内容 |
|---|---|
| 划分 | 官方四套:Stratified General/Specific、Zero-Shot General/Specific(各含 train/dev/test) |
| 标注方式 | 人工专家标注(双层:General 字面义 + Specific 上下文义,均标注 SNOMED SCTID) |
| 标注者 | 2 名具有生物医学博士学位的专业标注员(外包至 Molecular Connections Pvt. Ltd) |
| 质量评估 | 3 名 NLP 博士 + 1 名在读博士分 2 组,随机抽 1K 条独立评分(每组 500 条,评估者与标注者零重叠) |
| 标注质量 | 93.5% 样本获最高分 5,96.8% 至少 4 分(General 与 Specific 两层一致) |
| 性质 | 专家级金标准(非众包、非弱监督) |
§3 数据集规格
§3.0 版本与获取渠道抉择矩阵
COMETA 为单一版本语料(数据内容自 2020-11 上传后未变更,后续更新仅涉及仓库元数据与许可证),不存在多版本抉择问题。实际使用中真正需要抉择的是获取渠道与配套资源:
| 你的需求 | 推荐渠道 | 大小 | 理由 |
|---|---|---|---|
| 只要语料本体 | Dropbox 直链 cometa.zip | MB 级 | 单文件一次下载,脚本最友好 |
| 国内/大文件环境 | Google Drive 链接 + gdown | MB 级 | 可程序化下载(见 §6.2) |
| 需要基线代码与实验复现 | GitHub 克隆全仓库 | 较小 | 含 experiments/ 与 src/ 目录 |
| 需要配套预训练向量 | GitHub README 指向的 Bioreddit-FastText / BioRedditBERT(HuggingFace) | 数百 MB 级 | 与语料同源训练,领域匹配 |
| 需要统一的多基准框架 | BELB 基准(集成 COMETA) | 视配置 | 自动下载与统一预处理,但划分可能被重排 |
§3.1 模态详情
COMETA 是纯文本数据集,模态为社交媒体健康话语:每条记录的核心是一段来自 Reddit 的真实例句(Example)、其中的口语医学术语(Term),以及术语来源子版块(Subreddit)。文本保持口语原貌——包含缩写、拼写随意、俚语与情绪表达,未做正式化改写。官方另提供两个配套模态资源:Bioreddit-FastText 与 BioRedditBERT-uncased 预训练向量(基于同一 80 万条 Reddit 语料训练,另有 ELMo、Flair、GloVe 版本),用于实体与概念的向量表示。
配套预训练资源一览(官方 GitHub README 提供):
| 资源 | 形态 | 获取渠道 | 训练语料 | 典型用途 |
|---|---|---|---|---|
| Bioreddit-FastText | bin/vec 词向量 | 官方 Google Drive | 80 万条 Reddit 帖 | 词级相似度、字符串基线增强 |
| BioRedditBERT-uncased | Transformer 权重 | HuggingFace | 同上 | 提及/概念编码器初始化 |
| Bioreddit ELMo/Flair/GloVe | 各自格式 | basaldella/bioreddit 仓库 | 同上 | 复现论文各神经基线 |
这些配套向量与语料严格同源,是"领域匹配初始化"的省心之选——相比 BioBERT(PubMed 语料)或通用 BERT,BioRedditBERT 的词表天然覆盖 benzos、bloods 一类口语词,这也是官方把两者一并发布的原因。
§3.2 按子集样本数
官方四套划分的 train/dev/test 规模(论文 Table 2):
| 划分 | 标注层 | 训练集 | 开发集 | 测试集 | 合计 |
|---|---|---|---|---|---|
| Stratified | General | 13,489 | 2,176 | 4,350 | 20,015 |
| Stratified | Specific | 13,441 | 2,205 | 4,369 | 20,015 |
| Zero-Shot | General | 14,062 | 1,958 | 3,995 | 20,015 |
| Zero-Shot | Specific | 13,714 | 2,018 | 4,283 | 20,015 |
§3.3 数据格式
| 项目 | 规格 |
|---|---|
| 分发形态 | ZIP 压缩包(Google Drive / Dropbox) |
| 文件格式 | TSV 表格文本 |
| 核心列 | ID、Term、General SCTID、Specific SCTID、Example、Subreddit |
| 附加列 | General 概念标签、Specific 概念标签(两个 SNOMED 首选术语字符串) |
| 辅助信息 | 例句附原始 Reddit 帖子链接(附录 A.2 说明) |
| 编码 | UTF-8 英文文本 |
§3.4 存储大小
语料为 2 万行量级的纯文本 TSV,属轻量级数据集,压缩包体积为 MB 量级;官方仓库与论文均未公布精确字节数与校验和。下载后解压即可直接读入内存,无需任何分布式存储方案。真正占空间的是配套资源:BioRedditBERT/Bioreddit-FastText 向量文件达数百 MB 量级,建议单独存放。
部署资源规划参考(工程常识量级,非官方数字):
| 场景 | 数据存储 | 内存需求 | 说明 |
|---|---|---|---|
| EDA 与统计 | <10MB 磁盘 | 1-2GB | pandas 全量读入 |
| 字典/字符串基线 | <10MB 磁盘 | 2-4GB | 概念池 + 编辑距离缓存 |
| 双编码器训练 | 数据 <10MB + 模型权重 | 8-16GB GPU 显存 | 见 §6.8 |
| 生产推理索引 | 概念池向量 <10MB | 1-4GB | FAISS Flat 索引即可 |
§3.5 标注方式
标注流程为纯人工专家标注:对经 Flair NER 筛选与频率过滤后的 8K 热门实体,标注员对照 SNOMED CT 概念图逐条赋码,每个术语同时给出 General(脱离上下文的字面义)与 Specific(结合例句的上下文义)两个 SCTID;每个概念平均配有至少 5 个例句(中位数 3)。语料排除了在 SNOMED CT 中无对应概念的 NIL 实体,因此"语料内"保证每个提及都有正解概念。标注外包给专业医学标注机构 Molecular Connections Pvt. Ltd,由 2 名生物医学博士执行。
§3.6 标注者资质与一致性
标注者:2 名生物医学博士。质量评估采用独立第三方协议:3 名资深 NLP 方向博士毕业生与 1 名 NLP 在读博士组成 2 组(每组 2 人),从语料随机抽取 1,000 条标注(每组评估 500 条),对 General 与 Specific 两层标注分别按 1-5 分制打分。结果:两层均有 93.5% 的样本获得最高分 5,96.8% 至少 4 分;仅 3.2% 为弱评分样本。论文对弱样本的个案剖析(如 “UI” 可合理解释为 urinary infection 或 urinary incontinence;“pissed off” 被标为 Feeling angry 但评估者认为缺乏更优 SNOMED 概念)表明残余误差主要源于概念空间本身的粒度限制,而非标注粗糙。
§3.7 采集周期
原始文本采集范围是 2015-2018 年四个完整年度的 Reddit 帖子;数据集构建与标注在 2020 年完成,2020 年 10 月随论文首次发布。语料时间快照固定于 2018 年底,此后未增补新帖。
采集-构建管道各阶段时间与产物:
| 阶段 | 时间 | 产物 |
|---|---|---|
| 爬取 | 覆盖 2015-2018 全部帖子 | 68 个 subreddit、80 万+ 条讨论 |
| 清洗与抽样 | 2020 年构建期 | 去除删除帖/机器人评论;10 万条子样本 |
| NER 候选筛选 | 2020 年构建期 | Flair 模型识别 6.5 万+ 唯一术语 |
| 隐私过滤与频次筛选 | 2020 年构建期 | ≥5 名用户提及的热门 8K 实体 |
| 人工标注 | 2020 年构建期 | 20,015 条双层 SNOMED 提及 |
| 发布 | 2020-10/11 | arXiv + EMNLP + GitHub 数据 |
§3.8 地域覆盖
语料语言为英语,用户来自 Reddit 全球社区(以北美、欧洲英语区为主),官方未公布发帖者地域分布统计。由于所有帖子经匿名化处理且仅保留高频词项,不存在可定位个体的地理信息;对地域敏感的用药文化差异(如非处方药品牌名区域变体)在该语料中不可控变量化。
| 维度 | 口径 | 使用建议 |
|---|---|---|
| 语言 | 英语(官方唯一语言) | 非英语场景需翻译或跨语言方案 |
| 地域分布 | 官方未公布,Reddit 英语区为主 | 勿做国别级流行病学推断 |
| 品牌药名 | 含区域口语变体(如 MSM 等) | 部署前用目标市场词表校准 |
| 时区/节假日语义 | 无时间戳,不可分析 | 时序类研究不可用本语料 |
§3.9 设备与传感器规格
不适用。COMETA 为纯文本数据集,不包含任何设备、影像、信号或传感器字段;其"采集端"仅涉及 Pushshift 与 Reddit API 两个文本抓取通道。
§3.10 深度溯源链
| 环节 | 内容 |
|---|---|
| 原始数据 | Reddit 公开帖文,68 个健康主题 subreddit,2015-2018,经 Pushshift 与 Reddit API 爬取,约 80 万条讨论 |
| 清洗 | 剔除被删除帖子、机器人与版主评论 |
| 候选筛选 | 在 10 万条随机子样本上运行 Flair NER(以 HealthUnlocked 论坛语料训练),得到 6.5 万余个唯一医学术语 |
| 隐私过滤 | 剔除个人可识别信息;仅保留至少 5 名不同用户提及过的词项 |
| 标注 | 2 名生物医学博士对最热门 8K 实体做双层 SNOMED CT 标注,产出 20,015 条提及 |
| 质检 | 独立 2 组评估者抽检 1K 条,93.5% 满分、96.8% ≥4 分 |
| 发布 | GitHub 仓库(代码+划分+链接),EMNLP 2020 论文,预训练向量随同发布 |
§4 数据结构
§4.0 目录树
以下为官方 GitHub 仓库的顶层结构;语料 ZIP 解压后即含四套划分的 TSV 文件(各划分目录内含 train/dev/test 三个文件):
cometa/ # GitHub 仓库根目录
├── README.md # 项目说明、下载链接、引用条目
├── LICENSE # MIT License(2025-03 添加)
├── data/ # 划分文件与数据说明
│ ├── stratified_general/ # 分层-字面义划分
│ │ ├── train.tsv
│ │ ├── dev.tsv
│ │ └── test.tsv
│ ├── stratified_specific/ # 分层-上下文义划分
│ │ ├── train.tsv
│ │ ├── dev.tsv
│ │ └── test.tsv
│ ├── zero_shot_general/ # 零样本-字面义划分
│ │ ├── train.tsv
│ │ ├── dev.tsv
│ │ └── test.tsv
│ └── zero_shot_specific/ # 零样本-上下文义划分
│ ├── train.tsv
│ ├── dev.tsv
│ └── test.tsv
├── experiments/ # 20 个基线的实验脚本与结果
└── src/ # 通用工具代码
§4.1 DAIMS 字段字典
COMETA 核心表的 8 列字段字典(TSV 列名以官方发布为准,论文 Table 7 为准绳):
| 字段名 | 类型 | 说明 | 示例值 | AI 用途 | 观测误差 | 信息性缺失编码 | 取值范围 |
|---|---|---|---|---|---|---|---|
| ID | Integer | 提及条目唯一编号 | 42 | 主键,划分对齐 | 无 | 无 | 0-20,014 |
| Term | Text | 实体表面形式(口语术语) | bloods | 检索 query 的核心输入 | 拼写变体、俚语 | 无 | 6,404 个唯一术语 |
| General SCTID | Integer | 字面义 SNOMED 概念码 | 432098007 | 字面义链接标签 | 概念粒度争议(约 3.2% 弱评分) | 无 | 3,645 个唯一概念 |
| Specific SCTID | Integer | 上下文义 SNOMED 概念码 | 273864004 | 上下文义链接标签 | 多义词争议(453 个术语多 Specific 码) | 无 | 4,003 个唯一概念 |
| Example | Text | 来自 Reddit 的例句 | went to get bloods done at 11 30 | 上下文特征、消歧证据 | 口语噪声、拼写误差 | 无 | 19,911 条唯一例句 |
| Subreddit | Text | 例句来源子版块 | r/AskDocs | 领域分层、偏倚分析 | 无 | 无 | 68 个 subreddit |
| General label | Text | General 概念首选术语 | Blood test | 可读性、检索显示 | 同名概念需以 SCTID 区分 | 无 | SNOMED 首选术语 |
| Specific label | Text | Specific 概念首选术语 | Blood test | 可读性、检索显示 | 同上 | 无 | SNOMED 首选术语 |
§4.2 标签分布
标注概念按 SNOMED 顶层域的分布(论文 Figure 2 / §3.3):
| SNOMED 域 | 占比 | 说明 |
|---|---|---|
| Clinical finding(临床发现) | 44.4% | 症状、体征、疾病感受类表述 |
| Substance(物质) | 23.1% | 药物成分、食物、成瘾物质等 |
| Body structure(身体结构) | 10.9% | 器官、解剖部位口语指称 |
| Procedure(操作) | 7.8% | 检查、手术、验血等 |
| Pharmaceutical/biologic product | 3.7% | 具体药品与生物制品 |
| 其余域合计 | <10% | 如 finding 之外的情境类概念 |
双层标注差异统计:4.5% 的提及两层概念不同;31 个术语关联多个 General SCTID;453 个术语关联多个 Specific SCTID;部分概念拥有超过 15 种表面形式(如 Oral contraception、Feeling bad、Crohn’s Disease)。
§4.3 关键统计
| 统计项 | 数值 | 来源 |
|---|---|---|
| 实体提及总数 | 20,015 | 论文 §3.1 |
| 唯一例句字符串 | 19,911 | 论文 §3.3 |
| 唯一术语(表面形式) | 6,404 | 论文 §3.3 |
| 唯一 General 概念 | 3,645 | 论文 §3.3 |
| 唯一 Specific 概念 | 4,003 | 论文 §3.3 |
| 双层概念不同的提及比例 | 4.5% | 论文 §3.3 |
| 每概念例句数 | 平均 ≥5,中位数 3 | 论文 §3.3 |
| 原始爬取讨论量 | 80 万+ 条 | 论文 §3.1 |
| NER 候选术语 | 6.5 万+ 个 | 论文 §3.1 |
| 纳入标注的热门实体 | 8,000 个 | 论文 §3.1 |
上述统计可直接写成加载自检断言:
# 论文统计一致性断言(加载后立即执行)
assert len(full) == 20015, f"提及总数异常: {len(full)}"
assert full["Term"].nunique() == 6404, "唯一术语数不符"
assert full["Example"].nunique() == 19911, "唯一例句数不符"
gen = full["General SCTID"].nunique()
spe = full["Specific SCTID"].nunique()
assert gen == 3645, f"General 概念数 {gen} != 3645"
assert spe == 4003, f"Specific 概念数 {spe} != 4003"
mismatch = (full["General SCTID"] != full["Specific SCTID"]).mean()
assert abs(mismatch - 0.045) < 0.005, f"双层不一致率 {mismatch:.3f}"
print("COMETA 完整性自检全部通过")
§4.4 数据层级
COMETA 的层级结构自上而下为:语料库(20,015 条提及,四套划分共享同一底层记录)→ 提及实例(唯一例句字符串 19,911 条,同一术语可在多子版块多语境出现)→ 术语(6,404 个唯一表面形式,可携带多个 SCTID)→ SNOMED 概念(General 3,645 个 / Specific 4,003 个,挂接 SNOMED CT 概念图的 is-a 层级与跨域映射)。与影像数据"患者→检查→序列→切片"的层级不同,COMETA 的层级核心是"多对一"的多义消解链:多个表面形式 → 一个上下文概念。
| 层级 | 单元数 | 关键属性 | 下游用途 |
|---|---|---|---|
| 语料库 | 1 个(四套划分) | 20,015 条提及;2015-2018 快照 | 全局统计、版本管理 |
| 提及实例 | 19,911 条唯一例句 | 例句 + 子版块 + 帖子链接 | 上下文建模、按帖聚合 |
| 术语 | 6,404 个唯一表面形式 | 可携带多个 SCTID(31/453 多值) | 词表管理、OOV 检测 |
| SNOMED 概念 | 3,645 General / 4,003 Specific | is-a 层级、跨域映射 | 概念索引、层级软标签 |
§4.5 缺失值与信息性缺失
COMETA 六个核心列均为必有列,语料发布时已完成完整性控制,不存在传统意义上的缺失单元格;NLP 数据集中常见的"信息性缺失编码"设计亦不适用。两个容易与"缺失"混淆的现象需要区分:其一,NIL 实体(SNOMED 中无对应概念者)已在构建期被整体排除,因此语料内不存在"无正解"样本——这既是质量保证,也是 §7 所述长尾偏倚的来源;其二,一个术语对应多个 SCTID(31 个多 General 码、453 个多 Specific 码)在扁平表中表现为同一 Term 出现多行,属结构性多值而非数据错误,处理方式见坑点 4。
§5 划分与使用建议
§5.1 官方划分
官方提供 2 种采样策略 × 2 层标注 = 4 套 train/dev/test 划分(规模见 §3.2)。Stratified 划分保证测试/开发集中每个 SCTID 至少在训练集出现一次(概念覆盖率 100%,但表面形式仅覆盖 58%——即测试中 42% 的表面形式是新写法);Zero-Shot 划分则让开发/测试集只包含训练中完全未见过的概念,被论文定位为更贴近真实部署的"最难设置"。选择哪套划分不是技术细节而是研究声明:报告结果时必须显式注明划分与标注层。
§5.2 社区惯例
社区实践基本收敛于:主结果报告 Stratified General 的 Acc@1/Acc@5,附 Zero-Shot General 作为泛化指标(SapBERT、BioELQA 等后续论文均沿用此口径);Specific 层结果多作为消融而非主表。BELB 基准将 COMETA 与其他生物医学 EL 数据集统一集成,提供一致的加载与评测入口,但注意其可能对划分做统一化重排,与官方文件数字不完全逐行对齐。SapBERT 的微调协议(bi-encoder + 多相似性损失 + 难对挖掘)已成为事实上的训练配方基线。
三条来自社区实践的隐性约定值得遵守:其一,比较他文数字前先确认其检索空间(概念池 vs 全 SNOMED),否则 4K 池与 35 万池的结果没有对话基础;其二,FIRE 2021 等增广研究显示通俗术语 NER 假阳性仍可被正确归一,说明"提及检测 → 概念链接"两阶段方案在此语料上是可行管线;其三,AAAI 2023 的跨实体交互工作表明,在编码器内引入候选实体间比较是超越简单双编码器的可靠路径。
§5.3 划分策略建议与泄漏风险
自行重划分手动实现时需警惕三类泄漏:表面形式泄漏——同一 Term 若同时落入 train 与 test,字典法即可"背答案",Stratified 划分中字典法 51% 对 Zero-Shot 中 0% 的暴跌正是该效应的直接证据,自行划分必须按 SCTID 分层而非随机切行;上下文泄漏——同一例句的不同片段或同一帖子的多个提及分属两侧,会使模型记忆帖子级语境,建议重划分时按 Reddit 帖子链接聚合切分;子版块泄漏——r/AskDocs 与 r/cancer 等社区的术语风格差异显著,若用于领域泛化研究应按子版块分组交叉验证。官方四套划分已在前两类上做了控制,直接使用官方文件是最安全的选择。
§5.4 交叉验证建议
小样本消融或超参搜索时,建议在训练集内部做按 SCTID 分组的 K 折交叉验证(GroupKFold,group = SCTID),以免同一概念的 不同表面形式跨折泄漏;零样本能力评估则应保持"概念分组"原则自建 held-out 概念集。切勿对全量 20,015 条做随机 K 折——那会同时破坏 Stratified 与 Zero-Shot 两种协议的可比性。
| 验证目的 | 推荐做法 | 关键约束 |
|---|---|---|
| 超参搜索 | 训练集内 GroupKFold(group=SCTID) | dev 概念不得跨折 |
| 零样本模拟 | 自建 held-out 概念集 | 声明为非官方协议 |
| 稳定性检验 | 多随机种子 × 官方划分 | 划分文件保持原样 |
| 领域稳健性 | 按子版块分组留一验证 | 子版块清单来自 Example 列 |
§5.5 外部验证建议
完成 COMETA 训练的模型,建议依次迁移到:AskAPatient(药品口语名,同属社媒语域)、MedNorm(聚合社媒,MedDRA 目标空间)、BC5CDR/NCBI Disease(科学文本,检验反向迁移),以及最新年份采集的 Reddit 数据(检验时间漂移,见 §7.6)。跨数据集比较时注意目标本体不同(SNOMED CT vs RxNorm vs MedDRA),应报告"本体映射后可比子集"或使用统一 UMLS CUI 中介。
§6 AI 就绪指南
§6.0 云端快速启动
COMETA 体量小,任何免费 Colab/Jupyter 实例均可承载全流程训练。最快路径:Colab 中用 gdown 拉取 Google Drive 数据包 → 解压读 TSV → 直接套用 §6.4 的 DataLoader。若使用 HuggingFace 生态,配套的 cambridgeltl/BioRedditBERT-uncased 可一行加载(见 §6.1)。
# Colab 一键启动脚本:下载 → 解压 → 验证加载
!pip -q install gdown pandas
import gdown, zipfile
gdown.download(
"https://drive.google.com/uc?id=19xMeEdiBPUlGkblsRYXh9RIEZ5TUML3w",
"cometa.zip", quiet=False)
with zipfile.ZipFile("cometa.zip") as zf:
zf.extractall("data/")
# 验证:四套划分 × train/dev/test 应全部可读
import pandas as pd
from pathlib import Path
for family in ["stratified_general", "stratified_specific",
"zero_shot_general", "zero_shot_specific"]:
n = sum(len(pd.read_csv(p, sep="\t", dtype=str))
for p in Path("data").rglob("*.tsv") if family in str(p))
print(f"{family}: 已加载")
§6.1 快速上手
# ============================================================
# 快速上手:加载 COMETA Stratified General 划分
# ------------------------------------------------------------
# 目录结构预期(data_root 指向解压后的语料目录):
# data_root/
# ├── stratified_general/{train,dev,test}.tsv
# ├── stratified_specific/{train,dev,test}.tsv
# ├── zero_shot_general/{train,dev,test}.tsv
# └── zero_shot_specific/{train,dev,test}.tsv
# data_root 拼接关系:data_root = 解压根目录 + 划分子目录
# 最小可用子集:仅 stratified_general 一套三个 TSV 即可跑通
# 本节示例与 §6.9 评估;其余划分用于泛化实验
# ============================================================
import pandas as pd
from pathlib import Path
data_root = Path("data/stratified_general") # 修改为你的解压路径
def load_cometa(split_dir: Path):
frames = []
for split in ["train", "dev", "test"]:
df = pd.read_csv(split_dir / f"{split}.tsv", sep="\t", dtype=str)
df["split"] = split
frames.append(df)
return pd.concat(frames, ignore_index=True)
cometa = load_cometa(data_root)
# TSV 列:ID / Term / General SCTID / Specific SCTID /
# Example / Subreddit(+ 两个概念标签字符串列)
print(cometa[["ID", "Term", "General SCTID", "Specific SCTID"]].head())
print(f"总提及数: {len(cometa):,}")
print(f"唯一术语数: {cometa['Term'].nunique():,}")
print(f"两层标注不一致比例: "
f"{(cometa['General SCTID'] != cometa['Specific SCTID']).mean():.1%}")
预期输出:总提及数 20,015;唯一术语数 6,404;不一致比例约 4.5%(与论文 §3.3 一致,可当作加载正确性的自检断言)。
§6.2 数据获取
| 渠道 | 链接 | 形态 | 说明 |
|---|---|---|---|
| Google Drive(官方) | 见 GitHub README | cometa.zip | 可用 gdown 程序化下载 |
| Dropbox(官方) | 见 GitHub README | cometa.zip | 直链下载,无需登录 |
| GitHub 仓库 | github.com/cambridgeltl/cometa | 代码+划分说明 | 数据本体在网盘,仓库只含结构 |
| 预训练向量 | HuggingFace cambridgeltl/BioRedditBERT-uncased | 模型权重 | 与语料同源的 Bioreddit 语料训练 |
# Google Drive 程序化下载(官方 README 提供的文件 ID)
# pip install gdown
import gdown
file_id = "19xMeEdiBPUlGkblsRYXh9RIEZ5TUML3w"
gdown.download(f"https://drive.google.com/uc?id={file_id}",
"cometa.zip", quiet=False)
import zipfile
with zipfile.ZipFile("cometa.zip") as zf:
zf.extractall("data/") # 解压后按 §6.1 的目录结构使用
无申请流程、无注册、无 DUA——这是 COMETA 相对 PhysioNet 系数据集的最大工程优势;对应地,使用时请自觉遵守 MIT 许可与 Reddit 服务条款(见 §7.4)。
下载后建议执行的三步自检清单:
| 步骤 | 检查内容 | 预期结果 |
|---|---|---|
| 1 | 解压后四套划分文件齐全 | stratified/zero_shot × general/specific 均有 train/dev/test |
| 2 | Stratified General 三文件行数 | 13,489 / 2,176 / 4,350(与论文 Table 2 一致) |
| 3 | 概念池去重计数 | General 层 SCTID 去重 = 3,645(与论文 §3.3 一致) |
三项自检全部通过后再进入训练,可将"文件版本拿错/划分混用"类事故在入口处拦下(对应坑点 2)。
§6.3 预处理全流程
医学实体链接的主流训练范式是双编码器检索:把 3,645/4,003 个 SNOMED 概念编码为向量索引,再把提及(含上下文)编码后做最近邻检索。以下是可运行的最小预处理流程:
# ============================================================
# 预处理:构建概念字典 + 清洗函数
# 依赖:pip install pandas transformers torch
# ============================================================
import pandas as pd
import re
URL_RE = re.compile(r"https?://\S+|www\.\S+")
WS_RE = re.compile(r"\s+")
def clean_example(text: str) -> str:
"""轻量清洗:去 URL、压缩空白;保留口语原貌(大小写、缩写)。
切勿小写化全句后再喂 uncased 模型做字符串比对——
大小写本身是缩写消歧线索(见坑点 6)。"""
text = URL_RE.sub(" ", str(text))
return WS_RE.sub(" ", text).strip()
# 1) 载入全部四套划分,构建"概念池"(去重 SCTID)
split_dirs = ["stratified_general", "stratified_specific",
"zero_shot_general", "zero_shot_specific"]
rows = []
for d in split_dirs:
rows.append(load_cometa(Path("data") / d))
full = pd.concat(rows, ignore_index=True).drop_duplicates(subset=["ID"])
concept_table = (
full[["General SCTID", "General label"]]
.rename(columns={"General SCTID": "sctid", "General label": "label"})
.drop_duplicates(subset=["sctid"])
)
# 2) 例句清洗(原文本保留在 raw 列,便于审计)
full["example_clean"] = full["Example"].map(clean_example)
# 3) 训练样本 = (上下文+术语文本, 正解 SCTID)
train_df = full[full["split"] == "train"][["Term", "example_clean",
"General SCTID"]]
train_df = train_df.rename(columns={"General SCTID": "sctid"})
print(f"概念池大小: {len(concept_table):,}") # General 层应为 3,645
print(train_df.head())
要点:概念池必须按 SCTID 去重而非按 label 去重(坑点 4);同一 SCTID 的全部同义表面形式都应编入索引以提升召回。
§6.4 PyTorch DataLoader
# ============================================================
# 双编码器训练 DataLoader:提及侧(Example+Term) vs 概念侧(label)
# 骨干可用 cambridgeltl/BioRedditBERT-uncased 或 SapBERT 权重
# ============================================================
import torch
from torch.utils.data import Dataset, DataLoader
from transformers import AutoTokenizer, AutoModel
MODEL_NAME = "cambridgeltl/BioRedditBERT-uncased"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
class MentionDataset(Dataset):
"""每条样本 = 例句上下文 + 术语 → 正解 SCTID"""
def __init__(self, df, max_len=128):
self.mentions = [
f"{ex} [SEP] {term}"
for ex, term in zip(df["example_clean"], df["Term"])
]
self.labels = df["sctid"].astype(str).tolist()
self.max_len = max_len
def __len__(self):
return len(self.mentions)
def __getitem__(self, idx):
enc = tokenizer(self.mentions[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": self.labels[idx],
}
class ConceptDataset(Dataset):
"""概念侧:每个 SCTID 的全部同义表面形式(label 字符串)"""
def __init__(self, concept_table, max_len=32):
self.texts, self.sctids = [], []
for _, row in concept_table.iterrows():
self.texts.append(str(row["label"]))
self.sctids.append(str(row["sctid"]))
self.max_len = max_len
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
enc = tokenizer(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),
"sctid": self.sctids[idx],
}
train_loader = DataLoader(
MentionDataset(train_df), batch_size=64,
shuffle=True, num_workers=2, drop_last=True)
concept_loader = DataLoader(
ConceptDataset(concept_table), batch_size=128, shuffle=False)
encoder = AutoModel.from_pretrained(MODEL_NAME)
def encode_batch(encoder, batch):
out = encoder(input_ids=batch["input_ids"],
attention_mask=batch["attention_mask"])
return out.last_hidden_state[:, 0, :] # [CLS] 向量
for step, batch in enumerate(train_loader):
mention_emb = encode_batch(encoder, batch) # B x H
# 概念向量建议离线一次性编码缓存(3,645 个概念秒级完成),
# 训练循环内用 InfoNCE/MultiSimilarity 损失拉近正解概念。
break
推理阶段:离线编码概念池 → torch.cdist 或 FAISS 做最近邻 → 取 Top-1/Top-5 SCTID,按 §6.9 计算 Acc@1/Acc@5。
§6.5 坑点清单
以下 8 个坑点全部源自 COMETA 的真实失败模式:4 个来自论文正文与表格的直接证据(双层标注、四套划分、表面形式泄漏、上下文依赖),2 个来自官方使用建议(SCTID 检索、SNOMED 版本机制),2 个来自构建协议的隐含约束(频次筛选、配套资源使用方式)。每条按"问题/症状/解决(简单→进阶→SOTA)/参考"四段展开。
⚠️ 坑点 1:General/Specific 双层标注混用导致结果不可比(分类:标签理解)
问题:每条提及有两层 SNOMED 标签,4.5% 的提及两层概念不同(如 “bloods” 字面是 Blood,上下文是 Blood test)。训练用一层、评测用另一层,或两层样本混批,会让模型学到矛盾的监督信号,分数虚低或虚高均有可能。
症状:同一模型在自报"同一划分"上的 Acc@1 与论文/他人复现相差 5-10 个百分点;loss 曲线在少量多义词样本上反复震荡;抽检 bad case 发现"标错"的样本实际是另一层标签。
解决:
- 简单方法:全流程锁定单层标签(建议 General 层作为主协议),加载时显式只读取对应列并断言列名。
- 进阶方法:双层各训练一份模型;或在训练目标中把 (General SCTID, Specific SCTID) 联合建模——正样本对同时拉近两层概念,评测分别报告两套 Acc@1。
- SOTA 方法:上下文感知的交叉编码器,把 Example 拼入 query 端(见坑点 8),让模型隐式学习"何时两层该一致、何时该分化";对照双层一致性比例 4.5% 作为消融上限。
参考:COMETA 论文 §3.2-§3.3(双层定义与 4.5% 统计);Table 1 多义示例。
⚠️ 坑点 2:四套官方划分混用导致跨论文数字不可比(分类:评估误用)
问题:官方有 SG/SS/ZG/ZS 四套 train/dev/test,规模各不相同(如 train 从 13,441 到 14,062 不等)。跨划分比较或混合加载,会把"分层泛化"与"零样本泛化"两种性质完全不同的能力混为一谈。
症状:复现结果与原文差距巨大且方向不定;论文 A 的 0.79 与论文 B 的 0.54 被并排写进同一张对比表;dev/test 指标忽好忽坏。
解决:
- 简单方法:数据加载器显式接受
split_family(stratified/zero_shot)与level(general/specific)两个参数,物理隔离四套文件。- 进阶方法:在实验管理系统中把划分名写进 run 名与指标前缀(如
SG/acc@1、ZS/acc@1),导出报表时强制带前缀。- SOTA 方法:对齐社区主口径——主表报 Stratified General,附 Zero-Shot General 作为泛化指标(SapBERT、BioELQA 均如此),其余两套仅作消融;引用他文数字时核对原论文所用划分再入库。
参考:COMETA 论文 Table 2(四套划分规模);SapBERT 论文评测协议章节。
⚠️ 坑点 3:Stratified 划分中的表面形式泄漏高估真实能力(分类:数据泄漏)
问题:Stratified 按 SCTID 分层,保证测试概念在训练集出现,但只有 58% 的测试表面形式在训练集出现过——其余 42% 是同一概念的新写法。更关键的是,若自行随机切行而非用官方文件,同名词会直接落入 train/test 两侧,字典法即可"背答案"。
症状:字典匹配在 Stratified 上 Acc@1 达 0.51,在 Zero-Shot 上直接归零(论文 Table 3);自建划分下简单模型分数异常高,换成新采集数据后断崖下跌。
解决:
- 简单方法:直接使用官方四套划分文件,绝不自行随机切分全量数据。
- 进阶方法:审计训练/测试的表面形式重叠率(对 Term 列做集合交),报告"seen/unseen surface form"两档指标;按 SCTID GroupKFold 复现 Stratified 语义。
- SOTA 方法:以 Zero-Shot 协议为主结果(论文明确其为更贴近 35 万 SNOMED 概念真实覆盖的设置),并在论文中同时披露两协议数字,避免选择性报告。
参考:COMETA 论文 §3.4(58% 表面形式覆盖率论证)、Table 3(字典 0.51 → 0 的对照)。
⚠️ 坑点 4:用 label 字符串而非 SCTID 检索概念节点(分类:标签理解)
问题:TSV 中除 SCTID 外还有两个概念标签字符串列。SNOMED CT 中同一首选术语可对应多个不同概念节点(歧义术语),以 label 为主键做去重、建索引或映射 UMLS,会静默合并/错配概念。
症状:概念池数量比 3,645/4,003 偏小;评测脚本报"gold 不在候选池"错误;同一 SCTID 在不同文件解析后对不上;与 UMLS CUI 对接时出现一对多冲突。
解决:
- 简单方法:全管线以 SCTID 为唯一主键;label 仅用于日志显示。官方文档明确建议"始终使用 SCTID 检索目标节点"。
- 进阶方法:加载后断言概念池大小与论文统计一致(General 3,645 / Specific 4,003);对 453 个多 Specific SCTID 的术语输出审计清单,人工确认多值语义。
- SOTA 方法:接入 SNOMED CT 概念图,利用 is-a 祖先链做层级软标签或层次化召回,把"表面形式 → 精确 SCTID"扩展为"表面形式 → 概念邻域"。
参考:COMETA 论文附录 A.2(Table 7 与 SCTID 检索建议);§3.3 多 SCTID 统计。
⚠️ 坑点 5:SNOMED CT 版本漂移使部分 SCTID 失效(分类:预处理陷阱)
问题:SNOMED CT 每个发布版本都会新增、合并、停用(inactive)概念。语料标注基于论文发表时的 SNOMED 快照,若干年后再检索,个别 SCTID 可能已被标记为非当前概念,直接拉取最新术语会错配或落空。
症状:概念表构建时少数 SCTID 查无此码;同一 SCTID 在两个版本的 SNOMED 发行包中首选术语不同;下游医院系统集成时报概念已过期。
解决:
- 简单方法:固定一个 SNOMED CT 国际版发布版本(与标注期接近的版本),在实验配置中显式记录版本号,全项目统一。
- 进阶方法:拉取概念时校验 active 标志位,对 inactive 概念输出清单并改用历史关联(historical association)把旧码映射到当前替代码。
- SOTA 方法:建立 SCTID 版本映射表做双向追踪,论文复现走旧版本、部署走新版本并附映射报告;跨术语系统时统一升维到 UMLS CUI 中介。
参考:SNOMED International 版本发布机制(官方文档);COMETA 论文附录 A.2 的 SCTID 使用建议。
⚠️ 坑点 6:Reddit 口语文本预处理破坏消歧线索(分类:预处理陷阱)
问题:语料的全部难点都藏在口语形态里:拼写随意、俚语、缩写(gad/UI/MSM/benzos)。激进的规范化(全小写化、词干化、去标点、拼写纠正字典)会连同消歧线索一起抹掉——例如缩写大小写模式、原句的否定词"not/never"。
症状:清洗后模型在多义缩写样本上系统性错链;字符串匹配基线分数反而比清洗前更高;Spell-checker 把口语药名"纠正"成无关单词导致检索 miss。
解决:
- 简单方法:最小清洗——仅去 URL、压缩空白(见 §6.3 代码),保留大小写与标点原貌交给模型。
- 进阶方法:改用在同域 Reddit 语料上预训练的 BioRedditBERT-uncased 做编码器(uncased 模型内部自行处理大小写),其领域词表覆盖 benzos/bloods 等口语词,官方已提供权重。
- SOTA 方法:mention 端与上下文端分离编码——术语字符串进 one-tower、例句进另一路,融合时保留术语的原始字符形态(char n-gram),兼顾形态匹配与语境消歧。
参考:COMETA 论文 Table 1(口语挑战示例);cambridgeltl/BioRedditBERT-uncased 模型卡。
⚠️ 坑点 7:频率筛选造成的长尾与 NIL 偏倚高估部署表现(分类:偏倚陷阱)
问题:构建期只保留了被至少 5 名不同用户提及、且位列最热门 8K 实体的术语,并整体排除了 SNOMED 中无对应概念的 NIL 提及。真实部署时遇到的长尾口语词、错拼词、以及"根本没有标准概念"的情绪表达,在语料中一次都没有出现——评测分数天然偏乐观。
症状:线上系统对语料内术语链接良好,对未登录词强行给出错误链接(无拒绝机制);bad case 里大量口语描述被硬塞进不相关临床发现概念。
解决:
- 简单方法:部署管线增加 OOV 检测——术语不在 6,404 词表时走人工/兜底通道,并如实统计该比例。
- 进阶方法:训练 NIL/拒识检测器:用检索分数分布(Top-1 相似度与 Top-1/Top-2 间隔)做阈值校准,低于阈值输出"无对应概念"。
- SOTA 方法:生成式重写 + 检索回退:先用 LLM 把口语短语规范化为标准医学表述再检索,规范化置信度与检索分数联合决策;对新增概念用增量索引而非重训。
参考:COMETA 论文 §3.1(≥5 用户阈值与 8K 实体筛选);§3.2(NIL 排除与弱评分个案)。
⚠️ 坑点 8:只用术语字符串、丢弃上下文例句导致多义词误链(分类:工程陷阱)
问题:许多实现把任务简化为"字符串 → SCTID"的静态映射,完全忽略 Example 列。这对 95.5% 的单义样本无伤,但对多义与需要推理的样本(“up all night cleaning”→强迫障碍;“gad” 依赖同句 “benzos”)是致命的——而恰是这些样本定义了社媒实体链接的难度上限。
症状:mention-only 模型的错误高度集中于多义缩写;在 Stratified 上尚可(靠表面形式记忆),在 Zero-Shot 上接近随机;把成熟临床管线(如 cTAKES)直接迁移时,EHR 上 95%+ 的准确率在 COMETA 上跌到约 50%。
解决:
- 简单方法:把 Example 与 Term 拼接作为 query 文本(
"{example} [SEP] {term}",见 §6.4),零成本引入上下文。- 进阶方法:训练时以多相似性损失 + 在线难对挖掘微调 bi-encoder(SapBERT 配方),使表示空间对上下文敏感。
- SOTA 方法:检索-重排两级架构:bi-encoder 粗召回 Top-K,cross-encoder 或 kNN 上下文模块(如 BioELQA 的 kNN 记忆 + 选择式生成)用例句间交互精排——BioELQA 在 COMETA 上把 Acc@1 推到 85.2。
参考:COMETA 论文 Figure 1/Table 1(上下文推理示例);SapBERT(NAACL 2021);BioELQA(2024)。
§6.6 数据增强
安全增强 ✅:
- 同概念表面形式替换:从同一 SCTID 的其他例句中借表面形式(部分概念有 15+ 种写法),保持标签不变;
- 回译/同义改写仅作用于上下文 Example、不动 Term 与标签;
- 上下文窗口扰动:截断例句前后缀生成难度梯度;
- 概念侧增强:把 SNOMED 同义词、首选术语变体编入索引侧(不触碰标注)。
危险增强 ❌:
- 跨标签随机交换术语与例句:多义术语(4.5% 双层不一致 + 多 SCTID 术语)会制造大量错误监督;
- 拼写噪声注入后仍用原 SCTID:口语术语的拼写变体可能合法地指向另一概念;
- 用 LLM 无约束改写例句再当真值:会引入幻觉概念,破坏专家标注的置信度声明。
同概念表面形式替换的可运行示例:
# 安全增强:为同一 SCTID 的提及借用同概念其他表面形式做增广
# 只从训练集内部借词,严禁借用 dev/test 中的表面形式(泄漏!)
def augment_by_synonyms(train_df, concept_pool, max_aug=1):
# concept_pool: SCTID -> 该概念在训练集内的全部表面形式列表
aug_rows = []
for _, row in train_df.iterrows():
synonyms = concept_pool.get(str(row["sctid"]), [])
if len(synonyms) > 1:
other = [s for s in synonyms if s != row["Term"]]
for s in other[:max_aug]:
aug_rows.append({**row.to_dict(), "Term": s})
return pd.concat([train_df, pd.DataFrame(aug_rows)],
ignore_index=True)
§6.7 模型推荐
| 模型/配方 | 类型 | COMETA 参考成绩 | 适用阶段 | 备注 |
|---|---|---|---|---|
| Dictionary/Stoilos 回退 | 字符串基线 | 0.79(SG,集成) | 基线与生产兜底 | 零训练成本,ZS 为 0 |
| SapBERT | 双编码器 | 65.9(零样本)/ 77.9(微调) | 主力配方 | UMLS 同义对预训练 |
| BioRedditBERT + 双编码器微调 | 双编码器 | 需自训(权重官方提供) | 领域初始化 | 与语料同源预训练 |
| Prompt-BioEL | 提示+检索 | 83.7 | 进阶 | 复现见原论文 |
| BioELQA | 检索+选择题生成 | 85.2 | SOTA 追赶 | kNN 记忆 + T5 重排 |
§6.8 硬件需求
| 任务 | 最低配置 | 推荐配置 | 说明 |
|---|---|---|---|
| 数据加载/统计/字典基线 | 4GB 内存 CPU | 8GB 内存 | TSV 全量可驻内存 |
| 双编码器微调(BERT-base) | 1×16GB 显存 GPU | 1×24GB(batch 64) | 概念池 4K 内,单卡友好 |
| 概念索引编码 + FAISS 检索 | CPU 即可 | 1×8GB GPU | 4K 概念秒级完成 |
| 交叉编码器重排(Top-32) | 1×24GB GPU | 1×40GB GPU | BioELQA 类配方 |
§6.9 评估指标代码
# Acc@1 / Acc@5:与 COMETA 论文协议一致的评测
# candidate_scores: [N, C] 提及-概念相似度矩阵
# gold_sctids: [N] 正解 SCTID(在概念池中的列索引)
import torch
@torch.no_grad()
def accuracy_at_k(candidate_scores: torch.Tensor,
gold_idx: torch.Tensor,
k: int = 1) -> float:
topk = candidate_scores.topk(k, dim=1).indices # N x k
hits = (topk == gold_idx.unsqueeze(1)).any(dim=1)
return hits.float().mean().item()
acc1 = accuracy_at_k(candidate_scores, gold_idx, k=1)
acc5 = accuracy_at_k(candidate_scores, gold_idx, k=5)
print(f"Acc@1: {acc1:.3f} | Acc@5: {acc5:.3f}")
# 报告时务必注明:划分(SG/SS/ZG/ZS)+ 标注层(General/Specific)
# 辅助指标:MRR@10(重排器对比时更敏感)
@torch.no_grad()
def mrr_at_k(candidate_scores: torch.Tensor,
gold_idx: torch.Tensor, k: int = 10) -> float:
topk = candidate_scores.topk(k, dim=1).indices # N x k
ranks = (topk == gold_idx.unsqueeze(1)).float().argmax(dim=1)
reciprocal = torch.where(
(topk == gold_idx.unsqueeze(1)).any(dim=1),
1.0 / (ranks.float() + 1.0),
torch.zeros_like(ranks, dtype=torch.float))
return reciprocal.mean().item()
§6.10 MLOps 笔记
| 实践项 | 具体动作 | 防护的坑点 |
|---|---|---|
| 版本对齐记录 | 把 SNOMED CT 版本、划分文件哈希、标签层三个元数据写进每次训练 run 的配置 | 坑点 2/5 |
| 数据快照 | cometa.zip 体积小,直接把解压目录纳入 DVC/对象存储版本化 | 网盘文件悄然变更风险 |
| 指标看板 | SG/ZS 双指标并排展示;只报一档的看板视为不完备 | 坑点 2 |
| 上线守护 | 生产流量中统计 OOV 术语比例与 Top-1 分数分布漂移,超阈值告警 | 坑点 7 |
| 概念索引治理 | 概念池重建脚本与 SNOMED 版本绑定,inactive 概念走历史关联映射 | 坑点 4/5 |
| 可复现性 | Zero-Shot 划分概念集合是固定清单,任何重采样都须声明为非官方协议 | 坑点 2/3 |
- 随机种子之外,复现的真正锚点是"数据哈希 + SNOMED 版本 + 划分名"三元组,缺一不可。
- 团队协作时,建议把 §6.2 的三步自检写进 CI,数据文件一变即报。
§7 质量评估与局限性
§7.1 已知偏倚
| 偏倚类型 | 描述 | 严重程度 | 缓解措施 |
|---|---|---|---|
| 平台偏倚 | 仅覆盖 Reddit 英语用户的话语风格,Twitter/论坛/问诊平台的表达习惯未被采样 | 高 | 跨平台外部验证(AskAPatient、MedNorm);避免声称平台外泛化 |
| 频率偏倚 | 仅保留 ≥5 名用户提及的热门 8K 实体,长尾口语词被系统性排除 | 高 | NIL/拒识检测(坑点 7);报告 OOV 比例 |
| NIL 排除偏倚 | 无 SNOMED 对应概念的提及被整体剔除,"该说法根本没有标准概念"这一真实类别缺席 | 中 | 部署时增加"无对应概念"输出档 |
| 时间偏倚 | 语料冻结于 2015-2018,此后新药、新俚语、新公共事件词汇不可见 | 中 | 定期用新采集数据做漂移评估(§7.6) |
| 标注机构偏倚 | 标注集中于单一外包机构 2 名博士,个体概念偏好可能存在 | 低-中 | 独立第三方抽检(93.5% 满分)已部分覆盖 |
| 语言偏倚 | 纯英语语料,无多语言版本 | 中 | 多语言场景参考 XL-BEL 等跨语言工作 |
§7.2 标注质量
语料采用"标注-评估分离"的双重质控:2 名生物医学博士标注,2 组独立评估者(4 名 NLP 博士背景,与标注者零重叠)对 1K 随机样本打分,General 与 Specific 两层一致地达到 93.5% 满分率、96.8% ≥4 分率。论文对 3.2% 弱评分样本的个案剖析显示,残余分歧主要源于 SNOMED 概念空间粒度(如 “UI” 的两种合理消解、“pissed off” 缺乏精确对应概念),而非标注员失误。使用者应把语料理解为"专家共识 + 少量粒度歧义",对粒度敏感的应用(如计费编码)需做二次人工校验。
| 质控环节 | 配置 | 结果 |
|---|---|---|
| 标注执行 | 2 名生物医学博士(Molecular Connections 承担) | 20,015 条双层标注 |
| 独立抽检 | 2 组 × 500 条 = 1K 样本,评估者与标注者零重叠 | 93.5% 满分 / 96.8% ≥4 分 |
| 弱样本归因 | 逐条剖析 3.2% 低分样本 | 主因是概念粒度限制而非标注失误 |
| 层间一致性 | General 与 Specific 分别评估 | 两层得分率完全一致 |
§7.3 泛化性
| 目标场景 | 失效风险 | 证据 |
|---|---|---|
| 同平台新帖(2018 后) | 中:新药/新俚语 OOV | 语料冻结于 2015-2018(论文 §3.1) |
| 跨平台(Twitter/患者论坛) | 高:话语风格迁移 | 平台单一性(§7.1);cTAKES 领域落差对照 |
| 临床 EHR 文本 | 高:语域相反 | cTAKES 在 EHR >95% vs COMETA 约 50%(论文) |
| Zero-Shot 新概念 | 高:为设计目标 | ZS 最佳 0.54 vs SG 0.79(论文 Table 5) |
| 非英语语言 | 高:无对应资源 | 纯英语语料;需 XL-BEL 类方案 |
| 多义缩写密集场景(精神科) | 中-高:需上下文 | Table 1 多义示例;4.5% 双层不一致 |
§7.4 伦理与合规
语料来源为 Reddit 公开帖文,构建期执行了双重隐私保护:剔除个人可识别信息;仅保留至少 5 名不同用户提及过的词项,稀释个体关联。例句附原始帖子链接,使用者若需回溯原文,应遵守 Reddit 用户协议与平台条款,不得用于对发帖者的人身画像。数据以 MIT License 开放,但两个上游许可需注意:SNOMED CT 概念检索受 SNOMED International 国家成员许可约束;Reddit 内容本身受其服务条款约束。禁止用途:将标注概念解读为发帖者确诊(语料不含临床验证的诊断真值)、个体健康画像、以及未经独立验证直接进入临床决策。
使用前合规自查清单:
| 合规项 | 要求 | 责任方 |
|---|---|---|
| 数据许可 | 遵守 MIT License 署名与免责条款 | 使用者 |
| SNOMED CT 许可 | 确认所在国 SNOMED International 成员资格/许可 | 使用者机构 |
| Reddit 条款 | 回溯原文帖时遵守平台服务条款 | 使用者 |
| 个体保护 | 不得尝试去匿名化或画像发帖者 | 使用者 |
| 用途声明 | 不将标注概念当作发帖者确诊 | 使用者 |
| 二次发布 | 衍生数据集需保留溯源声明与本许可链 | 使用者 |
§7.5 公平性
语料匿名化后不含人口属性标签(年龄、性别、种族均不可得),无法直接做分层公平性审计。间接风险在于:Reddit 用户人口结构与一般患者人群不同,不同疾病社区(心理卫生 vs 肿瘤)的话语风格差异会与人口结构混杂;品牌药口语名的地域变体在英语区内部亦有差异。建议在部署前用目标人群数据重校准,避免把"Reddit 英语区话语分布"默认为"全体患者话语分布"。
§7.6 数据漂移
语料时间快照固定于 2018 年底。此后医学话语的真实漂移包括:新药上市带来的新口语名、公共卫生活动(如疫情)催生的新症状词汇、社区文化演变的新俚语。由于构建期只保留高频词项,漂移对 OOV 率的影响是非线性的——部署系统应持续监测术语命中率与 Top-1 检索分数分布,命中率下降即触发语料增补或模型更新流程。学术评测场景下,报告结果时应注明"语料时间快照 2015-2018"以避免跨时间断言。
建议纳入监控的漂移指标:
| 监控指标 | 计算方式 | 触发动作 |
|---|---|---|
| 词表命中率 | 线上术语落入 6,404 词表的比例 | 持续下降 → 语料增补评估 |
| Top-1 分数分布 | 线上检索得分分布 vs 训练期基线 | 均值/方差漂移 → 模型更新 |
| OOV 强行链接率 | 未登录词仍给出链接的比例 | 上升 → 检查拒识阈值(坑点 7) |
| 新概念出现频率 | 线上高频但语料外术语 Top-N 统计 | 积累到阈值 → 扩充概念池 |
§7.7 DAIMS 数据集评估
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式 | ✅ | 单一 TSV 扁平表,一行一提及,可直接进 DataFrame |
| 2 | 唯一标识 | ✅ | ID 主键;术语与例句均有唯一性统计支撑 |
| 3 | 特殊字符 | ⚠️ | 口语拼写变体、缩写、俚语密集;无控制字符问题但语义噪声高 |
| 4 | 重复行 | ✅ | 19,911 唯一例句 vs 20,015 提及的差异已由论文解释,非冗余重复 |
| 5 | 缺失编码 | ✅ | 六核心列全必有,发布期完成完整性控制 |
| 6 | 标签标识 | ✅ | 双层 SCTID 标签语义清晰,官方建议以 SCTID 为主键 |
| 7 | 罕见类分组 | ⚠️ | 长尾概念存在(多 SCTID 术语 453 个),官方未做罕见组合并 |
| 8 | 偏倚评估 | ⚠️ | 论文披露筛选阈值与排除规则,但无量化偏倚审计章节 |
| 9 | 数据字典 | ✅ | 论文附录 Table 7 提供完整字段说明 |
| 10 | 信息性缺失解释 | ❌ | 不存在信息性缺失机制(NIL 已整体排除,无占位编码) |
| 11 | 设备记录 | ❌ | 纯文本数据集,无设备/影像/信号字段 |
| 12 | 共线性 | ⚠️ | General 与 Specific 两层高度相关(95.5% 一致),联合建模需防标签泄漏 |
| 13 | 编码映射 | ✅ | SCTID 直连 SNOMED CT 概念图,可经 UMLS 映射其他术语系统 |
| 14 | 时间戳处理 | ❌ | 无帖子时间戳列,无法做时间敏感分析 |
| 15 | 划分建议 | ✅ | 官方四套划分 + 明确的协议定位说明 |
| 16 | 泄漏讨论 | ✅ | 论文显式讨论表面形式 58% 覆盖与 Zero-Shot 设计动机 |
| 17 | 标签分布 | ✅ | SNOMED 域分布量化披露(44.4%/23.1%/10.9%/7.8%/3.7%) |
| 18 | 测量偏倚 | ⚠️ | 标注-评估分离 + 抽检报告,但单一标注机构无多人冗余标注 |
| 19 | 外部验证建议 | ✅ | 官方划分即外部可复现协议;社区已形成跨数据集评测惯例 |
| 20 | 版本记录 | ⚠️ | 数据内容单一版本,但无正式版本号与变更日志 |
| 21 | 预处理脚本 | ⚠️ | 提供 20 个基线实验代码,无端到端官方预处理 pipeline |
| 22 | 合规要求 | ✅ | MIT License + 隐私处理过程透明(≥5 用户阈值) |
| 23 | 多模态对齐 | ❌ | 纯文本模态,不适用 |
| 24 | 去标识化 | ✅ | 双重隐私处理(PII 剔除 + 频次稀释)有明确文档 |
DAIMS 评分:16.5 / 24
评分解读:24 项中 14 项 ✅、5 项 ⚠️、5 项 ❌。扣分大头来自三类结构性"不适用"(设备记录、多模态对齐、时间戳列)与 NLP 语料常见的软肋(无正式版本管理、无端到端预处理 pipeline、单一机构标注)。对文本数据集而言,两个 ❌(信息性缺失、设备记录)属于模态固有属性而非质量缺陷,故其"有效评分"在纯文本基准中属中上水平——真正需要补课的是版本管理、时间戳元数据与长尾拒识设计。
对你意味着什么:如果你做的是实体链接算法研究——直接用,四套划分与 SCTID 主键已解决最容易翻车的两件事;如果你做的是面向生产的系统——必须自建三样东西:SNOMED 版本锁定机制(坑点 5)、OOV/NIL 拒识层(坑点 7)、SG/ZS 双指标监控(坑点 2/8);如果你要把它接入多模态或时序管线——此数据集提供不了任何时间与设备元数据,需要外挂其他资源。
§7.8 外部验证矩阵
| 外部数据集/场景 | 来源机构 | 评估任务 | 性能指标 | 相对内部变化 | 关键发现 |
|---|---|---|---|---|---|
| EHR 临床文本 → COMETA | 论文对照实验 | cTAKES 临床管线跨域迁移 | Acc@1 约 0.50 vs EHR 上 >0.95 | -45 个百分点以上 | 临床 NLP 直接迁移到社媒近乎腰斩 |
| UMLS 预训练 → COMETA(零样本) | SapBERT,NAACL 2021 | 无 COMETA 微调直接评测 | Acc@1 0.659 | 低于 SG 监督 SOTA 0.79 | 同义对度量学习带来强零样本迁移 |
| COMETA 微调后 | SapBERT,NAACL 2021 | 双编码器微调 | Acc@1 0.779 | 超过零样本 +12 个百分点 | 少量领域微调即可逼近集成基线 |
| 检索+选择题生成框架 | BioELQA,2024 | bi-encoder 召回 + T5 重排 | Acc@1 0.852 | 较 SapBERT 微调 +7.3 个百分点 | 实体间交互与 kNN 记忆有效突破上限 |
说明:各外部结果的划分与标签层以原论文报告为准(SapBERT/BioELQA 主口径为 COMETA 通用层评测),跨行数字因协议差异不可直接相减,仅用于刻画"迁移方向与量级"。
§8 基准性能与生态
§8.1 排行榜
以下成绩均基于官方划分与 Acc@1 口径(标注层/划分以各行注明为准)。注意:不同行的划分(Stratified vs Zero-Shot)、标注层(General vs Specific)与是否微调不同,数值不可直接横向比较:
| 排名 | 模型/方法 | 性能(Acc@1) | 年份 | 关键技术 | 完整引用 | 代码 |
|---|---|---|---|---|---|---|
| 1 | BioELQA | 85.2 | 2024 | bi-encoder 召回 + kNN 记忆 + T5 选择式生成 | Lin, Z. et al., 2024, arXiv. arXiv:2403.05108(编号以论文主页为准) | 官方主页 |
| 2 | Prompt-BioEL | 83.7 | 2024 | 提示式检索重排 | 同上(对比方法) | 同上 |
| 3 | Dictionary+Stoilos+多视图神经回退(b.8) | 79.0(Stratified General)/ 72.0(SS)/ 57.0(ZG)/ 54.0(ZS) | 2020 | 高精度字典优先 + 字符串距离 + 神经回退 | Basaldella et al., 2020, EMNLP. DOI | cambridgeltl/cometa |
| 4 | SapBERT(微调) | 77.9 | 2021 | UMLS 同义对自对齐预训练 + 度量学习微调 | Liu, F. et al., 2021, NAACL. arXiv:2010.11784 | cambridgeltl/SapBERT |
| 5 | SapBERT(零样本) | 65.9 | 2021 | 仅 UMLS 预训练,无任务微调 | 同上 | 同上 |
| 6 | 多视图神经集成(n.6) | 67.0(SG)/ 61.0(SS)/ 36.0(ZG)/ 33.0(ZS) | 2020 | FastText + BERT-MLA 多视图概念嵌入 | Basaldella et al., 2020, EMNLP. 同上 | 同上 |
| 7 | Stoilos 距离 | 51.0(SG)/ 53.0(ZG) | 2020 | 图感知字符串距离 | Basaldella et al., 2020, EMNLP. 同上 | 同上 |
榜单速读:传统监督集成的 79.0 与零样本神经的 65.9 之间存在"训练数据依赖"鸿沟;2024 年的交互式框架(BioELQA 85.2)表明上限尚未触及,但提升主要来自"用例句上下文 + 实体间比较",而非更大的骨干网络。
§8.2 SOTA 总结与选型建议
当前 SOTA 为 BioELQA 的 85.2(2024,检索 + 选择式生成)。工程选型建议:低延迟在线服务选 SapBERT 微调双编码器(77.9,单次前向即可召回);准确率优先的离线管线选 bi-encoder 召回 + cross-encoder/生成式重排;冷启动无标注场景选 SapBERT 零样本(65.9)加字典兜底——注意字典法在 Zero-Shot 概念上为 0,兜底必须配合置信度阈值(坑点 7)。
| 约束条件 | 推荐方案 | 预期水平 | 权衡 |
|---|---|---|---|
| 在线低延迟(<20ms) | SapBERT 微调 + FAISS | ~78 Acc@1 | 放弃重排收益换延迟 |
| 离线高准确率 | BioELQA 两级架构 | ~85 Acc@1 | 训练与推理成本高 |
| 无标注冷启动 | SapBERT 零样本 + 字典回退 | ~66-79 | 字典仅在已见概念有效 |
| 概念池频繁更新 | 增量索引 + 双编码器 | ~78 | 避免每次重训 |
§8.3 评测协议
标准协议四要素:① 划分文件用官方四套之一,报告中显式命名(SG/SS/ZG/ZS);② 标注层显式命名(General 为主口径);③ 指标为 Acc@1/Acc@5(正确 SCTID 是否落入候选 Top-K);④ 概念检索空间为语料概念池(3,645/4,003 个 SCTID)或扩展 SNOMED 子集——检索空间大小显著影响绝对数值,引用时须核对。同场景同层同检索空间下,数字才可直接比较。
发布结果前的协议自查表:
| 检查项 | 合格标准 | 常见违规 |
|---|---|---|
| 划分声明 | run 配置含 SG/SS/ZG/ZS 全名 | 只写 “COMETA” 不写划分 |
| 标注层声明 | Acc@1 前缀标 General/Specific | 两层结果混写一张表 |
| 检索空间 | 注明概念池大小与来源 | 用全 SNOMED 35 万概念却与 4K 池结果对比 |
| 表面形式审计 | Stratified 附 seen/unseen 分档 | 隐去字典基线 ZS=0 的事实 |
| 复现材料 | 划分文件哈希 + SNOMED 版本 | 只放随机种子不放数据哈希 |
§8.4 相关数据集
| 数据集 | 任务 | 本体 | 规模 | 与 COMETA 关系 |
|---|---|---|---|---|
| MedMentions | 科学文本实体链接 | UMLS | 约 4,700 摘要 / 33 万提及 | 科学语域对照基准 |
| BC5CDR | 化学品/疾病 NER+规范 | MeSH/MEDIC | 500 摘要 | 科学语域、同属 MEL 基准族 |
| NCBI Disease | 疾病规范 | MEDIC | 约 5,100 提及 | 小而精的疾病基准 |
| AskAPatient | 药品口语名规范 | RxNorm | 约 1.06 万条 | 社媒语域姊妹基准,SapBERT 同表评测 |
| MedNorm | 社媒概念规范化 | MedDRA/SNOMED | 23,292 短语 | 聚合社媒、面向不良事件 |
| MedRed | Reddit 药物副作用 | CADEC | 1,980 条 | 同平台小规模前作 |
| BELB | 统一 EL 基准框架 | 多本体 | 集成含 COMETA 在内多数据集 | 统一加载与评测入口 |
§8.5 关键论文 Top-7
- Basaldella, M., Liu, F., Shareghi, E., & Collier, N. (2020). COMETA: A Corpus for Medical Entity Linking in the Social Media. EMNLP 2020, pp. 3122-3137. DOI: 10.18653/v1/2020.emnlp-main.253. — 数据集原论文:构建协议、双层标注与 20 基线。
- Liu, F., Shareghi, E., Meng, Z., Basaldella, M., & Collier, N. (2021). Self-Alignment Pretraining for Biomedical Entity Representations. NAACL 2021. arXiv:2010.11784. — SapBERT:以 UMLS 同义对度量学习刷新六个 MEL 基准(含 COMETA 77.9)。
- Lin, Z. et al. (2024). Biomedical Entity Linking as Multiple Choice Question Answering. arXiv. — BioELQA:kNN 记忆 + 选择式生成,COMETA 85.2 当前最优。
- Xu, Z., Chen, Y., & Hu, B. (2023). Improving Biomedical Entity Linking with Cross-Entity Interaction. AAAI 2023. — 实体间交互 + 知识库增强预训练,于 COMETA 等 3 个基准有效。
- Liu, F., Vulic, I., Korhonen, A., & Collier, N. (2021). Learning Domain-Specialised Representations for Cross-Lingual Biomedical Entity Linking. ACL 2021. — XL-BEL:把 MEL 扩展到跨语言场景,COMETA 是其英语锚点之一。
- Ningtyas, A. M., Hanbury, A., Piroi, F., & Andersson, L. (2021). Data Augmentation for Layperson’s Medical Entity Linking Task. FIRE 2021. — 用 NER 视角研究通俗术语数据增强,多数增广假阳性仍可正确归一。
- Shi, J. et al. (2023). Knowledge-graph-enabled biomedical entity linking: a survey. World Wide Web. — 系统综述,将 COMETA 归入社媒语域代表基准。
§8.6 社区活跃度
官方 GitHub 仓库(截至 2026-09 检索):约 52 stars、7 forks、11 次 commits、2 名贡献者、无正式 release;README 最近一次实质更新为 2024-04,2025-03 补充 LICENSE。语料本身内容稳定(2020-11 后未变更)。学术侧热度显著高于代码侧:Semantic Scholar 收录引用 91+ 次(截至 2026-09),SapBERT/BioELQA 等主流 MEL 工作持续以 COMETA 为标准评测之一,BELB 等统一基准框架亦将其纳入。总体判断:维护频率低但生态地位稳固——数据已完成"冻结式"稳定,风险主要来自外链网盘失效而非社区停滞。
对两类使用者的含义:算法研究者可直接放心引用,语料与划分协议多年未变,历史结果可复现;工程团队则应在接入时立即做本地快照与哈希固化(见 §6.10),把"网盘直链"这一单点依赖消除,同时留意 BELB 等框架对划分的统一化处理是否与官方文件一致。
§8.7 生态快照
| 资源 | 类型 | 链接 | Star/热度(截至 2026-09) | 推荐理由 |
|---|---|---|---|---|
| cambridgeltl/cometa | 官方仓库 | GitHub | 52 stars | 数据入口 + 20 基线代码 |
| COMETA 论文页 | 论文 | ACL Anthology | — | 构建协议唯一权威来源 |
| BioRedditBERT-uncased | 预训练模型 | HuggingFace | — | 与语料同源的领域编码器 |
| SapBERT | 预训练模型 | HuggingFace | 高下载量 | 零样本即 65.9 的最强开箱基线 |
| Bioreddit 向量集 | 预训练向量 | GitHub basaldella/bioreddit | — | FastText/ELMo/Flair/GloVe 同源向量 |
| BELB | 评测框架 | 论文与官方仓库 | — | 多基准统一加载,含 COMETA |
§9 相关资源与引用
§9.1 官方资源清单
核心资源:
- 官方 GitHub 仓库(代码、划分说明、下载链接):https://github.com/cambridgeltl/cometa
- 论文(ACL Anthology):https://aclanthology.org/2020.emnlp-main.253/(PDF:https://aclanthology.org/2020.emnlp-main.253.pdf)
- 论文(arXiv):https://arxiv.org/abs/2010.03295
数据与模型:
- 数据直链:Google Drive | Dropbox
- 预训练模型:https://huggingface.co/cambridgeltl/BioRedditBERT-uncased
- 同源向量仓库:https://github.com/basaldella/bioreddit
索引与追踪:
- Semantic Scholar 条目:https://www.semanticscholar.org/paper/CorpusID:222179469
- DOI 解析:https://doi.org/10.18653/v1/2020.emnlp-main.253
§9.2 BibTeX 引用
@inproceedings{basaldella-etal-2020-cometa,
title = "{COMETA}: A Corpus for Medical Entity Linking in the Social Media",
author = "Basaldella, Marco and Liu, Fangyu and Shareghi, Ehsan and Collier, Nigel",
booktitle = "Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing (EMNLP)",
month = nov,
year = "2020",
address = "Online",
publisher = "Association for Computational Linguistics",
url = "https://www.aclweb.org/anthology/2020.emnlp-main.253",
doi = "10.18653/v1/2020.emnlp-main.253",
pages = "3122--3137",
}
@inproceedings{liu-etal-2021-sapbert,
title = "Self-Alignment Pretraining for Biomedical Entity Representations",
author = "Liu, Fangyu and Shareghi, Ehsan and Meng, Zaiqiao and Basaldella, Marco and Collier, Nigel",
booktitle = "Proceedings of the 2021 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies",
month = jun,
year = "2021",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2021.naacl-main.334",
}
§9.3 引用指南
使用语料本体或预训练向量时引用 basaldella-etal-2020-cometa;使用 SapBERT 权重或其训练配方时同时引用 liu-etal-2021-sapbert;在综述或方法对比中引用本数据集时,建议注明所用的划分(SG/SS/ZG/ZS)与标注层(General/Specific),以便结果可比。
按使用场景的引用组合建议:
| 使用场景 | 必引条目 | 建议补充 |
|---|---|---|
| 训练/评测实体链接模型 | basaldella-etal-2020-cometa | 所用基线论文(如 SapBERT) |
| 使用 BioRedditBERT 权重 | basaldella-etal-2020-cometa | HuggingFace 模型卡链接 |
| 零样本概念泛化研究 | basaldella-etal-2020-cometa + liu-etal-2021-sapbert | BELB 框架论文 |
| 综述/教材引用 | basaldella-etal-2020-cometa | 注明引用时的划分与标注层 |
| 药物警戒应用 | basaldella-etal-2020-cometa | 上游信号检测方法论文 |
§10 AI 使用声明卡
§10.1 AI 模型列表
本页面文本由大语言模型辅助撰写(CodeBuddy 平台 fast-model),检索阶段使用联网搜索工具获取公开资料。
§10.2 AI 参与范围
AI 负责文献检索摘要、结构组织、初稿撰写与格式排版;全部数字均转录自下列人工核验的公开来源;医学编码映射、坑点可操作性、合规声明由人工复核。AI 未访问任何非公开数据。
AI 参与边界表:
| 工作项 | 执行方 | 说明 |
|---|---|---|
| 事实检索与来源汇总 | AI(联网检索) | 5 轮检索,全部来源见 §10.3 |
| 种子信息纠错 | AI 提议 + 人工确认 | 全称/机构/venue/标注本体 4 处证伪重写 |
| 数字转录 | AI | 逐项对照论文/官方页面,见 §10.4 |
| 代码示例编写 | AI | 逻辑走查人工复核,未在真实环境执行训练 |
| 医学编码映射 | AI 初拟 + 医学编辑复核 | ICD-11 对应关系仅覆盖可确证概念 |
| 最终发布决定 | 人工 | 见 §10.6 审核日期 |
§10.3 输入来源列表
- Basaldella, M., Liu, F., Shareghi, E., & Collier, N. (2020). COMETA: A Corpus for Medical Entity Linking in the Social Media. EMNLP 2020, pp. 3122-3137. DOI: 10.18653/v1/2020.emnlp-main.253. https://aclanthology.org/2020.emnlp-main.253/
- 同论文 PDF 全文(构建流程、Table 2/3/4/5/7、附录 A.1-A.3)。https://aclanthology.org/2020.emnlp-main.253.pdf
- 同论文 ar5iv HTML 版(§3.3 规模统计、§3.4 划分统计)。https://ar5iv.arxiv.org/html/2010.03295
- Basaldella, M. et al. (2020). COMETA(arXiv 预印本页)。arXiv:2010.03295. https://arxiv.org/abs/2010.03295
- cambridgeltl/cometa 官方 GitHub 仓库(README、LICENSE、提交历史、目录结构)。https://github.com/cambridgeltl/cometa
- Semantic Scholar 论文条目(引用数 91+,CorpusID: 222179469)。https://www.semanticscholar.org/paper/a2cde1da31a61adab24e702999680108ab58e5ff
- Liu, F., Shareghi, E., Meng, Z., Basaldella, M., & Collier, N. (2021). Self-Alignment Pretraining for Biomedical Entity Representations. NAACL 2021. arXiv:2010.11784. https://arxiv.org/abs/2010.11784
- Lin, Z., Zhang, Z., Wu, X., & Zheng, Y. (2024). Biomedical Entity Linking as Multiple Choice Question Answering(BioELQA,COMETA 85.2)。https://lacuna.tiptreesystems.com/paper/biomedical-entity-linking-as-multiple-choice-question-answering/art_798efa12b0374c14a9cdd87b4186212a
- SapBERT 论文综述页(COMETA 无监督 65.9/微调 77.9/监督 SOTA 79.0 数字复述)。https://liner.com/review/selfalignment-pretraining-for-biomedical-entity-representations
- Medical Concept Normalization 综述 Table 4(社媒语料横向统计)。https://ima.qq.com/wiki/?shareId=406d5ceee8c26b41b3c8383a3114869f012006c60bd8c69acb73f971b0abf6d9&mediaId=pdf_33a732238784bca067da5a8931af9011_2481b339038a04bc6210d94a2669c65d7309711774843794&action=openDetailDrawer&webFrom=10000171
- COMETA 论文条目(OA.mg,DOI 确认)。https://oa.mg/work/10.18653/v1/2020.emnlp-main.253
- selectdataset.com COMETA 数据集条目(构建流程中文摘要,交叉验证用)。https://www.selectdataset.com/dataset/cde000f971735c0c79cc9a672501b594
- HuggingFace 模型页 cambridgeltl/BioRedditBERT-uncased(配套预训练向量)。https://huggingface.co/cambridgeltl/BioRedditBERT-uncased
- Lacuna/Tiptree Systems COMETA 论文解读页(基线三类方法与关键数字交叉验证)。https://lacuna.tiptreesystems.com/paper/cometa-a-corpus-for-medical-entity-linking-in-the-social-media/art_c0ef766420ba4897a9f98a2a398c2769
- 数据网盘直链(Google Drive / Dropbox,GitHub README 官方入口)。https://www.dropbox.com/s/e8mdpberw959xhj/cometa.zip?dl=0
§10.4 人工校验记录
| 内容模块 | 审核者 | 审核方式 | 审核状态 |
|---|---|---|---|
| 规模数字(20,015/19,911/6,404/3,645/4,003) | 千方病案医学编辑部 | 对照论文 §3.3 与 ar5iv 版逐项核对 | ✅ 已通过 |
| 四套划分规模(Table 2 数字) | 千方病案医学编辑部 | 对照论文 Table 2 核对 | ✅ 已通过 |
| 标注协议与质检数字(93.5%/96.8%) | 千方病案医学编辑部 | 对照论文 §3.2 核对 | ✅ 已通过 |
| 基线与 SOTA 数字(79.0/65.9/77.9/85.2) | 千方病案医学编辑部 | 对照原论文与 SapBERT/BioELQA 来源核对 | ✅ 已通过 |
| 种子信息纠错(全称/机构/venue/标注本体) | 千方病案医学编辑部 | 检索证伪后以官方来源为准重写 | ✅ 已验证 |
| ICD-11 映射与免责声明 | 千方病案医学编辑部 | 医学编辑核对编码与条款适配 | ✅ 已通过 |
| 代码可运行性审查 | 千方病案医学编辑部(数据工程) | 逻辑走查 + 接口核对 | ✅ 已通过 |
| 坑点 8 项与官方文档一致性 | 千方病案医学编辑部(数据工程) | 逐条溯源论文/Table 1-5/官方建议 | ✅ 已通过 |
§10.5 AI 生成章节标注
除 §10 本声明卡与 §0 审核声明为编辑部定式文本外,其余章节初稿由 AI 生成,经 §10.4 所列人工校验流程后发布。
§10.6 最后人工审核日期
2026-09-05
页面状态:published(全部内容已完成审核并发布)
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- medmentions — 共享标签:医疗NLP / 命名实体识别 / 知识图谱
- distemist — 共享标签:医疗NLP / 命名实体识别 / 知识图谱
- umls — 共享标签:医疗NLP / 命名实体识别 / 知识图谱
- biored — 共享标签:医疗NLP / 命名实体识别 / 知识图谱
- craft — 共享标签:医疗NLP / 命名实体识别 / 知识图谱
- mondo — 共享标签:医疗NLP / 命名实体识别 / 知识图谱
- pharos — 共享标签:医疗NLP / 知识图谱
- s2orc — 共享标签:医疗NLP / 知识图谱
- pubtator-central — 共享标签:医疗NLP / 命名实体识别 / 知识图谱
- slake — 共享标签:医疗NLP / 知识图谱
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。
