病みつきエンジニアブログ

機械学習、Python、Scala、JavaScript、などなど

ニューラルネットによる単語のベクトル表現の学習 〜 Twitterのデータでword2vecしてみた

最近にわかにword2vecが流行っています。ので、乗っかってみました的記事です。

理論に関してはあまり詳しくしらないので、印象だけで語っているかもしれません。何かありましたらTwitterかコメント等でご指摘いただけますと幸いです。

ちなみに、失敗した話が多いです

word2vecと単語のベクトル表現

word2vecは、機械学習の分野で使われる、ニューラルネットというモデルを使ったツール/ライブラリです*1。名前の通り、wordをvectorにします。vectorにする、というのは、ベクトル表現を獲得するということで、意味(みたいなもの)の獲得というか、素性の獲得というか。

単語のベクトル表現の獲得自体は、別にword2vecにしかないわけではありません。言い換えると、昔からあります。LDAを使って単語のトピック分布のようなものを学習したり(vingowでやりました)。余談ですが、この方法で、スパム単語の獲得を今度やろうと考えています。

しかしword2vecで面白いのが、単語の演算が(精度高く)できることです。例えば「king-man+woman」をベクトル演算してみると、「女性でいうところのking」つまり「queen」が出てきますよ、と*2

単語のベクトル表現を1段落で大雑把に正当化すると、「ある単語は、ある文脈で出やすいはずだ、共起してるはずだ」ということだと理解しています。例えば「初音ミク最高!!!」「ミクはニコ動でブレイク」といった文章から、ミクは「最高」で「ニコ動」という素性が推測できたり、「ミクはボカロ」「KAITOはボカロ」といった文章から、ミクもKAITOも「ボカロ」という素性が大きい、と推測できたり(結局は、どう共起するか、ということ)。

このあたりのお話は、海野さんによるこちらのslideshareが詳しいです。

Statistical Semantic入門 ~分布仮説からword2vecまで~

ということで、実験に移ります。

コーパス

