にほんごのれんしゅう

日本語として伝えるための訓練を兼ねたテクログ

■ 機械学習で絵文字の意味を知る

機械学習で絵文字の意味を知る

絵文字は近年になってiPhone, Androidに搭載されてSMSやTwitterなどで積極的にソーシャルメディアに現れるようになった文字です。
文字自体の成立が比較的新しいということもあり、広辞苑などに詳しい意味が定義されているわけでないです。そのため、脳機能がある程度成熟してしまった青年から壮年の人間にとって新規の言語体系を学ぶのにも等しいコストが発生しているものと思われます。辞書もない今、絵文字の正確な用法と意味を学ぼうとすると、若い世代と積極的にコミュニケーションを取らねばならず、若い世代との認知がズレているために、コミュニケーションそのものが成立しなく、結果として若い世代が発明・進化させた単語を正確な意味で知ることはできないのです。
このブログでは、新たな言葉の意味をWord2Vecなどの周辺分脈を解析して、その意味するところを把握するというアプローチを撮りたいと思っています。
f:id:catindog:20160907114425p:plain
[1] PFI, Slideshare
Word2Vecから周辺に同じような文脈で用いられる単語を表示することで、意味を類推することを可能とさせます。

■ 😇 💗 🙏 😂 🎉 💕 💢 ✋ 😘 ✨😊 <- 意味がよくわからない

 Twitterの開発者サービスに登録するとstreaming apiというもの経由で全ツイートの1%を無料でサンプリングできます!ふとっぱら、ツイッター社♡[4]
 Twitterとか若い子もやっていると仮定して、Twitterに絵文字が使われるとその周辺の文脈を学習して、類似の分布をもつ日本語で置き換えることで、若くない世代にも理解しやすくしましょうというアプローチです。
 💗とかは”愛してます”ぐらいの感情表現であると理解できるのですが、😇ってなんですかね。。。天使?
 わからないので、Streaming APIをぶんぶん回して、たくさんサンプリングしました。
 はい、近しい単語トップ10ドーン☆

文字, 関連度
😌   0.830253481865
😢   0.813541054726
🤗   0.793880105019
🙏   0.774758398533
💞   0.774288773537
💭   0.77075445652
🙌   0.767523646355
🙈   0.75866407156
💦   0.758447051048

 ファッ!?😇の意味を知りたいのに、同じ絵文字が近いとか出てくるのか。。。これは、想像以上にジェネレーションギャップありますわ。奴ら絵文字で会話しとる。
 トップ100まで拡張して、日本語がでるまでひたすら頑張る。

文字, 関連度
こんにちは   0.666822075844
タメ   0.662293732166
頑張る   0.659095883369
ありがと   0.658896565437
元気   0.63748061657

 旧おっさん日本語に限定すると、”こんにちは”とか”頑張る”とか”ありがと”とかポジティブな文脈で使われることが多いようです。なにかポジティブで前向きな感情としておじさん理解しました。
 次、🙏<-これです

タメ   0.707892537117
タグ   0.693758368492
インスタ   0.65028488636
呼びタメ   0.62894743681
仲良く   0.625664234161
…省略…
(・ω・)ノ   0.57857966423
嬉しい   0.571420192719
よろしくお願いします   0.569167256355
お誕生日おめでとう   0.567905783653
ぜひ   0.566062629223
すいません   0.565639853477
おねがい   0.560641229153

 タメの意味すら怪しかったのですが、どうやらタメ口で話すほど、仲良くしましょうって意味らしいです。ということは、このアイコンはハイタッチなのかな? ずっと、ごめんなさいっていう手を合わせて誤っている用法しか知らなかったのですが、ランク的にはずっと低いです。おぢさん、学びました。
 ちなみに主成分分析PCAをかけるとこんなグラフが得られます。
f:id:catindog:20160907114558p:plain
 パソコンのディスプレイは二次元なので、二次元に情報が圧縮されてしまっていますが、用法の分布的にはこんな感じだそうで、日本語だけ追っていくと、”よろしく”とか”仲良くしましょう”っていうポジティブ表現が一番近いのでは無いでしょうか。

■ おっさん vs JK

 あまりにもおっさんとJKでやばい違いが出たので、これは載せざるを得ないと判断しました。
 おっさんの周りを主成分分析します。
f:id:catindog:20160907114718p:plain
 なにこれひどい。文字ばっかりでネガティブなのも多い。

対して、JKを主成分分析します。
f:id:catindog:20160907114742p:plain

 💗💓なんて可愛いんでしょう。絵文字が散らばって華やかです!かわいい。JKになりたい。

■ Word2Vecは別の言語でも同じような分布を取ることがある

 今回のアプローチでは手が回らなかったのですが、未知の言語でも同じような単語の分布を取ることがあるようです。以下の図では、数字とか家とか牛とか豚とか、人間であれば同じような地球上どこでも持ちうる社会的背景を利用して、同じような文脈を取りうるからか、同じような単語の分布になるようです。
f:id:catindog:20160907114822p:plain

 未知の言語体系を持つ宇宙人とかと会話するときなど、必要なんじゃないでしょうか。少なくともSeq2Seqでは教師あり学習で、誰かが未知の言語を習得している必要がありますし、最初のアプローチは統計的?機械学習的アプローチになりそうです。
 絵文字でこれを表現するのは、できなくもないような。JKと話すのは宇宙人と話すようなものだしね。理解する方法としては、あながち間違っていない。

■ 直感的理解

 画像のCNNやRNNに比べて視覚表現で表せられないぶん、よくわからないという声をよく聞きまが、 Qiitaの図がよくわかりやったです。
f:id:catindog:20160907114857p:plain

[3]

■ 数学的理解

 Word2Vecを知って一ヶ月ほど詳しい内部の仕組みを知らずに、概要だけで動かしていたのですが、詳しく理解しないといい加減ダメだろうとarXivを読もうと思い腰を上げたのです。arXivを読む前に、ブログを漁っていたら、すごく詳しいブログを見つけました。
ニューラルネットワークで、別に深い学習というわけではないのです。
詳しい日本語を使った解説は[2]のリンク元が引用元になりますので、chainerやTensorFlowで実装するにはここを見ていただけるといいかと思います。
入力層にOne-hot vectorで単語の列を入力します
中間層がOne-hot vectorと中間層のノードの数を掛けあわせた、テンソルになっています。
f:id:catindog:20160907115034p:plain
f:id:catindog:20160907115049p:plain
f:id:catindog:20160907115110p:plain
出力層がソフトマックス関数で最初にSkip-gram関数でモデル化したものを予想したものです。
f:id:catindog:20160907115138p:plain
f:id:catindog:20160907115151p:plain

■ おまけ 社畜

 おっさんも社畜もno future。JKになりたい
f:id:catindog:20160907115227p:plain