読者です 読者をやめる 読者になる 読者になる

鴨川にあこがれる日々

軽い技術っぽい記事かいてます

ブラックボックス感半端じゃ無いけど重複をのぞいた「図書館」を含むツイートにword2vecをつかい単語の類似度を測ってみた

たまにword2vecというツールをここ最近聞くようになりました。
word2vec - Tool for computing continuous distributed representations of words. - Google Project Hosting
自然言語処理の技術でニューラルネットというモデルを使っているツールだそうです(内部のことは入門書を読んではみましたが全くわかっていません。)
これ→O'Reilly Japan - word2vecによる自然言語処理

とりあえず、「言葉をベクトル化して演算ができる!やった!」というのが手軽にできるイメージで触っています。

前回のエントリーで集めたツイートのうち重複(RTやBotとおもわれるため)を簡単に取り除いたデータを訓練データとしてword2vecを使ってみました。
目論見が正しければ、「寝る」や「借りる」「勉強する」「行く」あたりの動詞の類似度が高く、また名詞でみれば、「戦争」と「映画」が高い類似度を示すはずです。

前処理は

  • MySQLからデータをエクスポートしてテキストのみを抽出
  • テキストの重複を取り除く
  • word2vecを訓練させる

まずエクスポートした2014年5月26日夜中から6月4日の朝までの176,500件のツイートをCSVファイルとして出力し、テキストの抽出を行います。

i = 0
data = {}
line = ""
while text = gets
  line += text.chomp
  if line =~ /\+0900$/
    tweet_info = line.split(',')
    data[tweet_info[0]] = [tweet_info[1],tweet_info[2]]
    i += 1
    line = ""
  end
end

data.each do |key,value|
  puts value[0]
end

出力したファイルを data.txtとしました。

次に重複を取り除きます。UNIXコマンドのUNIQを使うだけで完全一致の重複は取り除けます。UNIQする前にはSORTする必要があります。重複を取り除いたデータをtrain.txtとしました。

$ sort data.txt | uniq > train.txt

$ wc -l train.txt
>125178 train.txt

$ mecab -Owakati < train.txt > train_wakati.txt

行数(=ツイート数)をカウントすると約125,000件まで減りました。約30%が完全に重複しているツイート(大半がbot、RT、ツイートボタンによる自動生成)だということになります。中身を少し見てみたところ、完全一致でないが同一の内容を示しているもの(広告や含まれるURLが微妙に違うなど)も本来取り除くべきですが、今回は無視しました。TwitterAPIに含まれるsource(クライアントなどなにから発信されたツイートであるかを示す情報)からも判断して取り除いた方が良さそうだったので、後日行います。そしてmecabをつかってtrain.txtを分かち書き(形態素毎にスペースで区切る)します。

準備が整ったのでword2vecでdemo-word.shを手本にして学習を行います。

$ ./word2vec -train train_wakati.txt -output tweets.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -threads 12 -binary 1
Starting training using file train_wakati.txt
Vocab size: 24299
Words in train file: 3890893
Alpha: 0.000460  Progress: 98.42%  Words/thread/sec: 39.22k

1分くらいで学習が終わりました。5単語を文脈として200次元のベクトル空間が生成されています。


あとはword2vecのdistanceを実行すれば単語を入力するとその単語とコサイン類似度が大きい単語出力します。1に近いほど言葉の意味(使われ方)が近い、-1に近いほど、意味が離れているということになります。
例えば「大学」といれてみます。「近所」「地元」「学校」「高専」という図書館のある場所を指す単語が大きい類似度を示しています。

Enter word or sentence (EXIT to break): 大学

Word: 大学  Position in vocabulary: 118

                                              Word       Cosine distance
------------------------------------------------------------------------
                                            近所		0.662552
                                            地元		0.650694
                                            学校		0.642469
                                            高専		0.617376
                                         最寄り		0.550010
                                            付属		0.546754
                                         中学校		0.544923
                                         トイレ		0.544871
                                         入り口		0.540840
                                            北大		0.534285
                                         小学校		0.534021
                                            駒場		0.529912
                                            母校		0.528523
                                         東工大		0.524920
                                            市営		0.524834
                                            --		0.520426
                                            刈谷		0.519703
                                         筑波大		0.518376
                                         早稲田		0.511200
                                   ハーバード		0.510648
                                         工学部		0.508510
                                            高校		0.508154
                                            戸山		0.507102
                                               奥		0.502380
                                            窓際		0.500778
                                            本学		0.500627
                                         ソファ		0.500528
                                            合間		0.498029
                                               裏		0.497670
                                            日進		0.497327
                                            工科		0.496645
                                         多摩美		0.491316
                                      キャレル		0.490949
                                            個室		0.490734
                                         法学部		0.490412
                                         駐輪場		0.490288
                                      アメリカ		0.489128
                                            元町		0.487757
                                            柳川		0.487469
                                            学部		0.487340

