言語処理100本ノック(2020)-60: 単語ベクトルの読み込みと表示

[言語処理100本ノック 2020 (Rev2)](https://nlp100.github.io/ja/)の[「第7章: 単語ベクトル」](https://nlp100.github.io/ja/ch07.html)の[60本目「単語ベクトルの読み込みと表示」](https://nlp100.github.io/ja/ch07.html#60-%E5%8D%98%E8%AA%9E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%A8%E8%A1%A8%E7%A4%BA)記録です。
多分[「第7章: 単語ベクトル」](https://nlp100.github.io/ja/ch07.html)は61以降をやりませんが、[「第8章: ニューラルネット」](https://nlp100.github.io/ja/ch08.html)をやりたかったため、前提となるこのノックに取り組みました。
7章の準備運動的内容ですし、Rev2015と異なり`Gensim`使っているだけなので、コードも短く非常に簡単です。
[記事「まとめ: 言語処理100本ノックで学べることと成果」](https://qiita.com/FukuharaYohei/items/6f0af3c4e270d8af2d99)に[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)についてはまとめていますが、追加で差分の[言語処理100本ノック 2020 (Rev2)](https://nlp100.github.io/ja/)についても更新します。

# 参考リンク

|リンク|備考|
|:--|:--|
|[060.単語ベクトルの読み込みと表示.ipynb](https://github.com/YoheiFukuhara/nlp100-2020/blob/main/07.%E5%8D%98%E8%AA%9E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB/60_%E5%8D%98%E8%AA%9E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%A8%E8%A1%A8%E7%A4%BA.ipynb)|回答プログラムのGitHubリンク|
|[Qiita記事](https://qiita.com/yamaru/items/822af1f7f77666381e20#60-%E5%8D%98%E8%AA%9E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%A8%E8%A1%A8%E7%A4%BA)|多くのソース部分のコピペ元|
|[まとめ: 言語処理100本ノックで学べることと成果](https://qiita.com/FukuharaYohei/items/6f0af3c4e270d8af2d99)|言語処理100本ノックまとめ記事|

# 環境
後々GPUを使わないと厳しいので、Goolge Colaboratory使いました。Pythonやそのパッケージでより新しいバージョンありますが、新機能使っていないので、プリインストールされているものをそのまま使っています。

|種類|バージョン|内容|
|:--|:--|:--|
|Python|3.7.11|Google ColaboratoryのPythonバージョン(2021年8月時点)|
|google|2.0.3|Google Colaboratoryで提供されていたPythonパッケージ(2021年8月時点)|
|gensim|3.6.0|Google Colaboratoryで提供されていたPythonパッケージ(2021年8月時点)|

# [第7章: 単語ベクトル](https://nlp100.github.io/ja/ch07.html)
## 学習内容
> 単語の類似度計算や単語アナロジーなどを通して，単語ベクトルの取り扱いを修得します．さらに，クラスタリングやベクトルの可視化を体験します．

## ノック内容
> 単語の意味を実ベクトルで表現する単語ベクトル（単語埋め込み）に関して，以下の処理を行うプログラムを作成せよ．

### [60. 単語ベクトルの読み込みと表示](https://nlp100.github.io/ja/ch07.html#60-%E5%8D%98%E8%AA%9E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%A8%E8%A1%A8%E7%A4%BA)
> Google Newsデータセット（約1,000億単語）での[学習済み単語ベクトル](https://drive.google.com/file/d/0B7XkCwpI5KDYNlNUTTlSS21pQmM/edit?usp=sharing)（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](https://github.com/YoheiFukuhara/nlp100-2020/blob/main/07.%E5%8D%98%E8%AA%9E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB/60_%E5%8D%98%E8%AA%9E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%A8%E8%A1%A8%E7%A4%BA.ipynb)
GitHubには確認用コードも含めていますが、ここには必要なものだけ載せています。

```python
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`関数](https://radimrehurek.com/gensim/models/keyedvectors.html)を使います。
KeyVectorsフォーマットは[公式Document「Why use KeyedVectors instead of a full model?」](https://radimrehurek.com/gensim/models/keyedvectors.html#why-use-keyedvectors-instead-of-a-full-model)に書いてあるとおり、小さいモデルとして保存可能(代わりに再訓練ができないなどあり)。単なるTuple型です。
100本ノックRev2015の[「言語処理100本ノック-92(Gensim使用):アナロジーデータへの適用」](https://qiita.com/FukuharaYohei/items/13310de94cdfcdf168cd)で使っていた`Word2Vec.load`関数と異なります。
ファイルサイズが圧縮されていて1.5GBなので読込処理に2分超かかりました。

```python:
model = KeyedVectors.load_word2vec_format('/content/drive/MyDrive/ColabNotebooks/ML/NLP100_2020/07.WordVector/input/GoogleNews-vectors-negative300.bin.gz', binary=True)
```