基于命名实体识别的医疗文本零水印方案*

2020-11-06 08:29龚礼春唐观根吴国华
密码学报 2020年5期
关键词:字符医患实体

龚礼春, 姚 晔, 唐观根, 吴国华

1. 杭州电子科技大学 网络空间安全学院, 杭州310018

2. 杭州电子科技大学 计算机学院, 杭州310018

1 引言

随着医疗技术的进步与人们生活水平的提高, 人们越来越重视自己的身体状况. 无论是患普通感冒的病人, 或者是身染重症的患者, 大多数人都希望通过医生的诊断与治疗, 使自己的身体能够早日康复. 患者对医院/医生能够治疗其疾病寄予了较高期望. 然而, 患者抱有的期望越高, 导致医患之间产生矛盾时, 两者的关系越发紧张.

如何有效解决医疗纠纷问题、缓解紧张的医患关系是始终值得被关注地话题. 医疗文本记录着医生为患者治疗的全部过程. 文本内容中包含不少与医疗术语相关的名词. 这些名词在医疗文本中扮演极其重要的角色, 其完整与否能够成为解决医患纠纷问题的重要参考与证明. 因此, 医疗文本的内容安全研究具有重要的理论意义与实际的应用价值.

零水印方法不修改数字载体内容, 仅从载体中提取特征来构造水印[1], 因此其具有极好的隐蔽性. 应用零水印方法, 将医疗文本中相关术语作为零水印构造的特征, 能够有效保护医疗文本重要内容的完整性.然而, 已有的分词工具很难准确的切分医疗文本中的相关医疗术语. 例如: 使用NLPIR-ICTCLAS 平台对“右下支气管” 这一完整医疗术语进行分词, 会被拆分成“右/下支/气管” 该种形式, 使得医疗文本的重要特征不能被充分应用于文本的安全性保护. 针对该问题, 本文提出了一种基于命名实体识别的医疗文本零水印方案. 借助自然语言处理领域中的命名实体识别技术, 提取医疗文本中存在的医疗实体, 设计零水印算法. 利用实体特征生成零水印信息, 将水印存入被授权的第三方机构. 当发生医患纠纷时, 调取出第三方存储的水印作为医疗文本重要内容完整性与安全性的依据, 从而为医患问题的解决提供有效的参考与证明.

2 相关工作

中文文本水印技术的实现方式可以分为两类. (1) 嵌入式水印, 通过修改载体文本信息嵌入水印. 已有的方法包括: 拆分汉字的偏旁部件嵌入水印信息[2]; 利用不可见字符替换文本中空格来隐藏信息[3]; 使用文件格式隐藏信息[4]; 或者对同义词进行编码, 通过同义词替换嵌入信息[5]. (2) 零水印技术, 不修改载体文本信息, 仅通过提取载体文本特征来构造水印. 这两类水印技术的差异主要表现在以下三个方面. ①不可视性: 零水印技术在嵌入水印过程中不修改载体信息, 使得嵌入水印后的文本与原文本视觉上表现一致,因而具有极高的不可视性. ②水印稳健性: 嵌入式水印要求较高地稳健性, 当载体受到攻击后, 水印信息应尽可能被完整提取; 而零水印要求表现较强的脆弱性, 以抵抗篡改攻击[6]. ③水印容量: 由于嵌入式水印要考虑隐蔽性与水印容量之间的矛盾, 导致水印嵌入容量较低; 零水印能较好的避开该问题, 进而提高了水印嵌入容量.