コーパスは、表題の通り、Twitterのツイートです。ただし、

  • 形態素解析の辞書は、vingowのタグも含む(つまり"初音ミク"のような新語がコーパスにあったりします)
  • 検索ワードは "。,!,?+-\n+-笑+-「+-」+-w+-w+-(+-(+-http+-https+exclude:retweets"
  • URL投稿やリツイートを含まない
  • 「(」「「」「w」「#」あたりを含むと形態素解析失敗しそうなので、含まない*3
  • 10単語以下のツイートも文章として崩壊してそうなので、含まない
  • 半角・全角は正規化(ア1→ア1)
  • 132万1252ツイート、174MB

だいたいこんな感じです。

f:id:yamitzky:20140311222046p:plain

実験プログラム

yamitzky/word2vec-japanese-twitter · GitHub

プログラムは、github上にアップロードしてあります(ツイートのデータはDBからダンプしているので、取得プログラムはありません)。

また、実験結果のモデルファイルも置いてあります。余談ですが、モデルデータであれば著作権法上も大丈夫であると考えています(参考)。

また、あんちべさんによる自然言語処理の最新手法"word2vec"で艦これ加賀さんから乳を引いてみる - あんちべ!の記事を参考にしています。ありがとうございます。

実験1:とりあえず実験

例えば、各単語に似ている単語を出してみます。左から順に近いですが、

akb:nmb ske hkt 48 乃木坂 exile 東海 hy 集い 背番号
ミク:ザク 初音 誕生 レミオロメン 米津 杏子 sug happybirthday lat グフ
北海道:名古屋 京都 新潟 仙台 長野 大阪 札幌 長崎 東京 神戸
スルー:無視 補導 放置 拒否 敬遠 削除 退会 ブロック 解除 解放

など、なんか良さそうです。しかし、全然ダメなのもあって、

スク水:似非 赤ずきん 純潔 トランクス 革靴 紺 壷 剣士 カーディガン 赤毛
しょこたん:兼ね合い ひれ伏す デール 木製 atsushi 松たか子 gu ストライプ 島田 念願

あと、リア充に関しては「ハゲ」が一番近いという結果が出たのですが、定性的な解釈をお待ちしております

リア充:ハゲ ナルシスト 腐女子 ババア ニート イケメン キモオタ 帝京 リスニング 反則

「近い単語」をどう解釈できるかで言うと、「それを素性ベクトルで表現した時、距離が近そうか」ということだと思います。つまり、似た要素を持っているか。必ずしも、直感的な「意味」を表すかはわからない、と思います。

また、ここらへんのダメな理由は、だいたい出現頻度の少なさ(コーパス性質)で理由付けできる気はします。逆に、出現が多い単語(≒ツイッターでよくつぶやかれる単語)ほど、精度が高くなりそうです。

次に単語の演算をしてみます。A-B+Cは、単語のアナロジー「BにおけるAは、Cにおける何か」を表します。

良かったものとしては、

akb-東京+大阪:nmb hkt ske 乃木坂 jump spyair しょこたん 48 立見 exile
彼氏-男+女:彼女 友達 弟 恋人 知り合い お父さん お母さん リア充 旦那 誰々

こちらもひどいものはひどくて(というか、酷いのがほとんど)、

日本-東京+ロンドン:戦車 自国 国々 国外 世論 在り方 有数 ウイグル 最高峰 従来

Twitterでよくつぶやかれそうな場所に関するものでも、このように失敗するのはちょっと残念でしたが、そういう共起の仕方をしないのかもしれません*4

実験2:コーパスの量の変更

コーパス量が減ると、どう失敗していくか、というのを確認したかったです。ツイート数を、10万ツイートに絞ります。ファイルサイズはだいたい12MBです。

すると、

akb:ワンピース 司令 唯一 ed 雄 王様 パーカー 沢 ガ ガラス
ミク:たった 前半 丸 ラブライブ 級 プレミアム 講座 23 発売 誕生
北海道:長野 rad ギリ みなさん 後藤 夕食 ジル ゲリラ 大阪 セガ

など、結構ダメですね!

僕の最初の状態とかまさにこれで、コーパスの量が少ないと、まともに動きません*5。特に、これはコーパス性質によっても変わると思います(後述)。もう少し厳密に言うと、ほしい情報についてのコーパスの量が少ないと、まともに動かないのではないかと予想しています(後述)。

逆に、もっとデータ量が増えたら、もっと有意義かもしれません。今後に期待!

その他の実験:

window、sizeなどを変えてみたのですが、それほど大きな変更ないように感じました。ただし、sizeは少なすぎるとダメです。windowは多すぎるとダメです。このあたりを気をつけていただければ大丈夫かな、と。

気になる方は、モデルファイルを突っ込んであるので、試してみてください(ちゃんと評価をやろうと思ってたけど、あ、コーパスの時点でこりゃダメそうだなと思って諦めました)。言語によっても違いますので、このあたり、誰かがちゃんと定量的に見てくださると非常にありがたいです。

あとは、例えば体言を原形にするとか、単語を単語+品詞にするとか、コーパスづくりのところで工夫できるかな、と思います(やってないし多分やらない)

雑感

雑感としては、コーパスについてもっとちゃんと考えるべきだったなと思います。

という意見があったりして(というか私が不勉強でそういう意識を全く持てていなかった)、それを実感した構図です。

で、この場合だとどういうことかというと、「艦これのベクトル表現獲得」だったら「艦これスレコーパス」は妥当だし、「英辞郎データ」を使えば「日英翻訳」ができるだろう、と。じゃあ、「ツイートコーパス」だと何ができるの?という話です。

これに関して、明確な答えは出てないんですが、広く取ってきたツイートというのは「一般人の評判を反映してるかも」とか「新語の意味がわかるかも」とか、そういったあたりの情報が取り出せるかもな、ということです。そうはいっても、「広く浅く」なコーパスでできることってほぼないですね、word2vecの場合*6

また、コーパスに関してもう一つ感じるのが、ドメインを絞っている方が、より少ないコーパスで動きそうだ、と思います。あんちべさんの艦これのデータは6.5MBくらいしかないのですが、艦娘*7に関する素性はよく獲得できています(逆に一般名詞はひょっとしたら弱い、かも)。

これらを注意点としてまとめるなら、先にどういう情報を知りたいか決めてからコーパスを作ると、もっと有意になると思います。例えば評判を反映したいなら、トヨタなら「車」「中古」「道路」「タイヤ」をトラックワードにしてコーパスを作れば、そういう評判の素性獲得が、もっと少ないコーパスでできるかもしれません(本当に例えばですけど、商品を「満足度」の素性で比較できるかも、とか)。

(追記) [Mikolov+ 2013]でも指摘されていますが、単語のベクトル表現は自然言語処理のアプリケーション(応用)に非常に役に立つだろう、と言及されています(符号としての単語だったものが、素性の塊として扱えるので、夢広がります)。そういう用途でword2vecはそもそも使えると思いますが、そういう用途だとTwitterコーパスは少し不適切だと思います的エクスキューズを書いておきます。

参考文献

追記

データ量を182万ツイートまで増やして、ちょっと遊んでみました。

腐女子-女+男:プルート ホモ 貧乳 ヲタク 語感 腐男子 ブス 巨乳 根暗 清楚
北海道-雪+海:福岡 長野 沖縄 住ん 東京 札幌 名古屋 宮城 青森 仙台
リア充:サイテー 爆発 腐女子 ブサメン テメー 三角関係 ブス 君達 ぱみ 四散
カップル:続く 別れる 女 コーギー ♡」 長く line 男 ~♡」 未読
おっぱい:お尻 乳首 マイスター アナル 乳 揉む 揉み 貧乳 胸 巨乳
宇宙:異世界 異次元 未来 能楽 呪術 情報化 ロボット 形而下 機械 陽電子
イケメン:男前 美人 ブス 惚れる 色白 イケボ 変態 病弱 ブサメン ナルシスト
g-a+貧乳:巨乳 触手 非力 古参 低身長 もてる ?????! 上と下 三角形 獣
魚-海+空:卵 出汁 用水路 粥 味噌汁 肉 しるし 箸 皮 カッチカチ
ボカロ:アーティスト アニソン 洋楽 邦楽 レゲエ バンド カップリング 特撮 イラストレーター
おっぱい-女+男:お尻 乳首 アナル マイスター 貧乳 乳 揉む 巨乳 胸 揉み
妊娠-女+男:フリーズ 気絶 ズキズキ 解散 入院 幻滅 発症 悪化 接近 発狂
寒い-北海道+沖縄:暑い さむい 暖かい 眠たい 積もる はやい あったかい 寒かっ ねむい 忙しい

リア充はサイテーです。各位参考にしてください。

*1:補足:「手法だ」という風に書いてしまっていたのですが、論文では手法名として明記されておりません。また、オリジナル実装とgensimの実装がありますので、単一のツールを指す名詞として表現するのも、少し違和感があります

*2:これ、LSAでもできるみたいですね

*3:「は文分割に影響があったため外していました。しかし現在は、文を分割していないので、使用するべきでした

*4:ツイート文中には、「日本が金メダル」「イギリスが金メダル」「東京に遊びに来た」はあっても「イギリスのロンドン」とかそういう表現がないから、とか、そんな感じの予想です

*5:この原因、最初はコーパスのロードの仕方が間違ってたのかと思いましたが、おそらくコーパスの量の問題でした

*6:逆に、Wikipediaコーパスとした時に取れない情報があるはずなんです。その差分が、Twitterコーパスの強みかなと思います。アイディアを募集しています。

*7:かんむすめって読むんですかこれ?