🚀 🍊 韓国医療用DPR(Dense Passage Retrieval)
このモデルは、医療分野で使用できるBi-Encoder構造の検索モデルです。韓英混じりの医療記録を処理するために、「SapBERT-KO-EN」をベースモデルとして使用しています。質問はQuestion Encoderを、テキストはContext Encoderを使用してエンコードします。
(※ このモデルはAI Hubの超巨大AIヘルスケア質問応答データで学習したモデルです。)
🚀 クイックスタート
この医療用DPRモデルは、医療分野の情報検索に利用できます。以下のセクションで、モデルの詳細、学習方法、使用例を説明します。
✨ 主な機能
- Bi-Encoder構造を用いた検索モデルで、質問とテキストをそれぞれエンコードします。
- 韓英混じりの医療記録を処理できるよう、SapBERT-KO-ENをベースモデルとして使用しています。
- 同じコードの用語間で高い類似度を持つように学習しています。
🔧 技術詳細
(1) Self Alignment Pretraining (SAP)
韓国の医療記録は韓英混じりで書かれているため、英語用語も認識できるモデルが必要です。Multi Similarity Lossを使用して、同じコードの用語間で高い類似度を持つように学習しました。
例) C3843080 || 高血圧疾患
C3843080 || Hypertension
C3843080 || High Blood Pressure
C3843080 || HTN
C3843080 || HBP
(2) Dense Passage Retrieval (DPR)
SapBERT-KO-ENを検索モデルにするために、追加のFine-tuningが必要です。Bi-Encoder構造を用いて、質問とテキストの類似度を計算するDPR方式でFine-tuningを行いました。既存のデータセットに韓英混じりのサンプルを増強したデータセットを使用しました。
例) 韓国語病名: 高血圧
英語病名: Hypertenstion
質問 (元データ): 父が高血圧なのに何なのかわからない。高血圧が何なのか説明してくれ。
質問 (増強): 父がHypertenstionなのに何なのかわからない。Hypertenstionが何なのか説明してくれ。
📦 インストール
このREADMEには具体的なインストール手順が記載されていないため、このセクションを省略します。
💻 使用例
基本的な使用法
このモデルはContextをエンコードするモデルで、Questionモデルと一緒に使用する必要があります。同じ疾患に関する質問とテキストが高い類似度を示すことが確認できます。
(※ 以下のコード例は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日1回処方.""",
"""救急室到着後、胃内視鏡検査を実施.
所見: Gastric ulcerでForrest IIbが観察された. 出血は少量の滲出性出血の形態.
処置: エピネフリン注射で出血減少を確認. Hemoclip 2個で出血部位をクリッピングして止血完了.""",
"""血中の高い脂肪値と脂肪肝所見.
多発性gallstonesが確認された. 症状がない場合は経過観察を推奨.
右腎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"Similarity between query and target {idx}: {similarity:.4f}")
高度な使用法
このコード例では、基本的な使用法を示しています。高度な使用法については、このREADMEに記載がないため省略します。
Similarity between query and target 0: 0.2674
Similarity between query and target 1: 0.0416
Similarity between query and target 2: 0.0476
📚 ドキュメント
このモデルに関する詳細なドキュメントは、このREADMEに記載されている情報がすべてです。
📄 ライセンス
このモデルはMITライセンスの下で提供されています。
Citing
@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}
}