概要
人間が記述した文章から特定の意味や関係性を抽出する行為は情報抽出と呼ばれ、自然言語処理におけるタスクの一つです。人間により収集された情報はオントロジーや知識グラフのような関係性を持つ構造として表現することで、抽出した概念の関係性を理解してきました。こうした知識の構築は、言語の文法構造を利用しルールベースで半自動で抽出する方法が広く用いられていますが、近年では単語の意味的な情報を活用し自動獲得する方法が出てきました。
私は最近Ubieという医療の問診AIを開発している会社にジョインしたのですが、医療自然言語処理の世界でもこうした情報抽出の研究が行われています。そうした特定のドメインでの自然言語処理ではデータやタスクにユニークなものが多く、そうした分野間の違いが現れるところが自然言語処理の面白いところです。
そこでこの記事では、ウェブから収集した医療分野における大規模テキストデータから、疾患(病気)の類似度を自動で獲得してみようと思います。例えば頭痛と腹痛は痛みという観点では似ていますが、痛みの部位が異なります。一方で、頭痛と蕁麻疹は症状も部位も異なり、腹痛よりは概念的には大きく離れていそうと言えます。こうした疾患の類似度を、なんとか文章から抽出しようというわけです。
手法
今回はword2vecと呼ばれる単語の分散表現を獲得する方法を使って、疾患に対応するベクトルを計算し、その数値的な類似度から疾患の関係性を評価します。実際に大規模テキストからは様々な単語の意味を学習するのですが、単語の分散表現では単語の意味というのは周囲の文脈により決定されます。疾患の単語でも同様に、周囲でどんな言葉が使われやすいかという共起情報を元にして、疾患の意味的な要素が学習されるというわけです。そうした周囲の単語の使われ方を元にして、疾患の類似度が計算されます。
1. 医療分野の大規模データ収集
まず初めに、インターネットで公開されている医療関連のウェブページからテキストを収集します。対象としては、医療情報が記載された辞典、医療に関連するニュースサイトやコラム記事、医学論文のアブストラクトなど、疾患に関連する単語が含まれていそうなテキストを選定しました。
2. 専門用語を考慮した分散表現を学習
今回はテキスト中から疾患名を正しく抽出する必要があるため、疾患名が広く網羅された万病辞書(Version:MANBYO_201907
)を利用しました。この辞書による分かち書きで得られた約3,300万語ほどの文章を元に、単語の分散表現を計算します。分かち書きにはMeCabを、word2vecの計算にはgensimを用いました。
3. 疾患と分散表現の関連付けを行う
次に、疾患に対する分散表現の対応付けを行います。疾患をまとめる単位として、ここではICD-10という国際疾病分類に従ったコードを用います。例えば「頭痛」はICDコードではR51
というコードが付与されており、この中には「炎症性頭痛」や「神経痛性頭痛」といった疾患も含まれています。
分かち書きで用いた万病辞書では、多くの単語にICDコードが付与されています。一つのICDコードに複数の単語が紐付いているため、ICDコードごとに含まれる単語の単語ベクトルの平均を計算し、そのICDコードに対応する疾患の分散表現としました。
万病辞書から単語と紐付いたICDコードは7,661件、そのうち上記方法で分散表現を計算できた疾患は2,398件でした。
4. 疾患の類似度を求める
疾患ごとの分散表現のベクトルを用いて、疾患間の類似度を計算します。今回は近似最近傍探索のFaissを用いました。なお、サンプルコードではgensimのmost_similar()
を使っていますが、距離以外は同じような結果になります。
コードと疾患ベクトル
ここで作成した疾患ごとのベクトルおよび利用のためのサンプルコードは、下記レポジトリで公開しております。
結果
それでは結果を見てみましょう。ここではクエリとなる疾患に対して類似度が高い疾患上位10件を近い順に表示しています。疾患ごとにICDコードとそれに紐づく疾患名を最大で3個、そして疾患間の距離を表示しています。
例) 頭痛
- クエリ:R51 頭痛/頭重感/後頭部痛
rank | icd code | disease_name | distance |
---|---|---|---|
1 | R42 | めまい/めまい感/めまい発作 | 0.29512033 |
2 | M5422 | 頚部痛/項部痛/頚性頭痛 | 0.31296897 |
3 | R101 | 心窩部痛/胃痛/上腹部痛 | 0.34621543 |
4 | R104 | 腹部圧痛/側腹部痛/腹痛症 | 0.3733242 |
5 | M5456 | 腰痛症/殿部痛/急性腰痛症 | 0.4009727 |
6 | M7919 | 筋肉痛/下肢筋肉痛/上肢筋肉痛 | 0.40209955 |
7 | R298 | 筋力低下/脱力感/項部硬直 | 0.41064307 |
8 | M7969 | 下肢痛/上肢痛/四肢痛 | 0.41939706 |
9 | G442 | 緊張型頭痛/筋収縮性頭痛/慢性緊張型頭痛 | 0.41947567 |
10 | G471 | 過眠/特発性過眠症/過眠症 | 0.42242908 |
例えば「頭痛」では、他の痛みを伴う疾患より上位に「めまい」が来ています。これはめまいが頭痛と似た状況で起きやすいからかもしれません。また、痛みという意味では胃痛や筋肉痛が類似疾患として出てきており、これらはICDコードの1桁目から異なるアルファベットであることから、ICD的な階層構造では離れた分類の疾患が近くに来ているのも興味深い点です。
例) 白血病
- クエリ:C959 白血病/混合型白血病/白血病性関節症
rank | icd code | disease_name | distance |
---|---|---|---|
1 | C859 | 悪性リンパ腫/リンパ腫/胃悪性リンパ腫 | 0.31251624 |
2 | C950 | 急性白血病/低形成性白血病/混合型性乳児急性白血病 | 0.42647696 |
3 | C837 | バーキットリンパ腫/Burkitt lymphoma/Burkittリンパ腫 | 0.4992422 |
4 | C831 | マントル細胞リンパ腫/Mantle cell lymphoma/mantle cell lymphoma | 0.5266465 |
5 | C910 | 急性リンパ性白血病/小児急性リンパ性白血病/Tリンパ芽球性白血病 | 0.57279545 |
6 | C819 | ホジキンリンパ腫/結節硬化型ホジキンリンパ腫/Hodgkinリンパ腫 | 0.586313 |
7 | C951 | 慢性白血病 | 0.5891196 |
8 | E800 | プロトポルフィリン症/遺伝性赤芽球増殖性ポルフィリン症/赤芽球増殖性プロトポルフィリン症 | 0.62282044 |
9 | C499 | 血管肉腫/肉腫/平滑筋肉腫 | 0.6289653 |
10 | C833 | びまん性大細胞型B細胞性リンパ腫/中枢神経系原発びまん性大細胞型B細胞性リンパ腫/細網肉腫 | 0.63575506 |
「白血病」では、他の白血病の疾患やリンパ腫が上位に来ており、ICDコード的にも C00-C97 悪性新生物<腫瘍>に含まれる疾患ということで納得感があります。
例)アルコール依存/ニコチン依存
- Query: F102 アルコール依存症/アルコール症/アルコール依存
rank | icd code | disease_name | distance |
---|---|---|---|
1 | F101 | アルコール乱用/アルコール多飲/アルコール多飲歴 | 0.5259693 |
2 | F509 | 摂食障害/食事摂取不良/再度発熱 | 0.5777397 |
3 | F209 | 統合失調症/モレル・クレペリン病/統合失調症患者 | 0.6091969 |
4 | F29 | 精神病/非器質性精神病/精神疾患 | 0.64880073 |
5 | F99 | 精神障害/心因反応/心因性反応 | 0.6665521 |
6 | F432 | 適応障害/遷延性抑うつ反応/悲嘆反応 | 0.6984394 |
7 | F429 | 強迫性障害/強迫障害/強迫症 | 0.72358906 |
8 | F410 | パニック障害/パニック発作/挿間性発作性不安 | 0.72472537 |
9 | F329 | うつ病/うつ状態/反応性うつ病 | 0.73075795 |
10 | F100 | 急性アルコール中毒/宿酔/単純酩酊 | 0.7444916 |
- Query: F172 ニコチン依存症/タバコ離脱症状
rank | icd code | disease_name | distance |
---|---|---|---|
1 | F102 | アルコール依存症/アルコール症/アルコール依存 | 0.92863643 |
2 | H690 | 耳管開放症/両側耳管開放症/右耳管開放症 | 0.9723743 |
3 | J450 | 小児喘息/アレルギー性気管支炎/アトピー性喘息 | 1.0050822 |
4 | F209 | 統合失調症/モレル・クレペリン病/統合失調症患者 | 1.0825346 |
5 | F429 | 強迫性障害/強迫障害/強迫症 | 1.0910233 |
6 | F101 | アルコール乱用/アルコール多飲/アルコール多飲歴 | 1.1014088 |
7 | E785 | 脂質異常症/高脂血症/高リポ蛋白血症 | 1.1336122 |
8 | F03 | 認知症/老年期うつ病/初老期認知症 | 1.1413462 |
9 | F319 | 躁うつ病/双極性感情障害/周期性精神病 | 1.1512845 |
10 | F432 | 適応障害/遷延性抑うつ反応/悲嘆反応 | 1.1775064 |
最後に「アルコール依存」ですが、麻薬やタバコなどの依存に関連する疾患が含まれておらず、精神性の疾患が多く出てきています。一方で「ニコチン依存症」では、アルコール依存が最も近い疾患とされ、他にもタバコによる耳管開放症や喘息が含まれています。これらのことから、併発する別の疾患が上位に出ていそうなことがわかります。
精度評価と既存研究
私は医師ではないですし医療ドメインの知識がないので判断が難しいところですが、ある程度それらしい結果になったのではないでしょうか?定性的にはある程度うまく情報抽出ができていると言えそうです。一方で定量的な評価で言うと、一般的には人間が作成した正解セットを元に類似度やアナロジーに関して精度を評価しますが、今回は疾患に関して評価データを準備できませんでした。
似たような研究として、[大村ら, 2019]でも同様に医学文献のテキストから単語の分散表現を学習し、疾患の類似度を求めています。この研究では人間が手動で作成した疾患類似データを用いて定量的に評価しており、疾患の症状や部位情報を元にしたアルゴリズムよりも、分散表現による類似度の精度が多少劣るという結果になっています。
こちらの研究は英語を元に分散表現の学習や評価データセット作成を行っていますが、ICD-10のコードを元に日本語のデータセットも作ることができれば、今回の結果も評価ができるかもしれませんね。
まとめ
この記事では、大規模な医療テキストを元に疾患の分散表現を学習し、疾患ベクトルの距離から疾患の類似度を算出してみました。結果の解釈や定量的な評価は難しかったものの、素人が見た限りではある程度納得感のある出力が得られたのではないかと思います。今回は疾患だけを対象にしましたが、疾患に関連する症状や部位などの有用性の指摘されていることから、それらの情報も同じ空間に埋め込めんで活用できると面白いかもしれません。