うしのおちちの備忘録

AtCoderや日記、自然言語処理などについて書きます。

病名の表記揺れを吸収するライブラリを作った

はじめに

日本語の病名を病名辞書である万病辞書に紐づけるパッケージを所属研究室のRAとして作りました。この記事ではそもそも病名の表記揺れとはどういうものなのかから、パッケージの基本的な機能を紹介します。

github.com

病名の表記揺れ吸収

医療のテキストデータを扱っている人なら経験があると思いますが、病名は電子カルテや医学論文中でさまざまな表記をされます。例えば、「高血圧」が「HT」とか具体的な血圧値で書かれていたりしていて、そのままだとシステムは全くの別物としてみなしてしまいます。そのため、書かれている病名を概念レベルでまとめる必要があり、それを病名の表記揺れ吸収とかいったりして、自然言語処理系の会議や医療情報系のジャーナルとかでよく研究されています。

病名の表記揺れ吸収は、類義語がたくさん集まった辞書を用意し、入力テキストと一番近い類義語を見つけることで行われます。類義語はICD-10とかの疾病の分類に紐づいているので、それと似ている入力テキストも同じ概念だろう、というわけです。

高度な推論についてはACLなどの自然言語処理のトップ会議の論文(最近だと[1, 2]とか)をみていただくとして、実用上はもっと手軽に、だけどそれなりの精度で表記揺れを吸収したい場面も多いと思います。英語ではMetaMapとか有名なソフトウェアがあり広く普及していますが、日本では代表的なソフトウェアは自分の知る限り公開されていません。

そのため、日本語の病名辞書である万病辞書をベースに、日本語の病名の表記揺れ吸収パッケージをつくりました。簡単に機能などを紹介します。

機能

基本的には入力された病名を、一番近い万病辞書のエントリに紐付けます。

>>> from japanese_disease_normalizer.normalizer import Normalizer
>>> normalizer = Normalizer("abbr", "fuzzy")
>>> normalizer.normalize("急性骨髄性白血病")
DictEntry(name="急性骨髄性白血病", icd="C920", norm="急性骨髄性白血病", level="S")

他の細々した機能は以下の通りです。

  • 略語の展開
    入力したテキストの任意の部分文字列について、アルファベットがあった場合に略語の展開を試みます。下にいくつか簡単な例を出します。内部的には略語辞書での完全一致による変換を行っています。
>>> normalizer.normalize("AML")
DictEntry(name="急性骨髄性白血病", icd="C920", norm="急性骨髄性白血病", level="S")

>>> normalizer.normalize("低K血症")
DictEntry(name="低カリウム血症", icd="E876", norm="低カリウム血症", level="S")
  • Spacy extension
    Spacyの固有表現抽出の後ろにつけるコンポーネントです。add_pipeしておけば、固有表現について先程の表記揺れ吸収までしてくれるようになります。ちなみにSpacyの病名認識モデルも公開予定なので、それと合わせると手軽に病名を抽出・表記揺れ吸収できます。
import spacy
from japanese_disease_normalizer.spacy_extension import ManbyoNormalizer

nlp = spacy.load("/path/to/NER_model")
nlp.add_pipe("manbyo_normalizer")

text = "急性骨髄性白血病により緊急入院"
doc = nlp(text)
for ent in doc.ents:
    print(ent._.norm)

現状でできないこと

とはいえ高度な推論を行っていないので、できないこともたくさんあります。

  • 文脈を考慮した表記揺れ吸収
    例えば「AML」は「急性骨髄性白血病」と「血管筋脂肪腫」の二通り考えられますが、それは文書の性質や文脈をみないとわかりません。今回のパッケージではそれは考慮していません。

  • 意味的な類似性を考慮した推論
    単語埋め込み表現などを利用しておらず、文字列としての類似性のみに着目しています。そのため、万病辞書のエントリとかけ離れている表現への動作は保証できません。

おわりに

今回は病名表記揺れ吸収のパッケージを紹介しました。まだまだ不完全な部分が多いですが、使っていただける方がいればフィードバックをいただけると幸いです。

参考文献

[1] Liu F, Shareghi E, Meng Z, Basaldella M, Collier N. Self-Alignment Pretraining for Biomedical Entity Representations. In: Proc. of NAACL; 2021:4228-4238.
[2] Angell R, Monath N, Mohan S, Yadav N, McCallum A. Clustering-based Inference for Biomedical Entity Linking. In Proc. of ACL; 2021:2598-2608.