いますぐ使える単語埋め込みベクトルのリスト

# はじめに
単語埋め込みとは、単語を低次元(と言っても200次元程度はある)の実数ベクトルで表現する技術のことです。近い意味の単語を近いベクトルに対応させることができるとともに、ベクトルの足し引きで意味のある結果(例えば king - man + women = queen)が得られるのが特徴です。

単語埋め込みベクトルは品詞タグ付け、情報検索、質問応答などの様々な自然言語処理アプリケーションに使われる重要な技術です。とはいえ、**実際に用意するのはなかなか骨の折れる作業**です。大規模なデータをダウンロードし、前処理をかけ、長い時間をかけて学習させ、結果を見てパラメータチューニングを行う・・・。

そのため、**単に使いたいだけなら学習済みのベクトルを使うのが楽**です。というわけで、そんな単語埋め込みベクトルの中から今すぐ使えるものをピックアップしてみました。

埋め込みベクトルの情報は以下のリポジトリにまとめているので、こちらもよろしく。
[awesome-embedding-models](https://github.com/Hironsan/awesome-embedding-models)

<!--
https://github.com/ai-ku/wvec
https://www.quora.com/Where-can-I-find-some-pre-trained-word-vectors-for-natural-language-processing-understanding
http://dsnotes.com/articles/glove-enwiki
-->

# まずは定番な3つ: Word2Vec, GloVe, fastText

## Word2Vec
| 一言コメント  | 言わずと知れたWord2Vecの事前学習済みベクトル。何を使えばいいのかわからないならこれを使っておけば間違いはない。  |
|---|---|
| 発表年数  | 2013年  |
| URL  | https://code.google.com/archive/p/word2vec/  |

日本語を含めた多言語の学習済みベクトルは以下のリンク先からから入手することができる:

* https://github.com/Kyubyong/wordvectors


## GloVe
| 一言コメント  | Stanfordが誇るGloVe。Word2Vecより良い性能だと謳っている。グローバルな行列分解のモデルとlocal context windowのモデルを組み合わせてよい単語ベクトルを学習した。  |
|---|---|
| 発表年数  | 2014年  |
| URL  | http://nlp.stanford.edu/projects/glove/  |


## fastText
| 一言コメント  | Word2Vecを作った天才Mikolovが作ったfastText。とにかく学習が早い。形態素を考慮するために各単語を文字ngramで表現し、それらのベクトル表現を学習している。  |
|---|---|
| 発表年数  | 2016年  |
| URL1  | [Download Word Vectors](https://drive.google.com/open?id=0ByFQ96A4DgSPNFdleG1GaHcxQzA) |
| URL2  | [Download Word Vectors(NEologd)](https://drive.google.com/open?id=0ByFQ96A4DgSPUm9wVWRLdm5qbmc) |

※ 日本語のみ

使い方含めて以下に書きました。
[fastTextの学習済みモデルを公開しました](http://qiita.com/Hironsan/items/513b9f93752ecee9e670)


# 最新の成果が適用された3つの事前学習ベクトル
## Dependency-Based Word Embeddings
| 一言コメント  | Levyらによる単語埋め込みベクトル。依存関係を用いて学習させたことで、syntacticなタスクに強くなった。syntacticなタスクに使いたい場合はこれがいいかも。 |
|---|---|
| 発表年数  | 2014年  |
| URL  | https://levyomer.wordpress.com/2014/04/25/dependency-based-word-embeddings/  |


## Meta-Embeddings
| 一言コメント  | ACL2016で発表されたMeta-Embeddings。異なる性質を持つ単語埋め込みベクトルの集合を組み合わせて、より良いベクトル(meta embedding)を得ることに成功した。ベクトル集合を組み合わせることでボキャブラリのカバレッジをあげられることがメリット。 |
|---|---|
| 発表年数  | 2016年  |
| URL  | http://cistern.cis.lmu.de/meta-emb/  |


## LexVec
| 一言コメント  | こちらもACL2016で発表されたLexVec。単語類似度タスクではいくつかの評価セットにおいてWord2Vecを上回る結果を残している。 |
|---|---|
| 発表年数  | 2016年  |
| URL  | https://github.com/alexandres/lexvec  |





# おまけ:ダウンロードしたベクトルの使い方
よく使われるであろうWord2Vecの事前学習済みベクトルの読み込み方を書いておく。

読み込み方は超簡単。gensimをインストールして以下のコードを書くだけ。

```py3
import gensim

# Load Google's pre-trained Word2Vec model.
model = gensim.models.KeyedVectors.load_word2vec_format('./GoogleNews-vectors-negative300.bin', binary=True)
```

評価を行うには以下のコードを書けばよろしい。実行する前に評価データである [questions-words.txt](http://download.tensorflow.org/data/questions-words.txt) をダウンロードしておく必要があることに注意。

```py3
import logging
import pprint

# for logging                                                                                                                                                                                                                                                                      
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
# Load evaluation dataset of analogy task                                                                                                                                                                                                                                          
model.accuracy('questions-words.txt')
# execute analogy task like king - man + woman = queen                                                                                                                                                                                                                             
pprint.pprint(model.most_similar(positive=['woman', 'king'], negative=['man']))
```

書いたコードを実行すると、以下のような評価結果が出力される。

```shell-session
2017-01-20 09:29:11,767 : INFO : loading projection weights from ./GoogleNews-vectors-negative300.bin
2017-01-20 09:30:10,891 : INFO : loaded (3000000, 300) matrix from ./GoogleNews-vectors-negative300.bin
2017-01-20 09:30:10,994 : INFO : precomputing L2-norms of word weight vectors
2017-01-20 09:30:42,097 : INFO : capital-common-countries: 83.6% (423/506)
2017-01-20 09:30:49,899 : INFO : capital-world: 82.7% (1144/1383)
2017-01-20 09:30:50,795 : INFO : currency: 39.8% (51/128)
2017-01-20 09:31:03,579 : INFO : city-in-state: 74.6% (1739/2330)
2017-01-20 09:31:05,574 : INFO : family: 90.1% (308/342)
2017-01-20 09:31:09,928 : INFO : gram1-adjective-to-adverb: 32.3% (262/812)
2017-01-20 09:31:12,052 : INFO : gram2-opposite: 50.5% (192/380)
2017-01-20 09:31:19,719 : INFO : gram3-comparative: 91.9% (1224/1332)
2017-01-20 09:31:23,574 : INFO : gram4-superlative: 88.0% (618/702)
2017-01-20 09:31:28,210 : INFO : gram5-present-participle: 79.8% (694/870)
2017-01-20 09:31:35,082 : INFO : gram6-nationality-adjective: 97.1% (1193/1229)
2017-01-20 09:31:43,390 : INFO : gram7-past-tense: 66.5% (986/1482)
2017-01-20 09:31:49,136 : INFO : gram8-plural: 85.6% (849/992)
2017-01-20 09:31:53,394 : INFO : gram9-plural-verbs: 68.9% (484/702)
2017-01-20 09:31:53,396 : INFO : total: 77.1% (10167/13190)
[('queen', 0.7118192315101624),
 ('monarch', 0.6189674139022827),
 ('princess', 0.5902431011199951),
 ('crown_prince', 0.5499460697174072),
 ('prince', 0.5377321839332581),
 ('kings', 0.5236844420433044),
 ('Queen_Consort', 0.5235946178436279),
 ('queens', 0.5181134343147278),
 ('sultan', 0.5098593235015869),
 ('monarchy', 0.5087412595748901)]
```
この結果を見ることで、トータルのaccuracyで **77.1%** という結果になっていることがわかる。

ちなみにGloVe等の単語ベクトルもほぼ同様の方法で読み込むことができる。

# おわりに
本稿では単語埋め込みベクトルの事前学習済みベクトルについていくつか紹介した。
自分で学習しなければならない特別な動機がなければ、これら事前学習済みベクトルを使うことをお勧めする。