零水印技术被广泛应用于图像、视频、音频领域, 然而以文本为载体的零水印技术应用相对较少[7,8].目前, 国内学者针对中文文本的不同特征, 提出一些较为实用的中文文本零水印算法. 2005 年, 程玉柱等人分析单个汉字特征, 将汉字结构抽象成数学表达式构造零水印[9]. 2009 年, 斯琴等人基于词语特征, 使用词典分词方法将词频阈值范围内的分词序列作为文本零水印的生成特征[10]. 该算法使用词典分词的方法效率较低. 2010 年, Meng 等人融合信息熵的思想, 根据文本词频计算句子的熵, 将熵较大的句子作为文本的重要句子, 提取句子序号作为零水印信息[11]. 然而, 算法并没有考虑停用词对句子熵的影响, 有时提取的特征不具代表性. 2011 年舒娟娟等人基于汉语词性特征, 利用中科院分词系统对文本分词与词性标注, 筛选出中频词性词语作为文本特征生成零水印[12]. 该算法使用词性特征, 适用于普通文本. 2013 年,Liu 等人调用依存句法分析器提取中文文本的句法语义特征, 并借助同义词词林对特征进行编码, 生成零水印信息[13]. 刘杰等人针对汉字笔画统计特征, 提取文本中使用频率较高的汉字笔画数作为零水印构造特征序列[14]. 2016 年, Zhu 等人根据汉语拼音声韵母组合特点, 以音数值为零水印构造依据, 提出基于汉语拼音的文本零水印方法[15]. 算法虽具有很好的创新性, 但是实现相对复杂. 同年, 周新民等人为了解决在网络中传递的文本内容真实可靠的问题, 提出一种基于汉字结构知识的文本认证零水印算法[16]. 与此同时, Wen 等人将零水印技术应用到xml 格式的文本上, 利用xml 文件中函数间依赖性特征产生零水印信息[17]. 2017 年, Meng 等人从多特征的角度考虑, 提出一种针对散文文体的零水印方案[18]. 该方案使用散文文本的语义与统计特征(词性、词频、词语权重等) 构造零水印, 具有较好的应用价值.

由此可见, 当前文本零水印算法绝大多数被应用于普通文本, 使用普通文本中的通用特征构造水印,忽略了文本应用领域的多样性. 医疗文本中拥有许多专业的术语, 医疗专业术语特征与普通文本具有较大的差异. 普通文本中的特征提取方法并不适用于医疗文本. 本文在前人对文本零水印算法研究与应用的基础上, 针对医疗文本的特点, 使用命名实体识别技术[19]提取医疗文本实体; 将实体特征作为零水印构造依据, 以保护医疗文本内容安全. 本文主要贡献包括: (1) 将零水印技术用于中文医疗文本, 扩展了文本零水印应用领域. (2) 引入命名实体识别技术提取医疗文本特征, 解决了一般分词工具对医疗文本术语切分准确率较低的问题, 能够提取出医疗文本中重要且具有代表性的特征.

3 方案

本文方案利用命名实体识别技术抽取医疗文本实体, 根据获得的实体特征, 设计零水印生成算法、并给出零水印验证流程, 保护医疗文本重要内容的安全, 为医患问题解决提供参考与证明. 方案的整体流程如图1 所示.

图1 整体流程图Figure 1 Overall process diagram

由图1 可见, 零水印产生主要由三部分组成: (1) 预处理; (2) 特征提取; (3) 水印生成. 整个方案涉及到的符号与含义如表1 所示.

表1 方案中的符号含义Table 1 Symbol definition in the scheme

3.1 预处理

预处理阶段的主要任务是将待保护的医疗文本T, 输入医疗文本命名实体识别模型M 中, 输出该医疗文本的实体集D. 医疗文本命名实体识别模型使用深度神经网络训练, 如图2 所示.

图2 训练模型图Figure 2 Training model

本文医疗文本命名实体识别模型使用双向长短期记忆网络(BiLSTM) 与条件随机场(CRF) 训练生成[20]. 命名实体识别技术是有监督的学习, 在训练模型前, 采用BIOES 标注法对医疗文本实体进行标注,将实体分为五种类型. 该五种类型包括: 身体部位(body)、症状与体征(sign)、检查与检验(check)、疾病与诊断(disease)、治疗药物(treatment), 基本可以对囊括医疗领域内的专业术语. 模型M 的训练过程如下.

(a) 顺序取出医疗文本字符, 赋予每个字符对应偏旁部件与词性标注后, 输入到嵌入层中. 嵌入层将字符转化为向量, 其中, 字符与偏旁部件使用Word2Vec 模型与预训练好的偏旁部件模型向量化,词性标注采用随机向量化. 将字符向量偏旁部件向量, 词性向量, 通过连接层处理后组成单行向量et. 字符特征构成如表2 所示. 该表中“糖尿病” 属于疾病与诊断一类, 其首字符标签为B-disease, 中间字符标签为I-disease, 尾字符标签为E-disease, 非实体字符被标记为O.

表2 字符特征Table 2 Character feature

(b) 将et输入到BiLSTM 层中捕获特征, LSTM 由遗忘门、记忆门、输出门三个处理单元构成. 其中, 遗忘门丢弃无用信息; 记忆门记住重要信息; 输出门输出隐藏状态. 其基本原理如公式(1)所示.

