我们正处于自然语言处理(NLP)领域令人兴奋的十年。 在阅读理解、语言翻译和创意写作等复杂任务上,计算机的表现将会和人类一样出色。语言理解受益于快速改进的“ABC”软件:A就是AI(免费的深度学习库,如PyText和如BERT这样的语言模型),B是大数据(Hadoop,Spark和Spark NLP),以及C,就是云计算(按需提供的GPU和 来自所有主要云服务商的NLP即服务的功能)。
在医疗领域,一些应用已经从科幻小说变为现实。 人工智能系统通过了中国和英国的医学执照考试 ,而且它们比普通医生考得更好。 最新的系统比初级医生能更好地诊断出55种儿科疾病。 但是,这些系统比第一批计算机视觉深度学习应用(例如研究一个图像)中的一些更难构建,因为它们需要具有更广泛常见的医学知识,要处理更多种类的输入,并且必须理解上下文。
过去七年来,我很幸运能够参与构建医疗领域的NLP系统。本文旨在分享我学到的重要经验,从而希望能帮助你更快更好地构建类似的系统。
先见识一下急诊室分诊记录的语言
包括我在内的许多人都错误地认为美国的临床记录是用英文写的。之所以会这样,是因为如果你问医生他们使用什么语言,医生便会回答说是英语。 但是,请看以下三个从急诊室就诊记录中提取的已脱敏的分诊记录的例子:
Triage Notes |
states started last night, upper abd, took alka seltzer approx 0500, no relief. nausea no vomiting |
Since yesterday 10/10 “constant Tylenol 1 hr ago. +nausea. diaphoretic. Mid abd radiates to back |
Generalized abd radiating to lower x 3 days accompanied by dark stools. Now with bloody stool this am. Denies dizzy, sob, fatigue. |
大多数没有受过医学教育的人都不理解这些典型句子的意思。以下是一些需要注意的事项:
- 这些句子在英语中都不是语法正确的句子。
- 这些句子里都没有使用“病人”或“疼痛”这两个词,且句子没有主语。
- 句子里使用了很多术语:10/10指的是疼痛的强度。“广泛的abd辐射至下位”是指向下背部辐射的一般腹部(胃)疼痛。
我把这些记录给急诊室的医生看了,他们认为这些笔记是有用的。因为它们简明扼要,并关注最重要的事情。他们会认为这些都是急症室分诊记录的常见情况,而不是“坏”的样本。
是的,急诊室他们有自己的语言
一名哲学家或语言学家可能会认为这些特点仍然不构成典型意义上的“不同的语言”。然而,如果你是一名数据科学家或NLP从业者,毫无疑问这是不同的语言。
- 它有不同的词汇。 仅英语,统一医学语言系统(UMLS)就包含200多个词汇表,其中包括了300多万个术语。 相比之下,1989年版的牛津英语词典有171,476个单词(不过,牛津词典应该大致增加三倍,以包含UMLS直接列出的衍生词)。
- 它有不同的语法。这些文本对句子是什么以及语言的词性是什么有自己的定义。 诸如“+恶心”和“自昨天的10/10”之类的陈述是在英语里不存在的语法结构。
- 它有不同的语义。 “呜咽”意味着“呼吸急促”(而不是你想到的另一种意思)。 “否认”意味着患者说他们没有症状,尽管临床医生认为他们可能有。
- 它超越了行话。行话指的是你在进入新学校或新工作的第一个月内学会的100到200个新词。相比之下,理解医疗领域的语言需要的时间和掌握日常意大利语或葡萄牙语一样长。
经验#1:现成可用的NLP模型不起作用
在实践中,为英语构建的现成的NLP库和算法在医疗行业的这种“不同的语言”上会遭到惨败。不仅命名实体识别或实体解析模型会失败,甚至像符号化、词性标注和句子分割这样的基本任务,现成的模型对大多数医疗行业的句子都没用。
如果你不相信,可以随便使用下面列出的六种流行的NLP云服务和库自行测试。除了亚马逊,其他所有工具都提供了一个Web用户界面。通过它,你可以复制粘贴句子以便查看该服务是如何分析句子的了。
1. Google Cloud Natural Language
4. spaCy Named Entity Visualizer
5. Amazon Comprehend (offline)
在2018年12月进行的一项测试中,上述六个引擎唯一识别出的医学术语(其中只有两个引擎识别了出来)是Tylenol(泰诺)是个产品。
医疗行业有数百种语言
和许多人一样,我犯的下一个错误就是想建立“解决通用医疗行业问题”的各种模型。亚马逊的Comprehend Medical正在采用这种方法,推出通用的医疗NLP即服务。这种方法假定医疗行业只有一种语言。 而现实是,每个子专业和它的沟通形式都和别专业根本不同。下面是一些已脱敏的例子:
病理学(外科病理学、癌症):
部分1 标记为“?颈静脉淋巴结中的转移性肿瘤”由浅白色组织的椭圆形片段组成,其尺寸约为0.3×0.2×0.2cm。
放射学(MRI颈椎):
C6-7:存在弥漫性椎间盘骨赘,导致腹侧硬膜囊变平,伴有轻度椎管狭窄和中度至重度双侧神经椎间孔狭窄。其他发现:无椎旁软组织肿块。
预授权:
根据I期试验的结果,患者将接受永久性刺激器植入。具体而言,该患者将接受由Boston Scientific Neuromodulation Corporation制造的脊髓刺激系统(SCS)。 该SCS系统在植入式刺激器内有一个充电电池。与非可充电的SCS系统相比,它允许医生和患者在最佳设置下控制疼痛,而不会影响电池寿命。 Boston Scientific SCS系统已获得FDA批准。
紧急:Tmax在过去的24小时内,99.8,BP-128/82,P-82,R-18 I / O- 3000ml NS IV / 200ml通过foley输出,800ml自行输出
一般:躺在床上,显得舒服
皮肤 :手术切口边缘具有小的红斑,并且与钉子很接近,没有开裂,没有引流。 没有血肿或血清肿形成的迹象。 没有黄疸。
牙科(麻醉,特定牙齿):
将苯佐卡因置于与牙齿1相邻的上颚中。使用长的25号针头将总共0.00管的阿替卡因和4%的肾上腺素按1:100,000注射液注入口中。
药物(剂量、途径、频率、持续时间、形式)
每天需要口服20毫克阿司匹林2次。
需要更多例子吗? 可以花点时间研究一下你自己的检验报告。或者想一下医学院的学生开始学习皮肤科专业,他们需要掌握皮肤病学——等于学习这门语言。甚至从医疗出院记录中识别患者的吸烟状况也复杂到足以成为一个活跃的学术研究领域。
而且,每个医学专业都有很多变化。例如,对于决定是否批准针对MRI的预授权请求,针对植入式脊髓刺激器,需要从预授权表格中查看的项目内容就和别的请求完全不同。另一个例子是在病理学中使用不同的术语来讨论不同类型的癌症。这些对实际问题会带来影响:我所工作的公司正在进行一个项目,该项目需要训练不同的NLP模型,以从病理报告中提取有关肺癌、乳腺癌和结肠癌的事实。
到目前为止,亚马逊的Comprehend Medical仅关注药物价值的正规化(参见上面最后一个“阿司匹林”的例子)。 该服务还具有标准的医疗命名实体识别功能,但不能满足任何特定应用的需求。请不要只相信我所说的,你可以使用它的服务去尝试上面的例子或你自己的文本。如今,这样的NLP服务主要是吸引客户的手段。 像3M和Nuance这样出售“医疗行业NLP”的公司在营销方面更加关注这一点。
经验#2:构建可训练的NLP管道
如果你需要自己构建医疗行业中的NLP系统,则需要针对你构建的特定应用训练NLP模型。但这并不意味着你不能重用现有的软件。你可以重复使用的东西有很多:
可重用:
医学术语 医学词向量 神经网络计算图 NLP管道的API 训练和推断的框架 |
要自建:
病人需要采用什么药物? 病人是否需要胸部CT扫描? 本次门诊的正确的急诊计费码是什么? 这个病人之前是否有怀孕? 他们有已知的过敏症吗? |
当我们为医疗行业构建Spark NLP(Apache Spark的开源NLP库的扩展)时,我们的目的是尽可能多地提供可重复使用的开箱即用的组件。包括,诸如用于临床命名实体识别和脱敏、生物医学实体正规化和断言状态(例如,否定)检测的最前沿的学术论文的生产级实现。使用这些实现不需要学习使用TensorFlow(或任何其他框架),因为深度学习框架已经嵌入在易于使用的Python、Java和Scala API中。 这个库本身是Spark ML的原生扩展,并重用其Pipeline类来构建、序列化和扩展NLP、ML和DL工作流。
把这个库用在现实世界的项目中,让我们了解到“医疗行业的语言”与人类语言是多么的不同。以下是我们构建的一些项目内容:
- 基于深度学习的句子分割。 虽然分割维基百科文章的句子通常只需要使用正则表达式就可以完成,但处理很多页的临床文档是一个更大的挑战。特别是,算法必须应对页眉和页脚、列表、枚举、标注、两栏格式和其他的格式问题。
- 医疗行业特定的词性标注。 不仅需要不同的模型,而且额外的词性标注也被用于医疗行业的模型。 之所以这样做是因为它确实提高了医学命名实体识别的准确性。
- 医疗行业特定的实体标正规化算法。在实际项目里,命名实体识别自己一般是无用的。从“双眼似乎被感染”里识别“眼睛”和“感染”是医学术语并没有多大用处。相反,根据标准SNOMED-CT临床术语将整个文本块标记为代码312132001,同时针对用不同方式对描述相同发现进行正规化则更加有用。这使你的应用能基于此代码来构建业务逻辑,而不管它是如何规正规化的,或者更确切地说,不管它是如何在原来的文本中被表达的。
简而言之:我们越深入地将医疗行业文本视为不同的语言,我们就越来越接近甚至超越同一任务上的人类的准确性。
经验#3:从数据标注开始
那么,该如何开始你自己的项目? 你怎么知道你离事实有多远,谁值得信任?一种方法是从构建标注验证数据集开始。例如,如果你对自动化门诊病例成ICD-10编码感兴趣,请让临床医生定义一些代表性样本,对样本进行脱敏,并让专业的临床编码人员对其进行标注(分配正确的代码)。如果你有兴趣从放射学报告中提取关键事件或从患者病例中找出被忽视的安全事件,请首先让临床医生定义一些样本,并正确标注。
这样做通常会在让数据科学团队加入(并浪费很多时间)前提前发现一些“坑”。如果你无法获得足够的数据,或者无法大规模地进行脱敏,那就无法构建可靠的模型。如果在某些情况下临床医生不能一致同意正确的标注,那么要解决的第一个问题是就临床指南达成一致,而不是让数据科学家参与尝试去自动化这种不一致。最后,如果你发现自己面临非常不平衡的类别(比如你寻找的是每年只有少数人患病的情况),那么在引入数据科学家之前修改问题的定义可能是明智之举。
一旦有了一个有代表性的和已商定并正确标注的验证集,你就可以开始用它来测试现有的库和云服务提供商的服务了。很可能的是,这个测试将立即发现每个产品与你的需求之间的差距。我们与之合作过的最聪明的团队已经设置了为期一周或两周的测试项目,其目标是使用标准库或云服务来发现它们能达到的满足用户特定需求的最高准确度。这样做就可以评估下面每项服务的难易程度,包括:训练自定义的模型、定义领域专有的特征、解决方案所需的pipeline步骤和把结果解释给客户。
这种方法对你的团队来说会是一个很好的教育机会。它会测试你的软件以及你需要评估的服务的支持/咨询等方面。这样做将会告诉你与业务需求的准确度级别还有多少距离。最后,第3个经验可以帮你自己判断经验1和2,而不用完全相信我的话。
祝你好运,并希望你在项目中取得成功。 因为我们所说的是医疗行业,世界需要你成功!
相关资源
- 即将举办的Strata数据伦敦大会上的辅导课:“使用Spark NLP进行大规模自然语言理解”
- 《机器学习模型转化为真实的产品和服务的经验教训》
- David Talby的《为Apache Spark构建自然语言处理库》
- 《比较生产级NLP库》
- Maryam Jahanshahi的《利用机器学习和分析来吸引和留住员工》
- Alan Nichol的《使用机器学习来改进会话应用的对话流程》
- David Ferrucci的为什么《语言理解仍然是人工智能面临的巨大挑战之一》
- David Blei的《主题模型:过去、现在和未来》