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

  • 73
    いいね
  • 0
    コメント

はじめに

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

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

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

埋め込みベクトルの情報は以下のリポジトリにまとめているので、こちらもよろしく。
awesome-embedding-models

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

Word2Vec

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

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

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
URL2 Download Word Vectors(NEologd)

※ 日本語のみ

使い方含めて以下に書きました。
fastTextの学習済みモデルを公開しました

最新の成果が適用された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をインストールして以下のコードを書くだけ。

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 をダウンロードしておく必要があることに注意。

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']))

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

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等の単語ベクトルもほぼ同様の方法で読み込むことができる。

おわりに

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