公式(1)中, ft代表遗忘门值, mt代表记忆门值,代表临时细胞状态, ot代表输出门值, · 表示向量点乘, ⊙表示向量连接, 最终输出ht. BiLSTM 由前向与后向两个LSTM 组成, 因此每个字符输出前向隐藏状态() 与后向隐藏状态(). 将两个隐藏状态在其相应位置上连接, 形成单个字符完整隐藏状态

公式(2)中, f 表示相似度计算函数, i 表示句子除当前字符外的其他字符, i ∈[1,N -1], αi表示两个隐藏状态的权重,表示字符注意力向量.

(d) 为了提高命名实体识别的准确率, 用CRF 层学习标签转移概率矩阵A. 最终通过标签转移概率矩阵, 计算输入序列对应的最优标签输出序列. 其计算如公式(3)所示.

公式(3)中, Pi,yi表示第i 个输入被标记为标签yi的概率, score(x,y) 计算标签序列y 的评分, Y

医疗文本训练数据经过上述过程不断迭代, 将评分最高的模型保存起来, 留作后续待保护疗文本实体预测之用. 将待保护医疗文本中的字符使用同样方式生成字符向量, 顺序输入至医疗命名实体识别模型预测, 生成该医疗文本的标签序列(Tag_sequence).

3.2 特征提取

特征提取阶段的主要工作是从实体识别模型获得的标签序列(Tag_sequence) 中提取特征, 对特征进行编码, 将编码后的特征分类与融合. 医疗文本实体重要特征包括: 实体名称、实体顺序、实体长度. 特征提取部分算法流程, 如算法1 所示.

算法1 特征提取算法Input: T, Tag_sequence, Di Output: DF 1 Entity_order = 0;2 for each Di ∈T do 3 Entity_name = getentityname (T, Tag_sequence);4 Entity_order += 1;5 B_index = beginchar (Di, T);6 E_index = endchar (Di, T);7 Entity_length = E_index - B_index + 1;8 Entity_feature = featurecode (Entity_name, Entity_order, Entity_length);9 Entity_tag = getentitytag (Di, Tag_sequence);10 if judge_type(Entity_tag) equals 1 then 11 list_1.save(Entity_feature);12 else if judge_type(Entity_tag) equals 2 then 13 list_2.save(Entity_feature);14 else if judge_type(Entity_tag) equals 3 then 15 list_3.save(Entity_feature);16 else if judge_type(Entity_tag) equals 4 then 17 list_4.save(Entity_feature);18 else if judge_type(Entity_tag) equals 5 then 19 list_5.save(Entity_feature);20 end 21 end 22 DF = merge (list_1, list_2, list_3, list_4, list_5);23 Return DF.

算法1 中, 对于医疗文本中任意一个实体Di, 首先, 依据文本T 中字符与标签序列(Tag_sequence)之间的顺序对应关系, 获取该实体的名称(Entity_name). 按照实体在医疗文本中出现的先后顺序给每个实体分配一个序号(Entity_order), 序号是实体的重要特征, 能有效验证医疗文本内句子是否发生了移位.然后, 执行算法第5 行和第6 行, 分别获得某一实体在文本中的首字符位置索引和尾字符位置索引, 使用实体首尾位置索引值计算实体的长度(Entity_length), 实体长度信息能增强零水印抗非等长实体替换攻击的能力. 执行算法第8 行将实体的三个特征编码成二进制形式. 其中, 实体名称先转换成Unicode 编码形式, 进而转为二进制编码. 接着, 获取实体的标签信息(Entity_tag), 根据标签-类型映射表3 查找实体的类型, 通过判断实体类型对应的映射值, 对不同类型的实体特征编码进行分类, 并保存于对应list_i 中,如算法第9 到20 行所示. 最后, 融合所有类型的特征, 返回该医疗文本实体特征DF, 如算法第22 和第23 行所示.

3.3 水印生成

水印生成阶段的主要任务是将一篇医疗文本的特征DF, 输入到零水印生成算法中, 计算该医疗文本的水印信息, 将时间戳和医患的身份信息附加到水印的尾部, 一起发送到第三方认证机构注册与存储. 为了保证生成的水印信息可靠与安全, 在零水印生成算法中使用了Logistic 混沌加密方法; 为了提高水印验证时的效率, 使用MD5 算法能有效将水印信息映射为32 字节长度. 水印的生成过程, 如算法2 所示.

表3 标签-类型映射Table 3 Label-type mapping

