カテゴリ:
この記事は、大都会岡山 Advent Calendar 2017 19日目のエントリーです。

さあ、みなさんは岡山に似ている都道府県はどこだとおもっていますか?
広島、香川、静岡、、 など、十人十色な答えが出てくると思います。

今回はそのまた1つ違う答えとして、
岡山に似ている都道府県をWikipedia的に解析していきたいと思います。

つかうもの

Wikipediaの記事
MeCabという形態素解析機
Word2Vecというニューラルネットワーク
コサイン類似度

この4つです。 
これらがどういうものなのかについては全く説明しませんので調べてください。

やりたいこと

Wikipediaの記事をMeCabで分かち書きにします。
そして、そこに出現する単語をWord2Vecで学習させて、 ベクトル化します。
最後に、岡山県と各都道府県の名前の単語のベクトルをコサイン類似度を用いて比較していきます。

解析環境

MacBookPro13インチ(2016)
Ubuntu 16.04 in VirtualBox on macOS
Python3系

データセットの用意

今回はWikipediaのデータを利用するのでそれをダウンロードしてきます。
https://dumps.wikimedia.org/jawiki/
2017年12月1日のデータを利用します。
$ wget https://dumps.wikimedia.org/jawiki/20171201/jawiki-20171201-pages-articles.xml.bz2

wikipediaのデータをXML→TXTに変換

Rubyで書かれたwp2txtと言うものをインストールして使います。
gemでインストールできます。
$ sudo gem install wp2txt
(ruby-dev, ruby-buildがなかったらインストールしてください。)

$ wp2txt --input-file jawiki-20171201-pages-articles.xml.bz2 --no-list --no-heading --no-marker -f 99
しばらく時間がかかります。

終わると幾つかのファイルに分割されているので、くっつけます。
$ cat jawiki-20171201-pages-articles.xml-* > jawiki-20171201.txt
3GBになりましたー!ぱちぱちぱち。

MeCabインストール

MeCab
$ sudo apt install mecab libmecab-dev mecab-ipadic mecab-ipadic-utf8

neologd辞書
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ sudo ./bin/install-mecab-ipadic-neologd
(curlがなかったらaptでインストール)

Mecabの辞書パスを変更する
$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
$ sudo vim /etc/mecabrc
dicdirを上で確認したパスに変更

実行確認
$ mecab
で実行させて適当に日本語を入力したら形態素解析されることを確認できればOKです。

データセットの前処理

日本語の文は英語のように単語が区切られていないため、区切る必要があります。
それをMeCabが行ってくれます。

さっき出力したデータセットをMeCabに食べさせてあげれば勝手にやってくれます。
$ mecab -b 100000 -Owakati jawiki-20171201.txt -o jawiki-20171201-wakati.txt
これもしばらく時間がかかります。
3.6GBになりましたー!ぱちぱちぱち。

Word2Vecで学習

今回は、PythonのgensimライブラリにあるWord2Vecで学習していきます。
Pythonコード(train.py)はGithubにあげておきます。

$ python3 train.py jawiki-20171201-wakati.txt jawiki-20171201.model

しばらく時間がかかります。完了したらモデルが保存されます。
注、メモリは10GBぐらいないとモデルを保存する時にメモリエラーになります。


学習モデルから岡山県と各都道府県のコサイン類似度を計算

今回は、PythonのgensimライブラリにあるWord2Vecで学習していきます。
Pythonコード(calc.py)はGithubにあげておきます。

$ python3 calc.py jawiki-20171201.model 岡山県

メモリむっちゃ食います

結果


岡山県 1.0
山口県 0.927375485189
香川県 0.919382596218
広島県 0.917198679497
愛媛県 0.882751265092
佐賀県 0.880626212672
大分県 0.877781324933
福岡県 0.876426394088
兵庫県 0.872788433289
鳥取県 0.869529966787
島根県 0.86566874622
高知県 0.86045742375
京都府 0.847743270475
宮崎県 0.844942012071
徳島県 0.836974578018
和歌山県 0.835330778448
大阪府 0.832141094886
滋賀県 0.826369845773
福井県 0.824681809215
長崎県 0.817901845731
三重県 0.81155340475
石川県 0.808844019565
熊本県 0.797191584469
鹿児島県 0.786278074853
奈良県 0.780323281132
静岡県 0.778174483198
茨城県 0.771013043307
愛知県 0.764744811027
埼玉県 0.741934399635
富山県 0.740654065454
栃木県 0.739955051206
千葉県 0.735857965406
沖縄県 0.73160945034
秋田県 0.724718072244
神奈川県 0.719473647281
宮城県 0.710110328223
山梨県 0.709235108508
長野県 0.707129592618
岐阜県 0.704504163026
青森県 0.703485561749
山形県 0.691812031829
群馬県 0.69116102088
福島県 0.673939010919
岩手県 0.654629672884
北海道 0.653791214075
新潟県 0.645771529958
東京都 0.6208546649

まとめと今後

岡山は東京とは程遠いことがわかった

今回は単語に対するベクトルのコサイン類似度で岡山県ににている都道府県ランキングをおこないました。なぜこのような結果になるのかイマイチわかりませんが、これがWikipedia先生による答えです。笑
今後、単語ではなくWikipediaの都道府県ページのページに対する文書ベクトルをLSTMなどを用いて作った場合、ランキングがどうなるのか、変わるのかなどをやれればと思います。
プログラムに関しては、ランキングを計算するcalc.pyがいちいちモデルを読み込んで類似度を計算しなおして、、っていう流れになってますが、一旦都道府県の単語ベクトルを保存しておいて、その単語ベクトルから別のプログラムで類似度計算してランキングを出す方が賢い気がしました。気が向いたら直します。(すぐ治りますけどね。笑)
以上です。 

今回書いたコードはGithubに上げてます。
https://github.com/keisuke-oni/pref-similarity_based-word 

頑張る学生へのクリスマスプレゼントお待ちしております。
http://amzn.asia/azMxKyU

参考文献
word2vecを使って、日本語wikipediaのデータを学習する - Qiita
https://qiita.com/tsuruchan/items/7d3af5c5e9182230db4e 

Ubuntu 14.04 に Mecab と mecab-python3 をインストール - Qiita
https://qiita.com/elm200/items/2c2aa2093e670036bb30

自然言語処理をなにも知らない私がword2vecを走らせるまで: 最尤日記
http://saiyu.cocolog-nifty.com/zug/2014/02/word2vec-1867.html 

wikipedia全文データからWord2Vecで類義語を抽出してみる - Ai coordinator
https://ai-coordinator.jp/wikipedia-word2vec

Python で「老人と海」を word2vec する - m0t0k1ch1st0ry
https://m0t0k1ch1st0ry.com/blog/2016/08/28/word2vec/