Word2Vec, MeCab, ComeJisyo で病気の症状類似語を出してみた

More than 1 year has passed since last update.

エムスリー(ヘルスケア系)のAdvent Calendar に参加しているので、ヘルスケア系機械学習ネタ

ちょっと前に業務とは関係なく、症状類語辞書をつくりたいなーーというときがあった。(結局できてないけど
そのときに去年流行った word2vecを使って機械学習で症状の類義語がどれくらい精度よく出てくるかをやってみたのでその話を書く

今回の流れ

  1. 医療文書が入ったtextファイルを作成
  2. MeCab へ医療用辞書 ComeJisyo を設定
  3. MeCab で分かち書く
  4. word2vec で学習
  5. word2vec を利用
  6. 浅い浅い考察と感想

医療文書が入ったtextファイルを作成

今回は精度を比較するために、2つのテキストを用意した。
一つ目は word2vecでは鉄板の大量の単語があるWikipediaのデータから、もう一つは医療系文書のデータを使用した。

1.Wikipediaのテキストファイル

Wikipedia から一番新しい日本語ページの圧縮ファイルを取得

jawiki-20151002-pages-articles.xml.bz2
※2GBくらいあります

元々のファイルはタグがあるので、wp2txtを使って、xmlタグを削除
参考:wp2txtでwikipediaのコーパスを作るまでの道のり

2.医療系文書のテキストファイル

こちらはMSD株式会社が無償で公開しているメルクマニュアルの中の病気事典のデータを使った。個人での利用は問題なさそう。

MeCab へ ComeJisyoを設定

word2vec で学習させるためには、日本語の場合分かち書きが必要になる。
英語なら「I like MeCab」のようにスペースで単語を区切るが、日本語は当然スペースがない。
それを区切ってくれるのがMeCabの分かち書き機能。

今回は医療用の辞書をMeCabに登録してから、分かち書きをする。
問題としてはMeCabのデフォルトの辞書だと、単語を分かちすぎてしまっていた。
以下のような感じ

消化 器 の 病気
栄養 障害

これを以下のようにいい感じに分かち書いてくれるように医療系単語の辞書を追加した

消化器 の 病気
栄養障害

ComeJisyoのインストール

医療単語を3万語ほど登録しているMeCab用の辞書
ダウンロードページ

Comeというのはコメディカルから取っているっぽい(?)
参考:MeCab 用医療用語辞書と分野適応の話

dicファイルの作成

dic 形式のバイナリファイルが圧縮ディレクトリに入っているのだが、思いっきりWinマークが書いている。ということで mac 様に使えるように同梱されているCSVファイルから、dic 形式のファイルを自分でつくることに

※ComeJisyoはwindows 向けに元々つくられているようなので、ComeJisyoV5-1.csvのCSVの文字コードはShift-JISから、utf-8にしておく

以下のコマンドを実行しdicファイルを作成

$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u comejisyo.dic -f utf-8 -t utf-8 /path/to/ComeJisyoV5-1-utf8.csv

Segmentation Fault が出たのでファイルを見てみると、csv ファイルに改行が入っていなかったので、vi で改行

Excelで作ったcsvファイルの改行^MをViで見れるようにする(Mac)
http://qiita.com/alleyoop_jp/items/550535b72088d4891461

しかしまた、エラーが出た

reading ComeJisyoV5-1.csv ... dictionary.cpp(38) [fi] 

読み込み中にエラーが出ましたということで、ノーヒントすぎることに焦りつつも、入力ファイル内の最下部の以下の行を消して

ComeJisyoV5-1.csv
## Fri Nov 15 07:13:38 2013 by AddAtrriPOS.pl IN: ComeJisyoV5.csv REF: NewAttriCome.txt ,,,,,,,,,,,,,
## Number of matches = 77760(77775),,,,,,,,,,,,, 

再度実行

reading ComeJisyoV5-1-utf8.csv ... 77758
emitting double-array: 100% |###########################################| 

done!

ということで無事生成成功

これでカレントディレクトリにcomejisyo.dicという辞書ファイルができている

dicファイルの登録

できた.dic ファイルを置く場所を確認し、パスを/usr/local/etc/mecabrcに書く

/usr/local/etc/mecabrc
dicdir =  /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic
+ userdic = /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic/comejisyo.dic

同じディレクトリ内にできた.dicファイルを置く
そしてここでできたファイルを適当なところに置く。今回は元々デフォルトの辞書ファイルがあったところに置いた。

$ cp comejisyo.dic /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic/

あとはmecabコマンドを使うと、登録した辞書を使ってくれる

MeCab で分かち書く

分かち書きの準備が出来たので、上記の2つのテキストファイルを分かち書きする

$ mecab -Owakati -b 81920 input.txt > input-wakati.txt

分かち書きの結果

#(comejisyo追加前)
消化 器 の 病気
栄養 障害
#(comejisyo追加語)
消化器 の 病気
栄養障害

というように医療用語もちゃんと分かち書きしてくれる。

word2vecに学習させる

word2vec をSVNリポジトリからチェックアウトし、学習させる

$ svn co http://word2vec.googlecode.com/svn/trunk/ word2vec
$ cd word2vec
# 分かち書きしたテキストから学習
$ time ./word2vec -train input-wakati.txt -output output.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -binary 1

word2vec を利用

$ ./word2vec/distance output.bin
Enter word or sentence (EXIT to break):

これで待機状態になっているので、キーワードを入力すると似たような単語を出力してくれる

Enter word or sentence (EXIT to break): 発熱

Word: 発熱  Position in vocabulary: 469
WordCosinedistance  
------------------------------------
悪寒  0.657951
筋肉痛   0.577947
頭痛  0.570335
だるさ   0.565388
体重減少    0.561049
疲労感   0.544651
倦怠感   0.531282
疲労  0.522171
関節痛   0.520417
嘔吐  0.51709
けん怠感    0.515117
腰部痛   0.489901
吐き気   0.482678
高熱  0.474001
全身症状    0.472455
腹痛  0.470872
微熱  0.468774
呼吸困難    0.461953
息切れ   0.457791
腹部疝痛    0.45111
胸痛  0.449443
寝汗  0.445744
発疹  0.441956
ゾクゾ   0.441713
食欲不振    0.441528
脱力感   0.428432
頸部リンパ節  0.427851
胸部不快感 0.421547
項部硬直    0.416178
鼻水  0.412592
視野障害    0.394176
下痢  0.391713
せき  0.389469
喘鳴  0.386997
鈍痛  0.38623
胃けいれん 0.382502
ひどい   0.382299
食欲低下    0.381671
顔面蒼白    0.381075
偶発性   0.380476

ということで、Wikipedia、病気事典でどちらが思わしそうな結果が出るか、それぞれ幾つか症状を入力してみた。

食欲不振

Wikipedia メルクマニュアル
順位 類似語 類似度 類似語 類似度
1 下痢 0.843648 吐き気 0.587919
2 嘔吐 0.801633 体重減少 0.569463
3 吐き気 0.793031 嘔吐 0.532759
4 口渇 0.791562 疲労感 0.490138
5 頭痛 0.789381 腹部不快感 0.45932
6 発疹 0.788856 脱力感 0.458968
7 全身倦怠感 0.786242 発熱 0.441528
8 嘔気 0.778978 下痢 0.430816
9 症状 0.776218 疲労 0.427453
10 水様性 0.773985 めまい 0.423664

発熱

Wikipedia メルクマニュアル
順位 類似語 類似度 類似語 類似度
1 血圧低下 0.73928 悪寒 0.657951
2 一過性 0.730484 筋肉痛 0.577947
3 下痢 0.717753 頭痛 0.570335
4 浮腫 0.715904 だるさ 0.565388
5 呼吸数 0.712025 体重減少 0.561049
6 食欲不振 0.705072 疲労感 0.544651
7 症状 0.70462 倦怠感 0.531282
8 肺水腫 0.698047 疲労 0.522171
9 発疹 0.697446 関節痛 0.520417
10 急性 0.695987 嘔吐 0.51709

頻尿

Wikipedia メルクマニュアル
順位 類似語 類似度 類似語 類似度
1 排尿障害 0.745896 排尿時 0.518344
2 全身倦怠感 0.735907 尿意切迫 0.489464
3 尿意切迫 0.726622 排尿 0.426911
4 主症状 0.722449 尿意 0.40361
5 全身性 0.722397 渇き 0.376594
6 浮腫 0.718602 尿 0.370113
7 悪液質 0.716779 滴り 0.362815
8 便秘 0.715599 血尿 0.36258
9 白血球減少 0.711988 切迫性尿失禁 0.351542
10 嘔吐 0.711927 ポタポタ 0.351351

気分障害

Wikipedia メルクマニュアル
順位 類似語 類似度 類似語 類似度
1 不安障害 0.773216 うつ病 0.485515
2 機能異常 0.665601 両極 0.451542
3 白血球減少 0.665457 心的外傷後ストレス障害 0.439696
4 広汎性発達障害 0.658806 単極 0.419579
5 パニック障害 0.646543 いら立ち 0.407374
6 消化器疾患 0.646008 双極性障害 0.38921
7 フェニトイン 0.641544 不安障害 0.388338
8 血液障害 0.639739 不安 0.381513
9 アルツハイマー型認知症 0.638091 抑うつ状態 0.367868
10 全身倦怠感 0.636831 抗うつ薬 0.365328

浅い浅い考察と感想

  • 率直にいうと、思ったほどの結果は出なかった。というのが感想。食欲不振とかは空腹感とかが症状としては似ていると思うのだがそういったものが出てきていない。

  • 両方で、かなり単語にばらつきがあった。これはけっこう予想外だった。

  • 全体的に見て、Wikipediaの方が類似度が高くなっている。これはWikipediaの方が圧倒的に登録語数が多いからだろうか

Wikipedia メルクマニュアル
Vocab size 270,565 28,486
Words in train file 119,992,519 304,752,649

単語の数はWikipediaの方が1/3なのに単語の種類は10倍くらいWikipediaの方が多い。流石辞書。

  • Wikipediaにはなく、メルクマニュアルにはある単語などもあり、そういう意味では専門的なソースを使うことはやはりかなり意味がありそう。
  • 2つのテキストファイルをまとめてやったときはより幸せな結果が出そうだが、今回はここまで、、