信息速览
MedSTS 是「Medical Semantic Textual Similarity」的缩写,指梅奥诊所健康科学研究部(Department of Health Sciences Research, Mayo Clinic)在 2018 年公布的一套英文临床句子相似度资源,方法学论文 2020 年刊于《Language Resources and Evaluation》第 54 卷第 1 期。它要回答的问题很朴素:病历里两句看起来很像的话,意思究竟一样到什么程度。为此作者从自家约三百万份去标识病历里切出句子,两两配对,筛出十七万余对候选,再人工抽出一千余对逐对打分。
它与多数可以随手下载的语料不同:数据本身没有一个公开入口。标注子集当年是作为 BioCreative/OHNLP 2018 共享任务的赛题材料发放的,此后想用只能联系作者。这个「联系作者索取」的模式,是它在 AI-ready 视角下最硬的一道边界,后文会单独说明。
也正因为这一点,介绍它时必须把三层数量分清楚:十七万余对是没有语义标签的候选池,一千二百五十对是抽样待标的池子,真正带分数、真正能拿去做评测的只有一千零六十八对。下面先给一屏速览,再逐层拆开。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全称 | Medical Semantic Textual Similarity |
| 构建方 | 梅奥诊所健康科学研究部,明尼苏达州罗切斯特 |
| 通讯作者 | Hongfang Liu;前两位作者 Yanshan Wang 与 Naveed Afzal 为共同第一作者 |
| 发表 | 《Language Resources and Evaluation》2020 年第 54 卷,57–72 页 |
| 首次公开 | 2018 年 8 月 arXiv 预印本;同年随 BioCreative/OHNLP 2018 共享任务发放 |
| 语言 | 英文 |
| 底层语料 | 约三百万份梅奥去标识病历 |
| 句子池 | 约一千四百九十万条唯一句子、三点六一九亿词元 |
| 候选句对 | 十七万四千六百二十九对,由表面相似度阈值筛出 |
| 待标抽样 | 千余对,按五段表面相似度等量抽取 |
| 标注子集 | 一千零六十八对,分训练七百五十对、测试三百一十八对 |
| 评分 | 零到五分六个整数档,两名标注者独立打分取均值 |
| 任务形式 | 回归打分,官方指标为皮尔逊相关系数 |
| 获取方式 | 无公开下载入口,联系作者索取 |
| 不包含 | 原始病历、病历号与就诊信息、语义标签以外的字段、中文或其他语种 |
§1 它要解决的具体麻烦
1.1 病历里的重复,是写着方便、读着费劲
电子病历的问题从来不是信息太少,而是同样的信息被反复写。模板、复制粘贴、常用短语,让一份随访记录里同一件事出现三遍四遍,措辞还各不相同。临床医生读一份长病历,有一大半时间花在确认「这段和前面那段说的是不是一回事」上。
自动识别这类重复,前提是先判断两句的语义有多接近。这件事在通用文本上已经做了很多年,SemEval 系列的句子相似度任务就积累了近万对人工标注。但把同样的方法搬到病历上会立刻失效:病历句子长、缩写多、剂量与单位混杂、否定与条件句密布,而且整句常常没有主语。
MedSTS 的出发点就是把这件事的数据基础补上。作者在引言里写得很直白:通用领域有现成的句对集合,临床领域没有,那就自己建一套。
1.2 三条常见的错误期待
| 常见期待 | 实际情况 |
|---|---|
| 以为它是一个可以直接下载的语料包 | 没有任何公开入口,须联系作者 |
| 以为十几万对都能拿来训练 | 有分数的只有千对,其余是空壳候选 |
| 以为它和通用语义相似度集可以互换 | 文本来自病历,语言风格与通用集差异极大 |
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 评测一个临床句子相似度系统 | 千对量级带分数的句子对,官方划分 | 够,这是它唯一被设计出来的用途 |
| 微调一个已有句子编码器 | 约七成样本用于开发 | 勉强够,只能做轻量微调 |
| 从头训练一个临床句子表示模型 | 千对量级的监督信号 | 不够,需另找大规模无标注语料 |
| 研究病历中冗余的分布 | 候选池的构造方法与阈值 | 不够,候选池本身不公开 |
| 做中文临床句子相似度 | 无中文内容 | 不够 |
| 做语义相似度以外的任务 | 只有一对句子加一个分 | 不够,需换数据集 |
| 复现候选池的筛选过程 | 方法与阈值写清楚了 | 不够,需要同等规模的自有语料 |
| 追溯某句话出自哪份病历 | 无回溯字段 | 不够,且这是设计使然 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 做了一个临床句子表示模型,想知道它好不好 | 提供一套统一的测试划分与官方指标 | 按官方划分复现,报告皮尔逊相关 |
| 想给病历去冗余做原型 | 提供「什么叫几乎等价」的判断范例 | 把六档指南当作标注规范的起点,再按自己机构改写 |
| 手上只有通用域相似度数据 | 提供一批真实病历句子做压力测试 | 先在同一模型上对比通用集与临床集的表现落差 |
| 想复刻这套方法建自己的语料 | 提供从语料池到候选对的完整参数 | 需要自有去标识语料、两两比较的算力、两名临床标注者 |
| 要训练临床文本编码器 | 千对监督信号远远不够 | 先在 PubMed 摘要或 MIMIC-III 病历上预训练,再来微调 |
| 要做多语种临床语义相似度 | 只有英文 | 转向其他语种的临床 STS 资源 |
| 想审计这套标注的质量 | 论文给了评分指南与两人一致性数字 | 一致性只有两人内部,无第三人仲裁 |
1.5 一句话判断
如果你的任务正好是「给两句病历句子打一个语义等价分」,MedSTS 是目前最有名、也最常被引用的临床参照集之一;如果你的任务需要的是可批量下载、可反复切分的训练语料,它从第一步就拿不到。
1.6 不适合谁:四条边界
第一,不适合需要大规模监督信号的人。千对量级在现代模型眼里是微调量级,不是训练量级。任何以它为唯一监督来源的训练计划,都会在几个 epoch 内过拟合。
第二,不适合需要多中心或多语种的人。语料全部来自梅奥一家机构的初诊病历,英文。不同医院的书写习惯差异会在迁移时被完整地暴露出来。
第三,不适合需要回溯到原始病历的人。发布物只有句子对与分数,没有病历号、没有就诊时间、没有患者属性,句子也脱离了原有上下文。想研究「这句话在病历里承担什么功能」,这个数据集帮不上。
第四,不适合需要标注过程可审计的人。论文给出了评分指南、标注者人数与一致性数值,但没有逐条标注记录,也没有分歧仲裁流程的说明。要做标注质量研究,只能拿到结果,拿不到过程。
§2 数据构成与规格
2.1 三层数量必须分清
这是理解 MedSTS 时最容易出错的地方。三个数字看起来都在描述「这个数据集有多大」,实际指向三个不同的东西。
第一层是底层句子池。作者从临床数据仓库里选出约三百万份接受了初级保健的去标识病历,把病历切成句子,再用词频过滤的方式剔除含受保护健康信息的句子——依据是「出现在多位患者病历里的句子基本不含个人信息」。这一步之后得到千万量级的唯一句子,词元总数在三亿量级。这一层不是句对,只是句子的集合,也不对外发布。
第二层是候选句对池。对句子池做两两比较,用三种表层字符串相似度的平均值衡量表面上的接近程度,保留均值不低于零点四五的句子对,得到十七万四千六百二十九对。这一层有句对,但没有语义分数,也不对外发布。
第三层是标注子集。从候选池里按表层相似度分五段等量抽取,共千余对,交给两名临床专家打分,实际发布并经共享任务使用的是其中的约一千对,再按开发与测试两段划分。这一层才是「MedSTS」在日常语境里指的东西。
三层之间的关系不是层层包含那么简单:第一层到第二层是一次性的全体比较,第二层到第三层是分层抽样。任何一个环节缺失,后一层都复现不出来。
2.2 底层语料从哪里来
语料来自梅奥诊所的临床数据仓库。作者在方法部分交代了几件事:选取的是接受初级保健的患者病历,数量约三百万份,全部为去标识状态;本研究通过了机构审查委员会(IRB)的批准。
去标识这一步值得单独说。病历去标识的常规做法是用工具把姓名、日期、地址、证件号替换成占位符,但工具会有漏检与误检。作者在这里加了一道基于词频的过滤:一句话如果在很多不同患者的病历里反复出现,就认为它不太可能携带个人信息,予以保留;只出现一两次的句子被剔除。这是一种以牺牲覆盖率为代价换取安全性的做法,代价是罕见表述、罕见病名、罕见的用药组合会被系统性过滤掉。
这一点对使用者很实际:数据集的句子偏向模板化、常规化的表述,语言多样性低于真实病历全貌。做鲁棒性测试时,这是必须知道的前提。
2.3 句对怎么选出来的
三个表层相似度度量分别衡量字符层面的重叠,作者的做法是把三者取平均,再以一个经验门槛截断。论文里说这个阈值是「实验了几种区间后凭经验选定」的,也提到 SemEval 系列共享任务同样用字符串相似度来采样。
这里有一个容易忽略的因果:用表层相似度筛出的候选对,天然偏向「字面上像」的句子。真正意思相同但用词完全不同的句子对,很难通过这道门槛进入候选池。所以候选池里的语义相似度分布是被表面相似度预筛过的,不能当作真实病历中语义相似度的代表性样本。
抽样阶段则刻意做了平衡:在门槛值到零点九五这个区间内分五段,每段抽相同数量,使得候选子集在表层相似度上分布均匀。作者的理由是避免候选子集全部挤在高相似度一端。
这一步同时也决定了子集的用途。分层之后,标注集里必须包含相当比例的「长得像但意思不同」的难例,这正是判相似度的系统最容易栽跟头的地方。如果没有这道分层,随机抽样很可能抽出一堆几乎一模一样的模板句,模型只要算字面重叠就能拿高分,评测失去区分度。因此分层不是锦上添花,而是让这套评测集能区分系统优劣的前提。
2.4 一条句子对记录长什么样
发布物是纯文本,一对句子一行或两行,另附分数。以论文评分指南表中给出的示例为参照,把结构抽象出来:
#-- 一行 = 两条来自病历的英文原句 + 一个零到五之间的分数
sentence_1 | Albuterol [PROVENTIL/VENTOLIN] 90 mcg/Act HFA Aerosol 2 puffs by inhalation every 4 hours as needed.
sentence_2 | Albuterol [PROVENTIL/VENTOLIN] 90 mcg/Act HFA Aerosol 1-2 puffs by inhalation every 4 hours as needed #1 each
score | 5
#-- 训练与测试划分通常以两列文件给出,字段因发放批次而异
sid sentence_1 sentence_2 score
0 例句一 例句二 4.5
1 例句一 例句二 2.0
上面第二段的第一列是行号,不是患者号;分数出现半档是因为两人分数取平均。不同批次的发放文件在列名上并不统一,用前必须先读一遍表头,不要假设某一列固定是分数。
在格式上还有几处需要事先想清楚的事。其一是编码,病历文本里常混入非标准字符与特殊符号,方括号、斜杠、井号在剂量与给药途径里高频出现,按空白切词会把它们切开,直接破坏判断依据。其二是一对句子之间是否保证没有交叉,即某句是否可能在训练段与测试段各出现一次;论文没有说明这一点,因此自行重划时应当显式做去重检查,否则同一句话出现在两边会让分数虚高。其三是分数是否带标注者个人标记,多数发放版本只给最终分数,个人分数需要自行向作者确认。
2.5 六档评分指南
评分不是主观划线,论文给了一张带定义与例句的对照表。六个整数档的定义可以概括如下。
| 档位 | 定义 | 判断重心 |
|---|---|---|
| 5 | 两句完全等价,意思相同 | 换一种说法,信息量一致 |
| 4 | 大体等价,个别不重要的细节不同 | 细节差异不影响临床理解 |
| 3 | 大致等价,但重要的信息不同或缺失 | 差异会改变临床判断 |
| 2 | 不等价,但在部分细节上一致 | 共享部分事实 |
| 1 | 不等价,但话题相关 | 谈的是同一件事的不同侧面 |
| 0 | 完全不同 | 无任何共同点 |
这张表的实际作用是把「相似」这个模糊概念切成可操作的档位,难点集中在 2 到 4 这三个中间档。论文作者自己在讨论里承认,标注者在中间档上最犹豫,评分区间偏宽,指南里的定义与例句还不够用。
金标准取两人分数均值。两个人都给整数,均值可能是半档,因此最终分数是零点五为步长的值。这一点在做回归时无所谓,做分类或做阈值调优时必须显式处理,否则会出现「预测值落在档与档之间如何判定」的争议。
2.6 标注者的分工与人数
标注者是两名具有临床背景的专家,论文称二人均有多年临床经验。两人独立打分,互不通气,最后取均值。这与 SemEval 系列的做法一致。
只有两名标注者是个显著的结构性约束。两人可以算一致性,但无法做多数投票,出现分歧时没有第三方仲裁,只能靠事后讨论或直接取平均。论文也把「仅两人标注」列为三条局限之一。
2.7 共享任务带来的划分
发布版本把标注子集切成两份:约七成交系统开发,其余留作最终评测。这个划分出自 BioCreative/OHNLP 2018 共享任务的赛制安排,论文本身只说明这批千对样本将来会以共享任务形式放出,没有在正文里写训练测试各多少对。引用划分时必须注明来源是共享任务材料,而不是论文正文。
这一划分的实际后果是:训练集不足以训练,测试集样本量小,皮尔逊相关系数的置信区间很宽。参赛系统的排名靠前的几位,差距往往落在噪声范围内。
§3 它为什么不好拿:一道硬边界
3.1 没有下载入口,这是事实而非传闻
这是整篇词条里最需要单独成节的一条。MedSTS 的获取路径只有一条:联系作者。
论文与期刊页面都不提供数据直链;没有官方代码仓库;国际上的数据托管平台上也没有它的镜像。第三方介绍页面在提到获取方式时,普遍写的是「不可直接下载,需联系第一作者」。这和多数公共语料「页面上有一个下载按钮」的体验完全不同。
3.2 当年的发放通道是共享任务
标注子集不是以数据集的名义发布的,而是作为 BioCreative/OHNLP 2018 共享任务的赛题材料。参赛队伍在报名之后拿到训练集,测试集由组织方掌握,赛后按赛制公布或保留。
这条通道的性质决定了三件事。第一,能拿到数据的人首先是参赛者;第二,拿到的版本是赛题版本,不是「最新版」;第三,赛后的可获得性取决于组织方的安排,而不是一个持续维护的下载页。
共享任务这种发放方式还有一个容易被忽略的细节:赛时给参赛者的材料通常包含评测脚本或评测口径说明,赛后这些东西不一定跟着数据一起流传。于是后来者即便拿到了句子与分数,也可能缺少当年那份口径文件,只能凭后来论文里的转述去复原评测方式。复原一旦有偏差,数字就对不上,而对不上时很难判断是模型问题还是口径问题。
3.3 为什么这种模式在 AI-ready 视角下是一道硬边界
「联系作者索取」在学术上很常见,也完全合理:语料虽已去标识,来源仍是受保护的患者病历,机构审查委员会通常要求研究者对用途负责,因此以申请制控制流向。
但从「能否直接进入训练流水线」这个角度看,它构成三重障碍。
第一重是可脚本化程度为零。任何自动取数流程都要求一个稳定的地址,申请制没有地址,只有邮件。数据版本、文件格式、字段命名都依赖对方回复。
第二重是可复现性依赖对方。别人发表的结果,你要复现,前提是作者还愿意回复、还留着那份文件。版本一旦漂移,两份文件的分数甚至句子都可能不同,而外面没有任何校验和可查。
第三重是许可不明。论文没有给出统一的许可声明,只在正文里说明将以共享任务形式发放。二次分发、商用、放入公开的预训练语料库,这些都需要单独确认,而确认对象是个人的邮箱而不是一个条款页面。
3.4 拿到之后也不是一手交钱一手交货
即便申请成功,拿到的也只是标注子集。候选池的十几万对句子对、底层的千万级句子,都不在发放范围内,而且后者几乎不可能发放——那是梅奥的全部去标识句子集合。
这意味着任何声称「用十七万对训练模型」的说法都值得怀疑。真正可用的标注样本量只有千对,候选池只存在于论文的统计描述里。
3.5 一个务实的替代顺序
如果目标只是做临床句子相似度研究,建议按这个顺序找资源:先看是否有已公开发布、带下载页的临床相似度语料;再看是否可以自己在公开病历语料上按论文的方法造一批;最后才是申请 MedSTS。顺序反过来,容易把时间耗在等回复上。
论文的方法是公开的:句子切分、词频去标识、三种表层相似度取均值、一个经验阈值、五段等量抽样、两人独立打分。这套流程本身是可复用的资产,价值不低于那一千对句子。
自建时还要清楚一件事:论文里的参数是在梅奥语料上凭经验定的,换一家机构未必合适。这个阈值决定了候选池的大小,阈值调高,候选池迅速缩小但表面相似度更高;调低,候选数量暴涨而真正可用的比例下降。词频过滤的门槛同理,卡得越严越安全,剩下的句子也越模板化。这两处都需要在自己的语料上重新试,而不是照抄。
§4 它的手艺:怎么把一个模糊判断变成可用的分数
4.1 从病历到句子
第一步是切句。病历文本没有规范的句子边界,缩写里有点号,剂量里有斜杠,模板段落常常是一行一个短语。作者的描述没有展开切分规则的细节,只说从病历中选出唯一句子。
第二步是去重与去标识。同一句话在多份病历里重复出现,只保留一条,这就是「唯一句子」的来源。含个人信息的句子靠词频过滤剔除——高频即安全。
这两步合起来决定了句子的性格:短、模板化、高频复现。这也解释了为什么后续的表层相似度筛选能筛出十七万对——模板化表述天然字面相近。
4.2 从句子到句对
第三步是两两比较。对唯一句子集合做全量两两比较,计算三种表层相似度并取平均。集合规模在千万量级,全量比较的计算量按平方增长,这是构建这套语料最重的一步。
第四步是阈值截断。均值不低于零点四五的保留。论文对这个阈值的解释是经验性的,没有给出基于标注数据的验证曲线。
4.3 从候选到标注
第五步是分层抽样。把表层相似度从门槛值到零点九五分五段,每段抽等量,合计千余对。
第六步是双人独立标注,取均值。第七步是切分训练与测试,交给共享任务。
这七步里,只有第五步到第七步会产生对外可见的东西。前面四步的产物只以统计数字的形式出现在论文里。
4.4 一个贯穿的例子:一句沙丁胺醇医嘱
论文评分指南表里有一组例句,讲的是同一条吸入剂医嘱的两种写法。第一句写「每次两吸,按需,每四小时一次」,第二句写「一到两吸,按需,每四小时一次,每次一支」。两人都给了满分。
这个例子能说明三件事。其一,病历里的「等价」常常是关于临床动作的等价,而非字面等价;两吸与一到两吸在临床上可以互换,所以判为满分。其二,句子里的方括号、斜杠、剂量单位都不是装饰,模型若在预处理时把它们当标点删掉,会丢掉判断依据。其三,这类句子的差异极小,靠字符层面的相似度就能筛出来,而真正难的「同义不同词」病例,往往过不了候选筛选。
这个例子在后面的取数指引与跨库对照两节里还会再被用到,因为它同时展示了数据的样子与数据的局限。
4.5 系统怎么用这套数据
论文用四个基线系统在标注子集上做了评测:编辑距离类的字符匹配、余弦相似度、最长公共子序列类的做法,以及一个集成。评测指标是系统分数与金标准之间的皮尔逊相关系数。
结论有两层。第一层,所有基线在临床集上的表现都低于它们在通用集上的表现,说明临床文本确实更难。第二层,简单的表层方法在临床集上并不算弱,说明带分数的高相似度句对占了相当比例。
这两层结论共同指向一个使用提示:如果只想得到一个不太差的基线,字符级方法就够;想证明方法有实质进步,必须在中间档的句对上做细致分析。
§5 怎么用:在一个千对的数据集上做对的事
5.1 三条路径
评测者的路径最短:拿到标注子集,按官方划分固定下来,在自己的系统上跑一遍,报告皮尔逊相关。要点是不要用测试集调参,也不要把两份合并后随机重划——重划会破坏与原论文的可比性。
方法研究者的路径是补足训练量:先在 PubMed 摘要、MIMIC-III 病历这类公开大语料上预训练句子表示,再用开发集做任务头微调,最后在留出的那份上报告。
建资源者的路径是复用方法:不去申请数据,而是按论文的七步流程在自有语料上重做一遍。这条路径成本最高,但产出可控,也不受许可限制。
5.2 一条最短的可用流程
下面这段代码不依赖任何下载,只在拿到文本文件之后做最低限度的检查与切分。假设文件已由申请获得,列名为句子一到句子二与分数。
#-- 读入标注子集,检查规模与分数范围,再按官方划分切分
import csv
rows = []
with open("medsts_ann.tsv", encoding="utf-8") as f:
reader = csv.DictReader(f, delimiter="\t")
for r in reader:
rows.append({
"s1": r["sentence_1"].strip(),
"s2": r["sentence_2"].strip(),
"score": float(r["score"]),
})
print("总对数:", len(rows))
print("分数范围:", min(r["score"] for r in rows), max(r["score"] for r in rows))
print("半档占比:", sum(1 for r in rows if r["score"] % 1) / len(rows))
#-- 前 750 条作训练、其余 318 条作测试(按官方发放顺序)
train, test = rows[:750], rows[750:]
assert len(train) == 750 and len(test) == 318
print("训练:", len(train), "测试:", len(test))
上面最后一步依赖行的顺序就是官方发放顺序。如果文件被重排过,这个切分就失效,此时应当改用文件里自带的划分列,或在文档里明确声明使用了自建划分。
5.3 评测口径要写清楚
皮尔逊相关是官方指标,但它有几个需要在方法部分说明的细节。
第一,预测值是否经过截断。把预测值截到零到五之间,通常能提高相关系数;不截断则更接近系统真实输出。两种做法都有人用,必须写明。
第二,分数当连续值还是离散值。金标准有半档,模型输出通常是连续值,直接算相关即可;若报告准确率,则要定义容差,比如「预测误差不超过零点五算对」。
这段话里的两条准则值得展开。第一,把预测值截断讲清楚,是因为截断本身是一种先验:断言任何相似度都不会超过满分、也不会低于零。这个先验在临床集上比较强,因为分布两端确实稀薄,截断后相关系数上升是可预期的;如果不截断而分数更低,未必说明模型差,只说明它把两端压平了。
第二,分段报告的意义在于暴露「中间档塌陷」。系统常把难例压到两端的邻居位置上,整体相关看着还行,中间档的排序却是乱的。分段之后这种塌陷会立刻显形,也才谈得上改进。
第三是把金标准当确定性数值的反面:两人分数取平均,意味着同一个零点五分可能来自「零和一分」「一分和零分」这类彼此矛盾的两份判断,也可能来自「零点五分」这类系统的取整结果。把均值当连续真值回归,是把分歧抹平后的一种近似,而不是数据本身的性质。
5.4 一个可复用的错误示范
最常见的错误用法是把它当训练集用,并且不做任何预训练。结果是模型记住了开发集里的句子,在留出的那份上表现平平,在外部数据上更差。
第二常见的错误是用通用域的相似度模型直接迁移,不做任何领域适配,然后在论文里报告「临床文本相似度很难」。这个结论本身没错,但论文里没说明的是:难度中有相当一部分来自缩写与模板,而不是语义理解。
5.5 引用与版本
引用 MedSTS 至少要写三层:论文本身、数据版本、以及使用时的划分方式。
论文的标准写法是 Wang 等人 2020 年刊于《Language Resources and Evaluation》第 54 卷 57 至 72 页的那篇,预印本为 2018 年 8 月的 arXiv 版本。数据版本通常写「BioCreative/OHNLP 2018 发放版」,因为没有一个带版本号的官方发布页。
划分方式要写明是沿用官方两段划分,还是自行重划。这一条在复现性审查中经常被追问。
§6 与库内条目的关系
6.1 关系图谱
MedSTS 在临床文本任务谱系里的位置可以用「上游语料、同辈任务、下游应用」三层来定位。
| 库内相关词条 | 与本词条的关系 | 一句话区隔 |
|---|---|---|
| MedNLI | 同出梅奥 NLP 团队,任务形态不同 | MedNLI 判蕴含与矛盾,MedSTS 判相似度高低 |
| BIOSSES | 同为生物医学句子相似度 | BIOSSES 是生物医学文献句子,MedSTS 是病历句子 |
| MIMIC-III | 公开的替代语料 | MIMIC-III 需认证但可下载,MedSTS 只能申请 |
| i2b2 / n2c2 系列 | 同为临床 NLP 共享任务 | 任务不同、组织方不同、年份不同,无继承关系 |
| MedNLI 与病历摘要类任务 | 应用上游 | 去冗余与摘要都以相似度判断为前置步骤 |
| PubMed 语料 | 预训练来源 | 临床句子表示常先在其上预训练,再用 MedSTS 评测 |
| 中文临床相似度资源 | 语种互补 | MedSTS 不含任何中文内容 |
6.2 检索路径
| 你的问题 | 该去哪个词条或入口 | 理由 |
|---|---|---|
| 要一个病历句子的相似度评测集 | 本词条 | 这是它唯一被设计出来的用途 |
| 要一个可以立刻下载的临床语言任务集 | MIMIC-III 相关词条 | MedSTS 需申请 |
| 要做临床文本蕴含 | MedNLI 词条 | 任务形态不同,数据也不同 |
| 要做生物医学文献句子相似度 | BIOSSES 词条 | 语料来源不同,风格不同 |
| 要训练临床句子编码器 | PubMed 与 MIMIC-III 相关词条 | 千对监督信号不足 |
| 要找中文临床语义相似度 | 中文资源词条 | MedSTS 仅英文 |
| 要复刻构建方法 | 本词条的 §4 | 方法与阈值写得比数据详细 |
6.3 与 BIOSSES 的逐项区隔
两者都是生物医学领域的句子相似度集,最容易被混为一谈,因此单独对照。
| 对比项 | MedSTS | BIOSSES |
|---|---|---|
| 句子来源 | 梅奥诊所的患者病历 | 生物医学文献 |
| 规模 | 千对量级 | 百对量级 |
| 分数范围 | 零到五,六档 | 零到四,连续打分 |
| 标注人数 | 两人 | 两人以上,论文另有一致性讨论 |
| 任务形态 | 回归 | 回归 |
| 获取方式 | 联系作者 | 公开 |
| 典型用途 | 病历去冗余、临床句子表示 | 文献语义相近检索 |
一句话记住:MedSTS 的句子是「医生写给医生看的记录」,BIOSSES 的句子是「研究者写给同行看的论文」。前者短、模板化、含剂量与缩写,后者长、完整、术语密度高。模型在两者之间的迁移,不是简单的领域内调优,而是任务性质的变化。
还有一个常被忽略的差别在可得性。BIOSSES 有下载页,任何注册的人都能取;MedSTS 要走申请。因此在方法论文里同时用两者做对照时,BIOSSES 往往是复现者能自行跑通的那一半,MedSTS 那一半只能引用原作者的数值。这会让「在两个数据集上都验证过」这句话的分量打折扣,做复现研究时应把这一层讲清楚。
6.4 与 MedNLI 的关系
MedNLI 与 MedSTS 出自同一个团队,用的也是梅奥病历。区别在任务:MedNLI 给定前提与假设,判断蕴含、矛盾还是中立;MedSTS 给两句,判相似度高低。
两个任务在数据构造上有相似气质:都从病历里挖句子,都靠人工判断语义关系,规模都不大。但两者的标注逻辑相反:蕴含是三分类的硬判断,相似度是六档的软判断。做「判断两句话关系」这类统一任务时,两者可以同时使用,前提是先把标签空间对齐。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
评估 MedSTS 最容易犯的错,是用「训练集」的尺子量它。它从设计上就不是训练集,它是评测集:规模小、划分固定、指标单一。用这个框架去看,它的每一项设计都合理;用训练集的框架去看,它处处不够。
第二点需要校正的是「权威性」。它被大量引用,不代表它无懈可击。恰恰因为被大量引用,它的局限会被后来者不断重复,比如单中心、单人种、只两人标注。
7.1 五维评分
| 维度 | 分数 | 依据 |
|---|---|---|
| 规模 | 2 / 5 | 标注千对量级,属微调量级 |
| 一致性 | 3 / 5 | 两人独立打分有可报的一致性数字;无第三人仲裁 |
| 可用性 | 1 / 5 | 无公开下载入口,须联系作者 |
| 可追溯性 | 3 / 5 | 方法七步写得清楚;候选池与逐条标注不公开 |
| 注释质量 | 4 / 5 | 两名临床专家、有书面评分指南与例句,体系与 SemEval 对齐 |
五维里可用性最低,这是它最硬的一道坎;注释质量最高,这是它仍被引用的原因。
7.2 DAIMS 视角下的四条线
| DAIMS 线 | MedSTS 的表现 |
|---|---|
| 数据获取与处理 | 语料来源、去标识方式、筛选阈值均有文字说明;逐样本处理记录不公开 |
| 数据建模 | 句子对加分数,模型极简,无模式演进问题 |
| 数据溯源 | 到论文与申请记录为止,无文件级校验和,无版本号 |
| 数据使用与治理 | 无统一许可条款,以机构审查与作者许可为界 |
四条线里最稳的是建模,最弱的是治理。所谓治理最弱,不是说它有问题,而是说它没有把「谁能用、怎么用、能否再分发」写成一个任何人都能读的条款。
7.3 已知的、可枚举的偏差
第一,机构偏差。全部句子来自梅奥一家的初诊病历。模板、缩写习惯、常用短语都是梅奥的写法。换一家医院,同样的模型会遇到没见过的表达。
第二,来源偏差。词频过滤偏好高频句,等于系统性地剔除了罕见表述。罕见病、罕见用药组合在集合中的比例低于其在真实病历中的比例。
第三,筛选偏差。候选池由表层相似度截断产生,语义相同而字面不同的句对几乎无法进入。标注子集继承了这个偏差。
第四,评分偏差。六档宽区间让中间档难以一致,论文自己承认标注者在中间档最犹豫。金标准取均值,等于把分歧当成连续不确定性处理,而没有记录分歧本身。
第五,语言与文化偏差。只有英文,只有美国单一医疗体系的书写习惯。
7.4 外部验证
| 验证角度 | 外部证据 | 结论 |
|---|---|---|
| 是否被社区采用 | BioCreative/OHNLP 2018 以它为赛题,同年多支队伍提交 | 是临床 STS 的基准之一 |
| 与通用集的可比性 | 论文报告所有基线在临床集上表现更差 | 难度确实更高,不能直接迁移 |
| 标注质量 | 论文给出两人一致性数值 | 可接受,但只有两人 |
| 长期可获得性 | 无维护页面,无版本更新 | 依赖作者个人与共享任务存档 |
7.5 它靠什么活着
一个千对量级的评测集,能活下来的原因通常不是数据本身有多好,而是它填补了一个空位,并且被一个有影响力的赛事采用。
MedSTS 两点都占了。临床领域此前没有公认的句子相似度评测集,它把 SemEval 的任务形态搬到病历上;BioCreative 与 OHNLP 合办的共享任务给了它一个曝光窗口。此后做临床句子相似度的论文,几乎都会在它上面报一个数,形成路径依赖。
这种生存方式有代价:没有维护者,就没有人修错、扩展、补标注。它停留在 2018 年的样子,既不会消失,也不会长大。
还有一层更深的原因:评测集的价值来自共识,而不是来自数据本身的质量。一套一千对的标注,如果只有作者自己用,就没有意义;它之所以能被反复引用,是因为足够多的团队在同一份样本上跑过系统,这些分数堆积起来,构成了一个可以对话的参照面。共识一旦形成,后来的新数据集很难取代它,哪怕新集更大更干净——因为旧集上的历史分数无法迁移。MedSTS 的处境正是如此,它的地位更多来自引用惯性,而不完全来自数据规模。
§8 生态位与历史
8.1 时间线
| 时间 | 事件 |
|---|---|
| 2018 年 8 月 | arXiv 预印本公开 |
| 2018 年 10 月 | 期刊在线发表 |
| 2018 年 | BioCreative/OHNLP 2018 共享任务以标注子集为赛题,按开发与测试两段划分发放 |
| 2019 至 2020 年 | 参赛队伍陆续发表方法论文,形成以它为基准的引用链 |
| 2020 年 | 期刊卷期正式归档为第 54 卷 57 至 72 页 |
| 2020 年以后 | 句子表示与大模型时代,它转为小样本评测与微调集 |
时间线的特点是没有后续版本。它是一次性构建的资源,没有第二版,也没有补标计划。
8.2 同代临床相似度资源的分布
2018 年前后,临床文本领域出现了几个方向不同的资源。有的是从病历中抽实体做关系抽取,有的是把病历句子用于推断,有的是把病历摘要作为生成任务。MedSTS 选的是最朴素的一条:判两句像不像。
这条路线的好处是任务定义清楚、评测指标单一、结果可比。坏处是它离临床应用最远:知道两句像不像,并不直接等于能做去冗余,还需要在真实病历上验证阈值。
8.3 在语言模型时代的再定位
预训练模型普及之后,MedSTS 的角色变了两次。
第一次是从「训练目标」变成「评测集」。此前有队伍在它上面训练专门的相似度模型;此后主流做法是在大语料上预训练,在它上面只做评测。
第二次是从「单一评测集」变成「小样本参照点」。现代模型的皮尔逊相关早就超过了论文里基线的水平,边际信息量下降。它现在更像一个必要条件:分数高不代表模型好,分数低一定说明某个环节有问题。
这也带来一种新的误用:把微调后的高分当作领域能力已经解决的证据。千对样本上的高分,在真实病历的去冗余任务中未必能复现,因为真实场景里的句子对不是按表层相似度抽出来的。
8.4 与公开病历语料的关系
MIMIC-III 一类公开病历语料在可获得性上正好相反:需要认证培训,但拿到之后可以自由分析。MedSTS 不需要任何认证就能申请,但拿不到就什么都没有。
两者不是替代关系。要做大规模训练,必须用前者;要一个有权威背书的评测集,才轮到后者。§4.4 里那句沙丁胺醇医嘱之所以重要,正是因为它展示了这种小语料独有的东西:逐条可读、可讨论、可作为标注规范的范例。
§9 使用指引
9.1 三种角色的路径
评测者:先固定划分,再固定指标口径,最后才是跑模型。顺序颠倒会造成「先看分数再改口径」的隐性偏差。
方法研究者:把开发划分视为微调集而非训练集。先在大语料上预训练,再用它做轻量适配,最后在留出的测试划分上报告,并额外报告中间档的分段结果。
资源构建者:把论文的七步流程抄下来,逐条替换成本机构的参数。最容易出错的一步是去标识,词频过滤的阈值直接决定句子池的性格。
9.2 一条完整的最小脚本
下面这段把读入、检查、切分、评测串起来,可以在拿到文件后直接改路径运行。
#-- 最小评测脚本:读入、检查、切分、算皮尔逊相关
import csv
import numpy as np
def load(path):
out = []
with open(path, encoding="utf-8") as f:
for r in csv.DictReader(f, delimiter="\t"):
out.append((r["sentence_1"], r["sentence_2"], float(r["score"])))
return out
def pearson(a, b):
a, b = np.asarray(a, float), np.asarray(b, float)
a, b = a - a.mean(), b - b.mean()
return float((a * b).sum() / np.sqrt((a * a).sum() * (b * b).sum()))
pairs = load("medsts_ann.tsv")
gold = [s for _, _, s in pairs]
pred = [your_system(s1, s2) for s1, s2, _ in pairs] #-- 换成自己的打分函数
train_gold, test_gold = gold[:750], gold[750:]
train_pred, test_pred = pred[:750], pred[750:]
print("训练集相关系数:", round(pearson(train_gold, train_pred), 4))
print("测试集相关系数:", round(pearson(test_gold, test_pred), 4))
#-- 截断到零到五后再算一次,两种口径都要报告
clipped = [min(5.0, max(0.0, p)) for p in test_pred]
print("测试集(截断后):", round(pearson(test_gold, clipped), 4))
上面第二段的打分函数示意部分要换成自己的实现。建议同时保存不截断与截断两版结果,因为不同论文报告的往往是不同口径。
9.3 分段报告的写法
按金标准分数把测试集分组,报告每组的平均误差,比单一相关系数有信息量得多。分组方式可以是零到一、二到三、四到五三档,也可以是六档各自一组。
这么做的好处是能定位模型的短板。多数模型在高档上误差小、在中间档上误差大,原因不是模型不会判相似,而是中间档本身的定义就模糊。
9.4 使用中要避免的三件事
第一,避免把两份合并后随机重划。这会破坏与原论文的可比性,也让训练集与测试集的分布不再一致。
第二,避免在测试集上做特征选择或早停。测试划分只有三百余条,产生的性能波动很大,任何在它上面做的选择都会被过拟合。
第三,避免把「在 MedSTS 上表现好」写成「具备临床语义理解能力」。前者是一个千对样本上的数值,后者是一个需要多任务、多语料共同支撑的判断。
§10 AI 使用声明
| 项目 | 说明 |
|---|---|
| AI 参与程度 | 由 AI 助手依据论文、预印本与期刊页面起草,人工核对数字 |
| 数字来源层级 | 见附录 B;论文与预印本为一级,共享任务方的说明为二级 |
| 未核实项 | 发布文件的确切列名与分隔符,未见官方样例 |
| 已知不一致 | 训练与测试划分出自共享任务材料,论文正文未写 |
| 适用边界 | 只描述数据集本身的结构、规模与获取边界 |
| 更新机制 | 数据集无版本更新,本文不随其变化 |
常见误读(避坑清单)
| 常见说法 | 实际 | 证据 |
|---|---|---|
| 「十七万对,规模很大」 | 带分数的只有千对 | 论文摘要给出两数,前者是候选池 |
| 「它可以下载」 | 无公开入口,须联系作者 | 论文与期刊页面均无直链,无官方仓库 |
| 「它是中文语料」 | 全部为英文病历句子 | 论文语料来源为梅奥诊所病历 |
| 「它和 i2b2 有关」 | 无关,发布渠道是 BioCreative/OHNLP | 论文参考文献列的是该共享任务 |
| 「分数是整数」 | 两人取均值,会出现半档 | 金标准定义为两人分数平均 |
| 「千对样本可任意切分」 | 官方按开发与测试两段固定划分 | 划分出自共享任务材料 |
| 「它含原始病历」 | 只有句子对与分数 | 发布物无回溯字段 |
| 「它是训练集」 | 定位是评测集 | 规模与划分方式都指向评测 |
| 「它有持续更新」 | 一次性构建,无后续版本 | 无发布页与版本号 |
| 「标注有仲裁机制」 | 只有两人,无第三方 | 论文将「仅两人标注」列为局限 |
| 「两边分数差很多就是错标」 | 中间档定义本就模糊 | 论文承认标注者在中间档最犹豫 |
| 「在它上面高分说明能用于临床」 | 千对样本不足以支撑此类结论 | 真实病历的句对分布与之不同 |
FAQ
Q1:到底有多少句子对?
三个数都要记住:候选池十几万对,抽样待标千余对,实际带分数约一千对。日常说「MedSTS 有一千对」指的是第三个。
Q2:为什么论文说是「将发布」,但现在找不到?
论文写于 2018 年,当时的计划是以共享任务形式发布。任务办完之后,数据没有转为公开下载,而是延续了申请制。这是论文文字与现实状态之间的时间差,不是数据被撤下。
Q3:怎么申请?
论文给出了通讯作者的邮箱,常规做法是去信说明用途与研究单位。作者是否回复、回复多快、给的是哪个版本,都没有公开规定。这也是它作为 AI-ready 数据的核心短板。
Q4:如果拿不到,能用什么替代?
看任务。评测临床句子相似度,可以找其他已公开的临床 STS 语料;训练临床句子表示,用公开病历语料自建;研究去冗余,直接在自己机构的病历上做小规模标注可能更实用。
Q5:它的评分和 SemEval 的评分能对齐吗?
概念上对齐,都是零到五档的语义等价程度,作者也明确说是参照 SemEval 的做法。但两套指南的措辞与例句不同,直接跨集比较分数要谨慎。
Q6:句子为什么看起来这么短、这么像模板?
因为经过词频过滤。只在少数病历里出现的句子被当作可能含个人信息而剔除,留下的是高频复现的模板化表述。这是安全性与语言多样性之间的取舍。
Q7:候选池为什么不能公开发?
候选池的句子量大,虽然同样去过标识,但发出去等于发布了梅奥的大规模句子集合,风险与收益不成比例。论文只发布标注过的一千余对,是审慎的选择。
Q8:能不能用它做中文迁移?
可以做跨语言迁移实验,但要注意两点:一是中文病历的缩写与单位写法完全不同;二是英文上练出的表层相似度特征在中文上会失效。
Q9:它和 MedNLI 是什么关系?
同一个团队、同一批语料来源、不同的任务。一个是相似度回归,一个是蕴含三分类。两者可以配合使用,但标签不能互相替代。
Q10:分数只有半档,怎么做分类?
常见的离散化有两条:把零点五及以上算作等价,或把四以上算作高相似。选哪条取决于下游任务,必须在方法里写清楚,不能事后挑一个分数好看的。
Q11:它有哪些明确的空白?
不含中文,不含多中心,不含原始病历,不含患者属性,不含标注过程记录,不含版本更新。六条空白里,前三条决定了它的适用范围,后三条决定了它的可维护性。
Q12:为什么仍然值得引用?
因为它定义了一个可讨论的基准。在它之前,临床句子相似度各家自建评测集,结果不可比;在它之后,至少有一个大家都能引用的参照点,哪怕这个参照点只有一千对。
术语表
| 术语 | 含义 |
|---|---|
| 语义文本相似度 | 衡量两段文本在意思上的接近程度,不是字面接近程度 |
| 句子对 | 两条文本组成的一个待判样本 |
| 表层相似度 | 只看字符与词形重叠的相似度,不看语义 |
| 语义等价 | 两句话表达同一件事,措辞可以不同 |
| 金标准 | 用于评测的参考答案,此处为两名标注者分数的平均 |
| 皮尔逊相关系数 | 衡量两组数值线性一致程度的指标,此处为官方评测指标 |
| 去标识 | 移除姓名、日期、证件号等可识别个人身份的信息 |
| 受保护健康信息 | 受法规保护、不得随意披露的患者信息 |
| 词频过滤 | 按句子在多少份病历中出现来筛句,高频视为安全 |
| 分层抽样 | 按某个维度分段、每段等量抽取,以保证分布可控 |
| 机构审查委员会 | 审查研究是否合乎伦理的机构内委员会 |
| 共享任务 | 组织方发放数据、参赛队伍提交系统、统一排名的学术竞赛 |
| 微调 | 在预训练模型上用少量任务数据继续训练 |
| 模板化表述 | 病历中反复出现的固定句式,如查体与用药记录的套话 |
| 中间档 | 评分 2 到 4 之间、难以判断的相似度区间 |
| cTAKES | 一套开源的临床文本处理工具,用于抽取医学概念 |
| UMLS | 统一医学语言系统,提供医学概念与语义类型体系 |
| DAIMS | 一套评估数据档案管理的框架,看采集、建模、溯源与治理 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 底层病历数 | 约三百万份 | 论文正文 | 一级 |
| 唯一句子数 | 约一千四百九十万 | 论文正文 | 一级 |
| 词元总数 | 三点六一九亿 | 论文正文 | 一级 |
| 候选句对数 | 十七万四千六百二十九 | 论文摘要 | 一级 |
| 表层相似度阈值 | 零点四五 | 论文正文 | 一级 |
| 抽样待标对数 | 千余 | 论文正文 | 一级 |
| 标注子集对数 | 一千零六十八 | 论文摘要 | 一级 |
| 训练与测试划分 | 七百五十与三百一十八 | 共享任务材料 | 二级 |
| 评分档位 | 零到五共六档 | 论文摘要与正文 | 一级 |
| 标注人数 | 两人 | 论文摘要 | 一级 |
| 抽样分段数 | 五段 | 论文正文 | 一级 |
| 标注子集词元数 | 五万四千一百六十一 | 论文正文 | 一级 |
| 发表卷期 | 第 54 卷 57 至 72 页 | 期刊页面 | 一级 |
| 公开发布文件列名 | 未核实 | 无官方样例 | 三级 |
附录 B:数字的来源分层
一级:论文与预印本。 病历数、句子数、词元数、候选对数、阈值、抽样数、标注子集数、评分类别、标注人数、抽样段数、标注子集词元数,均出自论文正文或摘要,预印本与期刊版在数字上一致。
二级:共享任务材料。 开发与测试两段的划分出自 BioCreative/OHNLP 2018 的赛题说明,并被后续参赛队伍的方法论文反复引用。论文正文只说明将放出这一千零六十八对,没有给出划分比例。
三级:未核实。 发布文件的确切列名、分隔符与编码,未见官方给出的样例文件。本文在代码块中使用的列名是按常见发放格式推断的,实际使用前须以拿到手的文件为准。
附录 C:参考文献
- Wang Y, Afzal N, Fu S, Wang L, Shen F, Rastegar-Mojarad M, Liu H. MedSTS: a resource for clinical semantic textual similarity. Language Resources and Evaluation, 2020, 54(1): 57–72.
- Wang Y, Afzal N, Fu S, Wang L, Shen F, Rastegar-Mojarad M, Liu H. MedSTS: A Resource for Clinical Semantic Textual Similarity. arXiv:1808.09397, 2018.
- Rastegar-Mojarad M, Liu S, Wang Y, Afzal N, Wang L, Shen F, Fu S, Liu H. BioCreative/OHNLP Challenge 2018. ACM-BCB, 2018.
- 期刊页面与预印本页面,用于核对卷期、页码、作者单位与数字,2026 年 10 月访问。
- 参赛队伍的 MedSTS 方法论文,用于核对训练与测试划分及评分指南的引入方式。
附录 D:取数代码
#-- 申请获得文件后,先做结构检查,再产出可复用的数据对象
import csv
import json
REQUIRED = ("sentence_1", "sentence_2", "score")
def inspect(path):
with open(path, encoding="utf-8") as f:
head = f.readline().strip().split("\t")
print("列名:", head)
missing = [c for c in REQUIRED if c not in head]
if missing:
raise SystemExit(f"缺少必需列: {missing}")
rows = []
with open(path, encoding="utf-8") as f:
for r in csv.DictReader(f, delimiter="\t"):
rows.append({"s1": r["sentence_1"], "s2": r["sentence_2"],
"score": float(r["score"])})
print("对数:", len(rows))
print("分数最小值:", min(r["score"] for r in rows))
print("分数最大值:", max(r["score"] for r in rows))
return rows
rows = inspect("medsts_ann.tsv")
#-- 落到 JSON,便于后续跨语言复用
with open("medsts_ann.json", "w", encoding="utf-8") as f:
json.dump(rows, f, ensure_ascii=False, indent=1)
print("已写出 medsts_ann.json")
这段脚本的作用是尽早暴露格式问题。申请制数据最常见的坑不是内容错,而是列名、分隔符、编码与预期不符,等到评测跑完才发现,代价很大。
附录 E:如果只记五件事
第一,它是梅奥诊所的英文临床句子相似度资源,用自家约三百万份去标识病历挖出来,评估单位是句子对。
第二,数量分三层:候选十七万余对没有语义分数,抽样千余对,带分数的只有约一千对,再按开发与测试两段划分。
第三,评分是零到五分六个整数档,两名临床专家独立打分取均值,因此最终分数可能出现半档。
第四,它没有公开下载入口,只能联系作者,这是它在 AI-ready 视角下最硬的一道边界。
第五,它只包含去标识后的英文字句对与分数,不含原始病历、不含回溯字段、不含中文,也不随版本更新。
需要更高工程化程度或合规出域的商业版本?
当前展示的公开版本适用于学术研究与原型验证。千方医数集依托三甲医院直采网络,提供经专家标注、符合伦理合规的专病数据集交易服务。
前往商城查看可交易产品 →
