言語処理100本ノック 2020 (Rev2)の「第7章: 単語ベクトル」の60本目「単語ベクトルの読み込みと表示」記録です。
多分「第7章: 単語ベクトル」は61以降をやりませんが、「第8章: ニューラルネット」をやりたかったため、前提となるこのノックに取り組みました。
7章の準備運動的内容ですし、Rev2015と異なりGensim
使っているだけなので、コードも短く非常に簡単です。
記事「まとめ: 言語処理100本ノックで学べることと成果」に言語処理100本ノック 2015についてはまとめていますが、追加で差分の言語処理100本ノック 2020 (Rev2)についても更新します。
参考リンク
リンク | 備考 |
---|---|
060.単語ベクトルの読み込みと表示.ipynb | 回答プログラムのGitHubリンク |
Qiita記事 | 多くのソース部分のコピペ元 |
まとめ: 言語処理100本ノックで学べることと成果 | 言語処理100本ノックまとめ記事 |
環境
後々GPUを使わないと厳しいので、Goolge Colaboratory使いました。Pythonやそのパッケージでより新しいバージョンありますが、新機能使っていないので、プリインストールされているものをそのまま使っています。
種類 | バージョン | 内容 |
---|---|---|
Python | 3.7.11 | Google ColaboratoryのPythonバージョン(2021年8月時点) |
2.0.3 | Google Colaboratoryで提供されていたPythonパッケージ(2021年8月時点) | |
gensim | 3.6.0 | Google Colaboratoryで提供されていたPythonパッケージ(2021年8月時点) |
第7章: 単語ベクトル
学習内容
単語の類似度計算や単語アナロジーなどを通して,単語ベクトルの取り扱いを修得します.さらに,クラスタリングやベクトルの可視化を体験します.
ノック内容
単語の意味を実ベクトルで表現する単語ベクトル(単語埋め込み)に関して,以下の処理を行うプログラムを作成せよ.
60. 単語ベクトルの読み込みと表示
Google Newsデータセット(約1,000億単語)での学習済み単語ベクトル(300万単語・フレーズ,300次元)をダウンロードし,”United States”の単語ベクトルを表示せよ.ただし,”United States”は内部的には”United_States”と表現されていることに注意せよ.
回答
回答結果
Voctor見ても人間に理解できませんが、結果です(1行目に300次元であることを確認もしています)。
Tuple Length: 300
-5.59082031e-02 -5.00488281e-02 -3.73535156e-02 1.25976562e-01
5.61523438e-02 1.51367188e-01 4.29687500e-02 -2.08007812e-01
-4.78515625e-02 2.78320312e-02 1.81640625e-01 2.20703125e-01
--後略--
回答プログラム 060.単語ベクトルの読み込みと表示.ipynb
GitHubには確認用コードも含めていますが、ここには必要なものだけ載せています。
from google.colab import drive
from gensim.models import KeyedVectors
drive.mount('/content/drive')
model = KeyedVectors.load_word2vec_format('/content/drive/MyDrive/ColabNotebooks/ML/NLP100_2020/07.WordVector/input/GoogleNews-vectors-negative300.bin.gz', binary=True)
print('Tuple Length: ' + str(len(model['United_States'])))
print(model['United_States'])
回答解説
Word2Vecファイル読込
今回、鍵となるのはこのWord2Vecファイル読込だけです。models.keyedvectors
のload_word2vec_format
関数を使います。
KeyVectorsフォーマットは公式Document「Why use KeyedVectors instead of a full model?」に書いてあるとおり、小さいモデルとして保存可能(代わりに再訓練ができないなどあり)。単なるTuple型です。
100本ノックRev2015の「言語処理100本ノック-92(Gensim使用):アナロジーデータへの適用」で使っていたWord2Vec.load
関数と異なります。
ファイルサイズが圧縮されていて1.5GBなので読込処理に2分超かかりました。
model = KeyedVectors.load_word2vec_format('/content/drive/MyDrive/ColabNotebooks/ML/NLP100_2020/07.WordVector/input/GoogleNews-vectors-negative300.bin.gz', binary=True)