はじめに
単語埋め込みとは、単語を低次元(と言っても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等の単語ベクトルもほぼ同様の方法で読み込むことができる。
おわりに
本稿では単語埋め込みベクトルの事前学習済みベクトルについていくつか紹介した。
自分で学習しなければならない特別な動機がなければ、これら事前学習済みベクトルを使うことをお勧めする。