医疗领域构建自然语言处理系统的经验教训

2024-01-13 07:40

本文主要是介绍医疗领域构建自然语言处理系统的经验教训,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


AI Conference in Beijing


重要通知:AI Conference 2019北京站早期优惠价格本周五(5月10日)即将结束!

点击 阅读原文 查看会议详情和报名通道!席位有限,抢票入场!

我们正处于自然语言处理(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 

2. IBM Watson NLU

3. Azure Text Analytics

4. spaCy Named Entity Visualizer

5. Amazon Comprehend (offline)

6. 斯坦福大学Core NLP

在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批准。

术后(来自SOAP说明的目标部分):

紧急: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的《主题模型:过去、现在和未来》

This article originally appeared in English: "Lessons learned building natural language processing systems in health care".

David Talby

David Talby是Pacific AI的首席技术官。他正在帮助多个快速发展的公司应用大数据和数据科学技术来解决医疗保健、生命科学和相关领域的实际问题。David在构建和运营互联网规模的数据科学和业务平台以及构建世界一流的敏捷分布的团队方面拥有丰富的经验。在加入Pacific AI前,他曾在微软的Bing Group工作,负责Bing Shopping在美国和欧洲的业务运营。他还在在西雅图和英国为亚马逊工作。在那里他建立并管理分布的团队,帮助扩展亚马逊财务系统。David拥有计算机科学博士学位和计算机科学硕士与工商管理硕士学位。

640?wx_fmt=png

这篇关于医疗领域构建自然语言处理系统的经验教训的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/600700

相关文章

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.