ウェブページの構成単語をword2vecしてkmeansしてみた（APIもあるよ）

## はじめに
先日、[色んなサイトのTF-IDFを調べてみた](http://qiita.com/keigohtr/items/ef5d1268284d0f910130)という投稿をしましたが、今回はサイトの構成単語をWord2VecしてKmeansして、サイトの特徴的な単語が取れないか実験してみました。[Word2Vecは日本語Wikipediaで作りました](http://qiita.com/keigohtr/items/2705bb439d920b7a0a5b)。Word2VecもKmeansもdeeplearning4jを使っています。

## やってみる
せっかくなので、先日と同じ記事を分析してみましょう。

### Qiitaの場合
[いまさら聞けないLinuxとメモリの基礎＆vmstatの詳しい使い方](http://qiita.com/kunihirotanaka/items/70d43d48757aea79de2d)
TFIDFのときと違って、「BO」「BS」「SY」「CS」などLinuxコマンドの出力に出てくる単語が選ばれていますね。今回のアルゴリズムだと意味的に近いものは選ばれないようになっているので、こういうものが選ばれちゃうんでしょうか。

| 単語 | TF-IDF値 |
|:-----------------|:------------------|
| ID | 108.10941554574828 |
| メモリ | 209.22722419151629 |
| BO | 132.13373011147013 |
| BS | 132.13373011147013 |
| HDD | 156.15804467719198 |
| CPU | 132.13373011147013 |
| SY | 108.10941554574828 |
| CS | 108.10941554574828 |
| MB | 168.1702019600529 |
| Linux | 84.08510098002643 |

[Retty流『2200万ユーザを支える機械学習基盤』の作り方](http://qiita.com/taru0216/items/dda1f9f11397f811e98a)
こちらはTFIDFのときと大体似たような感じですね。「Docker」「CROWD」「GPU」「AWS」など、ポイントは抑えている感じです。

| 単語 | TF-IDF値 |
|:-----------------|:------------------|
| Docker | 306.31001071295356 |
| CROWD | 144.14588739433106 |
| virt-manager | 104.55854782093631 |
| DESKTOP | 108.10941554574828 |
| .S | 108.10941554574828 |
| Secret | 144.14588739433106 |
| Qiita | 192.19451652577476 |
| Retty | 684.6929651230727 |
| GPU | 420.42550490013235 |
| AWS | 186.1884378843443 |

[初心者がchainerで線画着色してみた。わりとできた。](http://qiita.com/taizan/items/cf77fd37ec3a0bef5d9d)
TFIDFのときよりは画像処理っぽさが出ていますね。「PX」「着色」「JPEG」「IMAGE」「2D」「線画」がそれです。「PX」はピクセルです。

| 単語 | TF-IDF値 |
|:-----------------|:------------------|
| Qiita | 144.14588739433106 |
| PX | 60.06078641430457 |
| .S | 102.10333690431781 |
| 着色 | 77.32066589339188 |
| JPEG | 96.09725826288735 |
| IMAGE | 102.10333690431781 |
| test | 268.5932355319406 |
| ID | 60.06078641430457 |
| 2D | 306.31001071295356 |
| 線画 | 140.24967520586745 |

### Wikipediaの場合
[ウィキペディア](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2)
TFIDFのときと近いですが、「ジミー・ウェールズ」が含まれているのがいいですね。ウィキペディアの基本要素は含まれています。

| 単語 | TF-IDF値 |
|:-----------------|:------------------|
| 百科事典 | 37.92148047407401 |
| ウィキメディア財団 | 49.42546256406893 |
| ヌーペディア | 62.735128692561766 |
| ジミー・ウェールズ | 41.93165284787603 |
| メーリングリスト | 31.67046239357945 |
| 英語版ウィキペディア | 31.974842712450794 |
| 記事 | 72.39311150747272 |
| Wikipedia | 144.14588739433106 |
| 編集 | 48.25859044190302 |
| 投稿 | 39.9784733507901 |

[東京喰種トーキョーグール](https://ja.wikipedia.org/wiki/%E6%9D%B1%E4%BA%AC%E5%96%B0%E7%A8%AE%E3%83%88%E3%83%BC%E3%82%AD%E3%83%A7%E3%83%BC%E3%82%B0%E3%83%BC%E3%83%AB)
こちらも基本的な特徴は捉えています。TFIDFのときよりは単語のバリエーションが少ない気もしますが、URLタグ付けとして考えたときはこちらのほうが良いですね。

| 単語 | TF-IDF値 |
|:-----------------|:------------------|
| 東京喰種 | 21.91414675516279 |
| OWL | 24.024314565721834 |
| スカル | 24.434044848916372 |
| 隻眼 | 41.69656394780747 |
| 東京喰種トーキョーグール | 214.63517540942794 |
| Loveit! | 36.03647184858275 |
| 東京喰種トーキョーグール√A | 30.030393207152294 |
| 富良 | 23.419296733482696 |
| PSYCHO | 24.024314565721834 |
| TVアニメ | 30.030393207152294 |

## アルゴリズム
細かいアルゴリズムは[こちら](http://blog.apitore.com/2016/12/27/api-url2text-word2vec/)を参照下さい。ざっくり説明すると、まず入力文を[kuromoji-ipadic-Neologd](https://apitore.com/store/apis/details?id=7)で形態素解析し、名詞、動詞、形容詞、未知語のみを代表語の候補とします。いくつかストップ品詞細分類とストップワードを設定しています。[Word2Vec](https://apitore.com/store/apis/details?id=8)でベクトルにしたあと、Kmeansクラスタリングで指定した数のクラスタに分類します。最後に、クラスタの中心ベクトルに最も近い単語を選んで、入力したサイトの特徴語（タグ）として出力します。

## 関連情報
APIを公開しています。無料なので興味があればお試しください。

- 形態素解析（kuromoji-ipadic-Neologd）
 - [API](https://apitore.com/store/apis/details?id=7)
 - [技術解説](http://blog.apitore.com/2016/07/11/kuromoji-ipadic-neologd-webapi/)
- スクレイピング（URL2TEXT）
 - [API](https://apitore.com/store/apis/details?id=13)
 - [技術解説](http://blog.apitore.com/2016/12/15/api-url-to-html/)
- 単文分割
 - [API](https://apitore.com/store/apis/details?id=17)
 - [技術解説](http://blog.apitore.com/2016/12/25/api-sentence-separator/)
- Document Frequency（日本語Wikipedia）
 - [API](https://apitore.com/store/apis/details?id=16)
 - [技術解説](http://blog.apitore.com/2016/12/25/api-document-frequency/)
- TEXT2LABEL（Word2Vec）
 - [API](https://apitore.com/store/apis/details?id=19)
 - [技術解説](http://blog.apitore.com/2016/12/27/api-text2label-word2vec/)
- URL2LABEL（Word2Vec + Kmeans）
 - [API](https://apitore.com/store/apis/details?id=21)
 - [技術解説](http://blog.apitore.com/2016/12/27/api-url2text-word2vec/)

## おわりに
Word2Vecでなんとか文章の自動タグ付けができないか検討し、[失敗もしましたが](http://blog.apitore.com/2016/12/22/word2vec-doc-label-notgood-approach/)まあまあ有用な技術ができました。TFIDFもWord2Vec+Kmeansも、それぞれ特徴があって面白いです。KmeansによるWord Vectorのクラスタリングは、各クラスタが独立になるように計算します。Word Vectorは[単語の持つ概念を表現している](https://twitter.com/daiti_m/status/782130387006791680)ことがわかってきましたし、Kmeansでクラスタリングすることで各クラスタの代表語は意味的に独立関係にあるということです。なかなかおもしろい特徴なので、まだまだ応用がありそうですね。