算法2 水印生成算法Input: DF, μ, K0, thresh Output: w′1 for n = 0 to len(DF) do 4 Kn+1 = 0;2 Kn+1 = μ×Kn ×(1-Kn);3 if Kn+1 <thresh then 5 L = Kn+1 ⊕DFn;chaos.save(L);7 else 6 8 Kn+1 = 1;L = Kn+1 ⊕DFn;10 chaos.save(L);11 end 12 end 13 w′ = MD5(chaos);14 Return w′.9

算法2 中, μ 表示Logistic 混沌函数参数, 当其取值位于3.569 9456 ≤μ ≤4 该范围内, 获得序列是混乱、无序的, K0表示混沌函数初始值, 取值区间为[0,1]. 混沌方程的迭代次数由DF的长度决定, 假设长度为n, 混沌方程迭代后将生成一个长度为n 的序列, 且该序列中的每个值均0 <Kn+1<1. 通过预先设定的阈值thresh, 将混沌序列二值化处理. 对于特征序列DF中的每一个特征值DFn, 将该值与混沌序列对应位置上的值进行异或运算生成值L, 其中⊕代表异或运算符, 混沌序列对特征序列的加密结果保存于chaos 中. 最后, 使用MD5 算法生成该医疗文本的水印信息w′. 为了确保水印的唯一性, 将当前时间信息和医患的身份信息附加到w′尾部, 将捆绑的信息发送放到第三方认证机构注册与保存. 为了保证水印安全性, 参数μ、K0、thresh 可视为加密密钥, 对外严格保密.

3.4 水印验证

水印验证过程的主要工作是将医患双方持有的医疗文本, 通过同样的预处理、特征提取、水印生成算法, 获取各自医疗文本的水印信息. 然后, 第三方认证机构根据医患的时间戳和身份信息验证并调取出注册的水印信息, 去除附加在水印尾部的信息后, 分别与医患生成的水印信息对比, 从而证明医患手中持有的医疗文本重要内容是否完整. 零水印验证过程如图3 所示.

普通文本的版权认证过程, 大多数是计算文本持有者生成的水印信息与第三方保存水印信息之间的相似度, 根据相似度大小从而判断版权的归属者. 然而, 医疗文本内记录着医生为患者治疗的全部过程, 内容中的任何实体被篡改都会关系到医患双方的利益. 医疗文本的实体必须高度完整, 即使发生细微的修改最终生成的水印与第三方保存的水印也不同. 因此, 本文引入MD5 算法不仅是为了提高第三方机构对水印管理和验证的效率, 同时保证生成水印的唯一性, 增强了零水印的脆弱性. 在图3 中, 水印对比只有两种结果: 完全相同或不相同. 最终用水印信息完全相同的医疗文本作为解决医患纠纷问题的证明与参考, 保护受害者的权益.

图3 水印验证Figure 3 Watermark verification

4 实验结果

本章节主要对方案的可行性进行实验分析, 实验的内容主要包括: (1) 模型的性能评估(2) 方案抗攻击能力. 实验环境: Window10 操作系统, Anaconda 环境, python3 开发语言, pytorch 框架等一些库. 实验数据使用CCKS-2017 数据集[20].

4.1 模型的性能评估

模型的性能一般使用准确率(precision)、召回率(recall)、F-score 三个指标进行评估. 其中,precision表示预测出来的实体中的确属于医疗实体的占比; recall 表示医疗文本中的实体被正确预测出来的占比;F分数是准确率与召回率的调和平均值, 计算公式如(4)所示. 本文医疗文本命名实体识别模型的训练使用CCKS-2017 数据集, 该数据集中一共包含病史特点、出院情况、一般项目、诊疗经过四个文件夹, 每个文件夹下有300 个标注的医疗文本, 共1200 个医疗文本数据. 此外, 该数据集还包含400 个测试医疗文本数据. 将1200 条文本数据随机进行划分, 其中80% 为训练数据, 20% 为验证数据, 具体训练方法与流程已在预处理中详细介绍.

在经过长时间迭代后, 模型最终达到收敛, 在第30 个epoch 时, 模型的准确率达到93.15%, 召回率为93.54%, F-score 为93.32%, 并且训练过程中最高F-score 达到94.43%. 图4 是测试数据中一个医疗文本经模型预测输出的结果.

图4 模型预测结果Figure 4 Prediction results of the model

