许可证: mit
语言:
- 韩文
基础模型:
- klue/bert-base
任务标签: 特征提取
标签:
- 医疗
🍊 韩语医疗领域密集段落检索模型(DPR)
1. 简介
这是一款适用于医疗领域的双编码器结构检索模型。
为处理韩英混合的医疗记录,采用SapBERT-KO-EN作为基础模型。
问题通过问题编码器编码,文本通过上下文编码器编码。
(※ 本模型基于AI Hub的超大规模AI医疗问答数据集训练而成。)
2. 模型
(1) 自对齐预训练(SAP)
韩国医疗记录采用韩英混合书写,需要能识别英语术语的模型。
通过多重相似度损失函数,使相同代码的术语之间具有高相似度。
示例) C3843080 || 高血压疾病
C3843080 || Hypertension
C3843080 || High Blood Pressure
C3843080 || HTN
C3843080 || HBP
(2) 密集段落检索(DPR)
为使SapBERT-KO-EN成为检索模型,需进行额外微调。
采用双编码器结构的DPR方式进行微调,计算查询与文本的相似度。
使用在原始数据集基础上增强韩英混合样本的数据集:
示例) 韩文病名: 高血压
英文病名: Hypertenstion
原始查询: 父亲有高血压但不知道是什么。请解释一下高血压是什么。
增强查询: 父亲有Hypertenstion但不知道是什么。请解释一下Hypertenstion是什么。
3. 训练
(1) 自对齐预训练(SAP)
SapBERT-KO-EN训练使用的基础模型及超参数如下。
采用收录韩英医疗术语的KOSTOM词典作为训练数据。
- 模型: klue/bert-base
- 数据集: KOSTOM
- 训练轮数: 1
- 批大小: 64
- 最大长度: 64
- 丢弃率: 0.1
- 池化方式: 'cls'
- 评估步长: 100
- 阈值: 0.8
- 正样本缩放: 1
- 负样本缩放: 60
(2) 密集段落检索(DPR)
微调使用的基础模型及超参数如下:
- 模型: SapBERT-KO-EN(klue/bert-base)
- 数据集: 超大规模AI医疗问答数据(AI Hub)
- 训练轮数: 10
- 批大小: 64
- 丢弃率: 0.1
- 池化方式: 'cls'
4. 示例
本模型为上下文编码模型,需与问题模型配合使用。
可观察到相同疾病相关的问题与文本具有较高相似度。
(※ 以下代码示例为ChatGPT生成的医疗文本。)
(※ 由于训练数据特性,模型对规范化文本表现更佳。)
import numpy as np
from transformers import AutoModel, AutoTokenizer
q_model_path = 'snumin44/medical-biencoder-ko-bert-question'
q_model = AutoModel.from_pretrained(q_model_path)
q_tokenizer = AutoTokenizer.from_pretrained(q_model_path)
c_model_path = 'snumin44/medical-biencoder-ko-bert-context'
c_model = AutoModel.from_pretrained(c_model_path)
c_tokenizer = AutoTokenizer.from_pretrained(c_model_path)
query = 'high blood pressure处方案例'
targets = [
"""高血压诊断。
患者咨询及生活习惯矫正建议。低盐饮食、规律运动、禁烟、禁酒指示。
患者复诊。血压:150/95mmHg。开始药物治疗。Amlodipine 5mg每日1次处方。""",
"""急诊室到达后行胃内窥镜检查。
所见:Gastric ulcer中观察到Forrest IIb。出血呈少量渗出性出血形态。
处置:肾上腺素注射确认出血减少。用Hemoclip 2个对出血部位进行夹闭完成止血。""",
"""血液中高脂质水平及脂肪肝所见。
发现多发性gallstones。无症状时建议观察经过。
右侧renal cyst,良性可能性高,无需额外处置。"""
]
query_feature = q_tokenizer(query, return_tensors='pt')
query_outputs = q_model(**query_feature, return_dict=True)
query_embeddings = query_outputs.pooler_output.detach().numpy().squeeze()
def cos_sim(A, B):
return np.dot(A, B) / (np.linalg.norm(A) * np.linalg.norm(B))
for idx, target in enumerate(targets):
target_feature = c_tokenizer(target, return_tensors='pt')
target_outputs = c_model(**target_feature, return_dict=True)
target_embeddings = target_outputs.pooler_output.detach().numpy().squeeze()
similarity = cos_sim(query_embeddings, target_embeddings)
print(f"查询与目标{idx}的相似度: {similarity:.4f}")
查询与目标0的相似度: 0.2674
查询与目标1的相似度: 0.0416
查询与目标2的相似度: 0.0476
引用
@inproceedings{liu2021self,
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},
pages={4228--4238},
month = jun,
year={2021}
}
@article{karpukhin2020dense,
title={Dense Passage Retrieval for Open-Domain Question Answering},
author={Vladimir Karpukhin, Barlas Oğuz, Sewon Min, Patrick Lewis, Ledell Wu, Sergey Edunov, Danqi Chen, Wen-tau Yih},
journal={Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing (EMNLP)},
year={2020}
}