岡山に似ている都道府県はどこだ!Wikipedia・言語処理的ランキング〜。
この記事は、大都会岡山 Advent Calendar 2017 19日目のエントリーです。
さあ、みなさんは岡山に似ている都道府県はどこだとおもっていますか?
広島、香川、静岡、、 など、十人十色な答えが出てくると思います。
今回はそのまた1つ違う答えとして、
岡山に似ている都道府県をWikipedia的に解析していきたいと思います。
MeCabという形態素解析機
Word2Vecというニューラルネットワーク
コサイン類似度
この4つです。
これらがどういうものなのかについては全く説明しませんので調べてください。
そして、そこに出現する単語をWord2Vecで学習させて、 ベクトル化します。
最後に、岡山県と各都道府県の名前の単語のベクトルをコサイン類似度を用いて比較していきます。
Ubuntu 16.04 in VirtualBox on macOS
Python3系
https://dumps.wikimedia.org/jawiki/
2017年12月1日のデータを利用します。
$ wget https://dumps.wikimedia.org/jawiki/20171201/jawiki-20171201-pages-articles.xml.bz2
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になりましたー!ぱちぱちぱち。
$ sudo apt install mecab libmecab-dev mecab-ipadic mecab-ipadic-utf8
neologd辞書
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
頑張る学生へのクリスマスプレゼントお待ちしております。
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/
さあ、みなさんは岡山に似ている都道府県はどこだとおもっていますか?
広島、香川、静岡、、 など、十人十色な答えが出てくると思います。
今回はそのまた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になりましたー!ぱちぱちぱち。
今回は、PythonのgensimライブラリにあるWord2Vecで学習していきます。
今回は、PythonのgensimライブラリにあるWord2Vecで学習していきます。
岡山は東京とは程遠いことがわかった
今回は単語に対するベクトルのコサイン類似度で岡山県ににている都道府県ランキングをおこないました。なぜこのような結果になるのかイマイチわかりませんが、これがWikipedia先生による答えです。笑
今後、単語ではなくWikipediaの都道府県ページのページに対する文書ベクトルをLSTMなどを用いて作った場合、ランキングがどうなるのか、変わるのかなどをやれればと思います。
プログラムに関しては、ランキングを計算するcalc.pyがいちいちモデルを読み込んで類似度を計算しなおして、、っていう流れになってますが、一旦都道府県の単語ベクトルを保存しておいて、その単語ベクトルから別のプログラムで類似度計算してランキングを出す方が賢い気がしました。気が向いたら直します。(すぐ治りますけどね。笑)
以上です。
今回書いたコードはGithubに上げてます。
https://github.com/keisuke-oni/pref-similarity_based-word
(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/