言語処理100本ノック-86:単語ベクトルの表示

[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の86本目「単語ベクトルの表示」の記録です。
今回は[前回のノック](https://qiita.com/FukuharaYohei/items/f3d975e7a9a801dd29fc)で300次元まで圧縮した単語ベクトルを表示するだけです。結果を見るだけなので非常に簡単です。[第9章: ベクトル空間法 (I)](http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch9)は今までのノックが重かったのですが、以降は基本的に結果を使うだけなのでたいして重い処理がないです。


# 参考リンク

|リンク|備考|
|:--|:--|
|[086.単語ベクトルの表示.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/09.%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E7%A9%BA%E9%96%93%E6%B3%95%20(I)/086.%E5%8D%98%E8%AA%9E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E8%A1%A8%E7%A4%BA.ipynb)|回答プログラムのGitHubリンク|
|[素人の言語処理100本ノック:86](https://qiita.com/segavvy/items/d0cfabf328fd6d67d003)|言語処理100本ノックで常にお世話になっています|

# 環境

|種類|バージョン|内容|
|:--|:--|:--|
|OS|Ubuntu18.04.01 LTS|仮想で動かしています|
|pyenv|1.2.15|複数Python環境を使うことがあるのでpyenv使っています|
|Python|3.6.9|pyenv上でpython3.6.9を使っています<br>3.7や3.8系を使っていないことに深い理由はありません<br>パッケージはvenvを使って管理しています|

上記環境で、以下のPython追加パッケージを使っています。通常のpipでインストールするだけです。

|種類|バージョン|
|:--|:--|
|numpy|1.17.4|
|pandas|0.25.3|

# 課題
## [第9章: ベクトル空間法 (I)](http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch9)
>[enwiki-20150112-400-r10-105752.txt.bz2](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/enwiki-20150112-400-r10-105752.txt.bz2)は，2015年1月12日時点の英語のWikipedia記事のうち，約400語以上で構成される記事の中から，ランダムに1/10サンプリングした105,752記事のテキストをbzip2形式で圧縮したものである．このテキストをコーパスとして，単語の意味を表すベクトル（分散表現）を学習したい．第9章の前半では，コーパスから作成した単語文脈共起行列に主成分分析を適用し，単語ベクトルを学習する過程を，いくつかの処理に分けて実装する．第9章の後半では，学習で得られた単語ベクトル（300次元）を用い，単語の類似度計算やアナロジー（類推）を行う．
>
>なお，問題83を素直に実装すると，大量（約7GB）の主記憶が必要になる． メモリが不足する場合は，処理を工夫するか，1/100サンプリングのコーパス[enwiki-20150112-400-r100-10576.txt.bz2](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2)を用いよ．

今回は*「1/100サンプリングのコーパス[enwiki-20150112-400-r100-10576.txt.bz2](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2)」*を使っています。

### 86. 単語ベクトルの表示
>  85で得た単語の意味ベクトルを読み込み，"United States"のベクトルを表示せよ．ただし，"United States"は内部的には"United_States"と表現されていることに注意せよ．

# 回答
## 回答プログラム [086.単語ベクトルの表示.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/09.%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E7%A9%BA%E9%96%93%E6%B3%95%20(I)/086.%E5%8D%98%E8%AA%9E%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E8%A1%A8%E7%A4%BA.ipynb)

```python
import numpy as np
import pandas as pd

# 保存時に引数を指定しなかったので'arr_0'に格納されている
matrix_x300 = np.load('085.matrix_x300.npz')['arr_0']

print('matrix_x300 Shape:', matrix_x300.shape)

group_t = pd.read_pickle('./083_group_t.zip')

# 'United States'の単語ベクトル表示
print(matrix_x300[group_t.index.get_loc('United_States')])
```

## 回答解説
前回ノックで保存したnpz形式のファイルを読み込みます。保存時に特に指定をしないと、`arr_0`に格納されているようです。わざわざインデックスを使うのは、npz形式は複数の配列をまとめて保存できるからです。

```python
# 保存時に引数を指定しなかったので'arr_0'に格納されている
matrix_x300 = np.load('085.matrix_x300.npz')['arr_0']
```

上記で読み込んだ配列には単語の情報がないので、[「言語処理100本ノック-83(pandas使用):単語／文脈の頻度の計測」](https://qiita.com/FukuharaYohei/items/9696afb342aa367ae5d1)で保存した対象語(Target Word)の情報を辞書として読み込みます。

```python
group_t = pd.read_pickle('./083_group_t.zip')
```

あとはベクトル表示するだけです。

```python
# 'United States'の単語ベクトル表示
print(matrix_x300[group_t.index.get_loc('United_States')])
```

数字の羅列なので、あまり書く意味がないですが最初の数要素はこんな感じで出力されます。

```bash
[ 3.54543797e+00 -7.83172862e-01  1.02182432e-01  6.22943904e+00
  2.48960832e+00 -1.19176940e+00 -2.23164453e+00  3.68785814e-01
以後略
```