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

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

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

###今回の流れ

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


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

##1.Wikipediaのテキストファイル
Wikipedia から一番新しい[日本語ページの圧縮ファイル](https://dumps.wikimedia.org/jawiki/
)を取得

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

元々のファイルはタグがあるので、[wp2txt](https://github.com/yohasebe/wp2txt)を使って、xmlタグを削除
参考：[wp2txtでwikipediaのコーパスを作るまでの道のり](http://qiita.com/wwacky/items/8a9eb543171afea90c0a)

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

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

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

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

```none
消化 器 の 病気
栄養 障害
```
これを以下のようにいい感じに分かち書いてくれるように医療系単語の辞書を追加した

```none
消化器 の 病気
栄養障害
```

##ComeJisyoのインストール
医療単語を3万語ほど登録しているMeCab用の辞書
[ダウンロードページ](https://osdn.jp/projects/comedic/)

Comeというのはコメディカルから取っているっぽい(?)
参考：[MeCab 用医療用語辞書と分野適応の話](http://d.hatena.ne.jp/mamoruk/20081125/p2)


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


```text: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`に書く

```diff:/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ファイルを置く
そしてここでできたファイルを適当なところに置く。今回は元々デフォルトの辞書ファイルがあったところに置いた。

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

```

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

#MeCab で分かち書く

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

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

分かち書きの結果

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

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

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

#word2vecに学習させる

[word2vec](https://code.google.com/p/word2vec/) をSVNリポジトリからチェックアウトし、学習させる


```none
$ 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 を利用

```none
$ ./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にはなく、メルクマニュアルにはある単語などもあり、そういう意味では専門的なソースを使うことはやはりかなり意味がありそう。
- ２つのテキストファイルをまとめてやったときはより幸せな結果が出そうだが、今回はここまで、、