昨日はAQUAさんの転職動機とその時の心理状態を振り返るでした。転職よりも先に就職をしなければならない僕ですが、就活する上でも考え方を参考にしていきたいなと思います。今回は、僕が大学でやっている研究について簡単に触れようかと思います。昨日まで論文書いていたので、書くの追い付かなくて遅れてすみません!はじめに僕の所属している研究室では、デジタルサイネージシステムの設置販売を行っています。それ絡み今年色々あってベンチャー企業が一つ設立されたりしました。ちなみに、都内だと銀座の結構立地のいい店に設置してあったりします。このデジタルサイネージなんですが、いくつかある機能の中にtwitterの投稿を掲載するというものがあります。この機能実は掲載するツイートを選ぶのが手動なので、それをうまい具合に自動で処理できるようにしようというのが、僕の研究になります。Distance)を扱ったので、WMDでニュース記事の本文とタイトルの類似度を測ってみようかと思います。Distance)WMDは、2つの文書があったときにその文書間の距離を計算しようと提案された手法です。元の論文がこちらになります。DistancesこのWMDは、Word2Vecで得られる分散表現を利用しているので、まずはWord2Vecについて簡単に触れていきます。Word2VecWord2Vecは、単語をベクトル表現化することで、単語の意味をとらえようとする手法で有名なものです。基本的に同じような意味や使われ方の単語は、同じような文章または文脈に出てくるはずであるという考え方で計算を行っています。その実態は、単層ニューラルネットワークによる学習と次元圧縮になります。単語を演算処理まで行えるように、各要素ごとではなく単語の定義によってベクトル化を行うため、以下のような演算ができるようになります。「王様」-「男」+「女」=「女王」このWord2VecはCBoWモデルとSkip-gramモデルで実装されます。CBoWCBoWモデルでは、文法と意味を学習することは文脈中の単語から対象単語が現れる条件付き確立を最大化するということになります。これは、前後の単語から対象単語を推測するということです。モデルのイメージは次のようになります。Skip-gramSkip-gramモデルはCBoWの逆で、対象の単語からその周辺単語を予測します。意味的な精度ではSkip-gramの方が上になります。Skip-gramにとっての意味・文法の学習は、出力層における周辺単語予測のエラー率の合計を最小化するということになります。モデルのイメージは次のようなものです。細かな理論や数式については、こちらでわかりやすくまとめてくれてあります。Bが存在したとき、A、Bの語同士を対応付けることで、文書Aを文書Bに変換するときの対応付けの変換コストが最も低い場合の、変換コストの和を文書間距離と考えます。Word2Vecの計算によって、次のような意味類似度を捉えた分散表現ベクトルを獲得します。j)$を次のように定義できます。$$この和を求めれば文書間距離が求められますが、このような計算は意味語の数が同じで、各単語の意味的にもほぼ1対1で結び付けられるものに対して行えることです。そこで一般化して次のような最適化問題の式が得られます。$$この式を解くことで文書間距離の計算が可能となります。書いたので、間違っているところがあるかもしれません。技術的な部分に関してはこちらで詳しくまとめられているので、参照ください。実装さっそく実装してみます。本当はtwitterのデータとか用意したかったですが、その時間がなかったので何故か手元にあったYahoo!ニュースの2014年1月の記事を利用していきます。データの用意domestic、economy、enter、life、local、science、sports、worldの分野ごとに分かれているのでとりあえず今回はscienceの記事3006個の記事を使いました。ファイル名がタイトル、中身が記事になっているので、それぞれ一つにまとめていきます。記事のほうはshellでファイルを一つにまとめました。タイトルをファイル名で取ってくると色々いらないものも入っているので、ついでに落とします。titles.append(i)本文のデータも読み込んで整形しておきます。texts.append(i)形態素解析データの用意はできたので、これを学習するように形態素解析して分かち書きにしていきます。今回は名詞だけ扱うことにしました。形態素解析用の関数を作って、タイトルと本文をそれぞれ解析、分かち書きの形に変更していきます。a_texts]これで下のようなタイトルと本文のデータがそれぞれ出来上がりました。対象ちょっと気になった点もありましたが、今回はこれでいきます。モデルの作成Word2Vecで学習させてモデルを作っていきます。Word2Vecで取り込めるように先ほど分かち書きにした本文をファイル出力しておきます。fp.write("\n".join(a_texts))今回はサクッとやっていくので、あまりパラメータについてはだいたいで合わせて学習させます。パラメータの詳細に興味がある方はこちらを参照してみてください。データ量は少ないので、すぐに学習が終わりました。sg=1)model.save("science.model")どんな感じか見るとこんな感じでした。0.7965140342712402)]Snapchatが情報流出やらかしたり、STAP細胞が発表された時期だったりしたようですね。「STAP」と入れると「あります」が返ってくると面白かったかもしれません類似度の値的に微妙な部分もありますが、進めていきます。記号を取り除くのを忘れていたのは完全なミスでした。WMDで文書間距離を測るモデルもできたので、タイトルと本文の文書間距離を測ってみます。与えたデータの1件目の本文とタイトルを入れてみます。a_titles[0])print(distance)3.1279835534715015値が1に近ければ近いほど比較した文書は近いということになります。名詞だけにしたのもあるかもしれませんが、うまくいっているのか自信がなくなってきましたね。文書間距離が近い組み合わせを出そうとすると、2分探索するにしても一度すべての組み合わせの文書間距離を出す必要があるため、計算が終わり次第追記したいと思います。この計算量の多さがWMDの弱点になります。おわりに今回はWMDでYahoo!ニュースの記事とタイトルの文書間距離を測ってみようということでサクッとやってみました。サイネージに実装することも考えて、計算時間なども考慮する必要があるためこの手法はあまりむいていませんでしたが、うまいことできるように色々な手法を試したり、組み合わせたりするようなことを研究しています。Rushはいいぞです。upLoginユーザーは見つかりませんでした。