次に「勉強」です。類似度が小さかったので、一部のみ出力しました。一応は「昼寝」との類似度が他に比べると高いです。

Enter word or sentence (EXIT to break): 勉強
Word: 勉強  Position in vocabulary: 39

                                              Word       Cosine distance
------------------------------------------------------------------------
                                            昼寝		0.539335
                                         絵かき		0.507373
                                            泊り		0.487867
                                         絵描き		0.459578
                                            散歩		0.453371
                                      ひんやり		0.450474
                                      のんびり		0.425750
                                      姉ちゃん		0.424573
                                            邪魔		0.419347
                                イチャイチャ		0.410135

次に「借りる」です。本を目的語とする動詞が比較的高い類似度を示しています。

Enter word or sentence (EXIT to break): 借りる

Word: 借りる  Position in vocabulary: 544

                                              Word       Cosine distance
------------------------------------------------------------------------
                                            読む		0.749235
                                            探す		0.675323
                                            買う		0.673103
                                            返す		0.633142
                                            使う		0.582436
                                            盗ん		0.576346
                                      どころか		0.571109
                                         読める		0.566982
                                            選ん		0.564149
                                         分厚い		0.561097

「市立」だと図書館の前につく形として類似した言葉がでてきます。(なぜ浜松?)

Enter word or sentence (EXIT to break): 市立

Word: 市立  Position in vocabulary: 222

                                              Word       Cosine distance
------------------------------------------------------------------------
                                            中央		0.733308
                                            浜松		0.696333
                                            府立		0.651513
                                            区立		0.646707
                                            府中		0.644541
                                               市		0.634085
                                            前橋		0.633049
                                            県立		0.627754
                                               ◎		0.626872
                                            豊中		0.626647
                                            那覇		0.624984
                                            札幌		0.622816
                                            笠岡		0.619431
                                            水戸		0.612306
                                            城北		0.610802

次に「武雄」です。地名の他に「教委」「市長」「CCC」あたりの単語が出てくるのが特徴的です。

Enter word or sentence (EXIT to break): 武雄

Word: 武雄  Position in vocabulary: 365

                                              Word       Cosine distance
------------------------------------------------------------------------
                                      武蔵村山		0.649534
                                            教委		0.648879
                                         あきる		0.647041
                                            昭島		0.646449
                                               CCC		0.613651
                                            旭川		0.612501
                                         東大和		0.610093
                                            田原		0.609051
                                            立川		0.601884
                                            尾道		0.595701
                                            市長		0.587848

最後に「戦争」です。「図書館戦争」作品について言及する文脈から、シリーズの「内乱」やキャラクタの「堂上」がでてきます。また
「定期 このから好きなアニメがある人はRT〜」
といったツイートから共起するアニメ作品名が出てきています。

Enter word or sentence (EXIT to break): 戦争

Word: 戦争  Position in vocabulary: 94

                                              Word       Cosine distance
------------------------------------------------------------------------
                                            内乱		0.654729
                                            別冊		0.635341
                                               篤		0.593312
                                            実写		0.592251
                                            危機		0.588696
                                               Ⅱ		0.584074
                                            玄田		0.555273
                                               郁		0.553295
                                            教官		0.553185
                                            笠原		0.552093
                                            柴崎		0.543930
                                            堂上		0.542793
                                            原作		0.537314
                                                GJ		0.529800
                                            主演		0.528583
                                         チーム		0.524175
                                               Ⅰ		0.522051
                                      ロケット		0.521746
                                      シリーズ		0.518500
                                            折口		0.516857
                                         ラジオ		0.514130
                                            小牧		0.513793
                                            革命		0.506734
                             ヘタリアギャグ		0.498351
                                               浩		0.491764
                          ギルティクラウン		0.486276
                                            箱庭		0.484381
                                   デュラララ		0.480245
                                           "『「		0.475227
                                アオハライド		0.475073
                                            映画		0.474580
                                         アニメ		0.472753

簡単にでありますが、こんな感じで遊んでみました。
図書館の使われ方について私は知りたいので、ツイートの抽出をしっかり行う必要があるなと反省しております。