实验结果表明, 若能对训练医疗文本中实体进行正确的标注, 实体识别模型的效果会有显著提升, 并且能够将实体中包含的数字准确识别出来. 由图4 可见, 针对一般分词工具无法准确划分的较长医疗术语,例如:“腰部软组织损伤”, “神经系统查体”, “腰椎正侧位片”, “血压: 120/80 mmHg” 等, 命名实体识别模型具有较佳的预测效果。医疗实体名称是医疗文本特征的一部分, 在识别出实体之后, 还需获取实体顺序、长度特征、实体分类特征, 进一步组成一个文本的完整特征. 图5 展示了该医疗文本的全部特征.

图5 实体特征Figure 5 Entity characteristics

由图5 可见, 医疗文本中的任何一个实体可用四维特征表示. 其中, 前3 维是用构造零水印的重要特征, 按顺序分别为实体名称、实体序号、实体长度. 最后一维是实体的类别映射值, 用于对实体特征进行分类.

4.2 水印抗攻击能力

为了验证方案的可行性, 本文以400 篇测试医疗文本作为实验对象. 分别对医疗文本的格式与内容进行攻击, 以验证文本被攻击后生成的水印是否与原文本一致. 对文本的格式攻击实验结果如表4 所示.

表4 文本格式攻击结果Table 4 Format attack result of text

由表4 可见, 对文本进行常见的格式攻击, 被攻击后文本生成的水印与原文本完全一致. 根据水印生成算法可知, 为每篇医疗文本生成水印, 使用的是医疗文本的实体特征. 然而, 实体特征属于文本内容的一部分. 因此, 对文本进行格式攻击, 水印依然与原文本保持一致.

本方案的主要目的是对医疗文本中的重要内容进行保护, 从而期待为医患问题的解决提供重要依据.因此, 为了能够验证文本实体内容被篡改, 经过算法生成的水印是否与原文本一致. 实验使用图4 中的文本作为原始文本, 该医疗文本的原始水印信息为“e535ddfd856f44a56d94367daae62770”, 将该水印信息存入第三方认证机构. 然后, 对该文本实体内容分别采取添加、删除、替换、及句子移位攻击, 以观察攻击后对水印产生的影响. 其中, 实体添加攻击如图6 所示.

图6 添加实体攻击Figure 6 Adding entity attack

如图6, 分别在文本的两处添加了症状与体征相关的实体, 添加的部分实体内容增强患者未治疗前的严重程度, 突出治疗后的效果. 然而, 该文本生成水印信息为“a7f238c9645f922e525b859d59fdb9b5”, 与第三方存储的原始文本水印信息不同. 实体删除攻击如图7 所示.

实验过程删除了包括检查与检验以及身体部位在内的两处实体, 最终经算法输出的水印信息为“1c0dcaa454cace6289d2ec44a2f0c7e6”, 与注册水印信息不同. 实体替换攻击如图8 所示.

图7 删除实体攻击Figure 7 Deleting entity attack

图8 替换实体攻击Figure 8 Replacing entity attack

在一定程度上, 实体替换攻击能够改变原文本传达的意思。然而, 被攻击过后的文本生成水印信息为“592047761b321c392e6dd9ab70eac392”, 与第三方水印信息比较, 依旧可以证明该文本被篡改. 句子移位攻击如图9 所示.

图9 句子移位攻击Figure 9 Moving sentence’ position attack

虽然句子位置移动并不会改变一篇医疗文本实体的数量, 但是在生成的实体特征时, 为每个实体分配唯一一个序号. 该序号能有效对抗因句子移动导致实体顺序改变的攻击, 使得算法最终生成的水印信息为“97c8293a975d8923409799f6bb600c25” 与原文本水印信息不一致.

5 总结

本文针对医疗文本内容安全问题, 提出一种基于命名实体识别的医疗文本零水印方案. 在提出的方案中, 引入命名实体识别技术, 解决了一般分词工具无法准确切分医疗文本专业术语问题. 设计实体特征获取算法、水印生成算法、并给出水印验证方法, 实现了医疗文本重要内容的完整性认证与保护. 最终, 通过对命名实体识别模型的评估实验, 以及文本格式和实体的添加、删除、替换、句子移位攻击实验, 表明了本方案具有良好的可行性.

猜你喜欢
字符医患实体
字符代表几
前海自贸区:金融服务实体
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
HBM电子称与西门子S7-200系列PLC自由口通讯
实体的可感部分与实体——兼论亚里士多德分析实体的两种模式
两会进行时:紧扣实体经济“钉钉子”
振兴实体经济地方如何“钉钉子”
一句“咱妈的病”让医患成为一家
解开医患千千结