ニューラルネットによる単語のベクトル表現の学習 〜 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
だいたいこんな感じです。
実験プログラム
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は多すぎるとダメです。このあたりを気をつけていただければ大丈夫かな、と。
気になる方は、モデルファイルを突っ込んであるので、試してみてください(ちゃんと評価をやろうと思ってたけど、あ、コーパスの時点でこりゃダメそうだなと思って諦めました)。言語によっても違いますので、このあたり、誰かがちゃんと定量的に見てくださると非常にありがたいです。
あとは、例えば体言を原形にするとか、単語を単語+品詞にするとか、コーパスづくりのところで工夫できるかな、と思います(やってないし多分やらない)
雑感
雑感としては、コーパスについてもっとちゃんと考えるべきだったなと思います。
@niam 一応言っておくと、これ、最初にやり始めた時にそういう違和感を持っていたというだけで、流石に、今も固執するほど頭固くないですよ。というか、コーパスは実験目的に対して設計されるものなので、人ごとの差異の確認が実験目的に入っていないのなら、捨象して何ら問題ないと思います。
— Yo Ehara (@niam) 2014, 3月 8
という意見があったりして(というか私が不勉強でそういう意識を全く持てていなかった)、それを実感した構図です。
で、この場合だとどういうことかというと、「艦これのベクトル表現獲得」だったら「艦これスレコーパス」は妥当だし、「英辞郎データ」を使えば「日英翻訳」ができるだろう、と。じゃあ、「ツイートコーパス」だと何ができるの?という話です。
これに関して、明確な答えは出てないんですが、広く取ってきたツイートというのは「一般人の評判を反映してるかも」とか「新語の意味がわかるかも」とか、そういったあたりの情報が取り出せるかもな、ということです。そうはいっても、「広く浅く」なコーパスでできることってほぼないですね、word2vecの場合*6。
また、コーパスに関してもう一つ感じるのが、ドメインを絞っている方が、より少ないコーパスで動きそうだ、と思います。あんちべさんの艦これのデータは6.5MBくらいしかないのですが、艦娘*7に関する素性はよく獲得できています(逆に一般名詞はひょっとしたら弱い、かも)。
これらを注意点としてまとめるなら、先にどういう情報を知りたいか決めてからコーパスを作ると、もっと有意義になると思います。例えば評判を反映したいなら、トヨタなら「車」「中古」「道路」「タイヤ」をトラックワードにしてコーパスを作れば、そういう評判の素性獲得が、もっと少ないコーパスでできるかもしれません(本当に例えばですけど、商品を「満足度」の素性で比較できるかも、とか)。
(追記) [Mikolov+ 2013]でも指摘されていますが、単語のベクトル表現は自然言語処理のアプリケーション(応用)に非常に役に立つだろう、と言及されています(符号としての単語だったものが、素性の塊として扱えるので、夢広がります)。そういう用途でword2vecはそもそも使えると思いますが、そういう用途だとTwitterコーパスは少し不適切だと思います的エクスキューズを書いておきます。
参考文献
- Statistical Semantic入門 ~分布仮説からword2vecまで~
- 自然言語処理の最新手法"word2vec"で艦これ加賀さんから乳を引いてみる - あんちべ!
- word2vecに英辞郎データを放り込んでみた - naoya_t@hatenablog
追記
データ量を182万ツイートまで増やして、ちょっと遊んでみました。
腐女子-女+男:プルート ホモ 貧乳 ヲタク 語感 腐男子 ブス 巨乳 根暗 清楚
北海道-雪+海:福岡 長野 沖縄 住ん 東京 札幌 名古屋 宮城 青森 仙台
リア充:サイテー 爆発 腐女子 ブサメン テメー 三角関係 ブス 君達 ぱみ 四散
カップル:続く 別れる 女 コーギー ♡」 長く line 男 ~♡」 未読
おっぱい:お尻 乳首 マイスター アナル 乳 揉む 揉み 貧乳 胸 巨乳
宇宙:異世界 異次元 未来 能楽 呪術 情報化 ロボット 形而下 機械 陽電子
イケメン:男前 美人 ブス 惚れる 色白 イケボ 変態 病弱 ブサメン ナルシスト
g-a+貧乳:巨乳 触手 非力 古参 低身長 もてる ?????! 上と下 三角形 獣
魚-海+空:卵 出汁 用水路 粥 味噌汁 肉 しるし 箸 皮 カッチカチ
ボカロ:アーティスト アニソン 洋楽 邦楽 レゲエ バンド カップリング 特撮 イラストレーター
おっぱい-女+男:お尻 乳首 アナル マイスター 貧乳 乳 揉む 巨乳 胸 揉み
妊娠-女+男:フリーズ 気絶 ズキズキ 解散 入院 幻滅 発症 悪化 接近 発狂
寒い-北海道+沖縄:暑い さむい 暖かい 眠たい 積もる はやい あったかい 寒かっ ねむい 忙しい
リア充はサイテーです。各位参考にしてください。
*1:補足:「手法だ」という風に書いてしまっていたのですが、論文では手法名として明記されておりません。また、オリジナル実装とgensimの実装がありますので、単一のツールを指す名詞として表現するのも、少し違和感があります
*2:これ、LSAでもできるみたいですね
*3:「は文分割に影響があったため外していました。しかし現在は、文を分割していないので、使用するべきでした
*4:ツイート文中には、「日本が金メダル」「イギリスが金メダル」「東京に遊びに来た」はあっても「イギリスのロンドン」とかそういう表現がないから、とか、そんな感じの予想です
*5:この原因、最初はコーパスのロードの仕方が間違ってたのかと思いましたが、おそらくコーパスの量の問題でした
*6:逆に、Wikipediaをコーパスとした時に取れない情報があるはずなんです。その差分が、Twitterコーパスの強みかなと思います。アイディアを募集しています。
*7:かんむすめって読むんですかこれ?