word2vecをColab環境で使うための5行

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) 　今すぐword2vecをcolab環境使ってみたい。最短手順でわかりたい。

##やること

以前まとめた[word2vecのデモを試す（特にMac環境）](https://qiita.com/Ninagawa_Izumi/items/a866ea7e4f8eaaddb6de)に近しいことをgoogle Colablatory環境で実行します。
gensimを利用して簡易的に「単語のベクトル化」を行い、単語の足し算などを試します。
コーパスとしてtext8を利用します。


##環境

- [Colaboratory環境](https://colab.research.google.com/notebooks/intro.ipynb)
- ブラウザはChrome推奨

colabを少し使ったことがある前提で進めていきます。
でもpythonを知らなくても実行できる説明にします。

##やり方
colabで下記を実行していきます。簡単な解説もつけます。

#### text8コーパスをダウンロードして読み込む

```python:python
import gensim.downloader as gendl
corpus = gendl.load("text8")
```
pythonの言語処理ライブラリgensimを利用し、変数corupsにtext8をロードします。
text8は前処理済みの英文コーパスで、単語がスペース区切りで格納されています。
ライブラリがデータセットまで準備してくれているなんて、至れり尽くせりです。
　

```python:python
corpus
```
とすると、
>＜text8.Dataset at 0xほにゃらら＞

と表示されます。at以下はたぶん16進数表記のデータサイズです。読み込めているということです。


#### gensimで学習させる

```python:python
import gensim #ライブラリgensimを導入する
model = gensim.models.Word2Vec(corpus, size=5, window=2, iter=1, min_count=1)
```
読み込んだtext8コーパスをgensimでベクトル化していきます。
例ではスピードアップのために学習を弱くしてあるので、1分ぐらいで結果が出ると思います。

gensim.models.Word2Vec()の中にある項目の意味は下記となります。

- corpus : 結果を代入する変数
- size : 次元数
- window : 単語の前後いくつまで関係をみるか
- iter : 反復学習回数
- min_count : 扱う単語の頻度閾値

他にも、

- sg : 学習アルゴリズム。0ならCBOW、1ならskip-gram
- - max_vocab_size : 語彙の最大数

などがあるようです。

処理が終わったら、

```python:python
model
```
と入力して実行します。
>＜gensim.models.word2vec.Word2Vec at 0xほにゃらら＞
と出ます。

少しパラメータを増やして機械学習してみましょう。

```python:python
model = gensim.models.Word2Vec(corpus, size=200, window=5, iter=10, min_count=1)
model
```
6分ぐらいで完了します。完了すると
>＜gensim.models.word2vec.Word2Vec at 0xほにゃらら＞

が表示されるので合図になります。

#### 単語の類似度を見る

単語の類似度を調べてみます。"coffee"はどうなるでしょうか。

```python:python
model.wv.most_similar("coffee")
```
読み込んだtext8コーパスをgensimでベクトル化していきます。

>[('wool', 0.6894910335540771),
 ('cocoa', 0.6891734600067139),
 ('seafood', 0.6766855716705322),
 ('meat', 0.6657349467277527),
 ('cigarettes', 0.6616493463516235),
 ('wheat', 0.6599244475364685),
 ('syrup', 0.6596278548240662),
 ('cotton', 0.6591023206710815),
 ('cheese', 0.658471941947937),
 ('liquor', 0.6500911116600037)]

という結果が出て、"coffee"に一番似ているのは"wool"となりました。"cocoa"が２位なのでまあまあかな。別のパラメータで試した時は"tea"が１位になることもありました。
他の単語でも試してみてください。

#### 「女王」＋「女」ー「男」＝？　を試す

```python:python
model.wv.most_similar(positive=['queen', 'woman'], negative=['man'])
```
positiveとnegativeの項目を追加して、内容を操作してみます。
お察しの通り、positiveが足し算する単語、negativeが引き算する単語です。

>[('princess', 0.5237167477607727),
 ('consort', 0.49119704961776733),
 ('wife', 0.4860479235649109),
 ('elizabeth', 0.47580623626708984),
 ('monarch', 0.4757298529148102),
 ('husband', 0.47444406151771545),
 ('mother', 0.4598205089569092),
 ('mary', 0.456966370344162),
 ('spouse', 0.4559243321418762),
 ('daughter', 0.4540153741836548)]

という結果。なんか惜しい感じです。

計算する単語を入れ替えてみましょう。

```python:python
model.wv.most_similar(positive=['queen', 'man'], negative=['woman'])
```
>[('king', 0.4555075764656067),
 ('duke', 0.45153024792671204),
 ('lord', 0.44045498967170715),
 ('regent', 0.4297080338001251),
 ('crown', 0.42514702677726746),
 ('wales', 0.4120979309082031),
 ('victoria', 0.4099408984184265),
 ('portugal', 0.40795454382896423),
 ('aragon', 0.40479281544685364),
 ('prince', 0.4001534581184387)]

「女王」＋「男」ー「女」＝「王様」となりました。
これはイメージに近い感じです。

次に「野球」「MLB」「バスケ」「NBA」の関係をみてみましょう。

```python:python
model.wv.most_similar(positive=['baseball', 'mlb'], negative=['basketball'])
```
>[('nba', 0.5073813199996948),....

が出ました。

単語を入れ替えてみます。

```python:python
model.wv.most_similar(positive=['basketball', 'mlb'], negative=['baseball'])
```
こちらもnbaが１位になりました。

最後に「日本」「東京」「フランス」「パリ」の関係がうまく出るか見てみましょう。

```python:python
model.wv.most_similar(positive=['paris', 'japan'], negative=['tokyo'])
```
>[('france', 0.5635770559310913),

が出ました。

## まとめ
ぜひ設定や単語の計算やパラメータ設定をいろいろ試してみて下さい。
初心者の方でも、このシンプルなプログラムを軸に、理解を深めていけると思います。
ちなみに５行で実行するしたら下記のようになります。１分ぐらいで結果が出ると思います。

```python:python
#word2vecを5行で使う
import gensim
import gensim.downloader as gendl
corpus = gendl.load("text8")
model = gensim.models.Word2Vec(corpus, size=5, window=2, iter=1, min_count=1)
model.wv.most_similar("coffee")
```
おまけの後にこの後やっていくことへのリンクもあります。

## おまけ : モデルのセーブ・ロード方法
モデルをセーブする方法も追記しておきます。

```python:python
model.save("gensim_text8_test.model")
```
でSAVEできます。"gensim_text8_test.model"のところは好きな名前にできます。

```shell:Colab
! ls
```
とすると、
>gensim_text8_test.model  sample_data

のように表示され、現在のディレクトリにファイルとして保存されていることがわかります。

```python:python
model = gensim.models.Word2Vec.load('gensim_text8_test.model')
```
で読み込めます。

セーブしたファイルをローカル環境にダウンロードする場合には、

```python:python
from google.colab import files
files.download('gensim_text8_test.model')
```

とします。これで一安心。

ローカル環境のモデルをcolab環境にアップロードしたい場合には、

```python:python
from google.colab import files
files.upload()
```
を実行したあと、現れるボタンを押してファイルを選択すればOKです。

[グーグルドライブをマウントして使うのも便利です。](https://qiita.com/Ninagawa_Izumi/items/5b0a2facd6927498c9ba)


## おまけ２ : 日本語版のTEXT8を使う場合
こちらが参考になります。
https://hironsan.hatenablog.com/entry/japanese-text8-corpus


## このあとにやること

日本語を扱っていけるようにします。MeCabで日本語の形態素解析を行ったり、オリジナルの日本語コーパスを作ったりしていきます。もちろんその日本語でWord2Vecを試していきます。

次回記事 [Colab環境でMeCabを使う3行](
https://qiita.com/Ninagawa_Izumi/items/c90cccb453e2a6fc4466)

次々回記事：[青空文庫からテキストをダウンロードしてプレーンにする](https://qiita.com/Ninagawa_Izumi/items/af7d704680fba63914e8)
その次の記事：[Colab環境で分散表現処理](https://qiita.com/Ninagawa_Izumi/items/a49085e36e6de53b3eca)