事前学習モデルを利用したFasttextの使い方

# 事前学習モデルのダウンロード

[ここ](https://fasttext.cc/docs/en/crawl-vectors.html)のJapaneseからダウンロードします。
binでbin.gz、textでvec.gz形式のファイルをダウンロードできます。

# vec.gz形式ファイル利用パターン

### 事前学習モデルをロードする
gensimを使用します。Google colabを使っています。model_pathは自身でcc.ja.300.vec.gzを配置したパスを指定してください。

```python
import gensim
model_path = "/content/drive/MyDrive/機械学習/cc.ja.300.vec.gz"
model = gensim.models.KeyedVectors.load_word2vec_format(model_path, binary=False)
```

### 類似度トップ10を出力する

```python
match_top_ten = model.most_similar("猫", topn=10)
print(match_top_ten)
```
猫っぽい単語が10件とその類似度が取得できました。

```bash
[('ネコ', 0.8059155941009521), ('ねこ', 0.7272598147392273), ('子猫', 0.720253586769104), ('仔猫', 0.7062687873840332), ('ニャンコ', 0.7058036923408508), ('野良猫', 0.7030349969863892), ('犬', 0.6505385041236877), ('ミケ', 0.6356303691864014), ('野良ねこ', 0.6340526342391968), ('飼猫', 0.6265145540237427)]
```

### 単語ベクトルを取得する

```python
wv = model["猫"]
print(wv)
```

これが「猫」という単語の単語ベクトルです。

```bash
[-2.618e-01 -7.520e-02 -1.930e-02  2.088e-01 -3.005e-01  1.936e-01
 -1.561e-01 -3.540e-02  1.220e-01  2.718e-01  7.460e-02  1.356e-01
  2.299e-01  1.851e-01 -2.684e-01 -1.551e-01 -2.054e-01  1.287e-01
 -2.769e-01 -1.112e-01  1.660e-01  8.750e-02 -3.794e-01 -1.880e-02
 -7.800e-03  1.989e-01 -2.120e-02 -2.130e-02  8.780e-02  1.817e-01
  1.262e-01 -1.204e-01  1.168e-01 -9.880e-02  1.586e-01 -2.534e-01
  2.431e-01  1.110e-02  1.271e-01 -8.880e-02 -3.810e-02  1.086e-01
  2.221e-01 -1.491e-01  1.100e-02  7.000e-04 -1.220e-02 -1.615e-01
  2.901e-01 -3.218e-01 -4.850e-02  1.680e-01  3.200e-02 -6.290e-02
  3.840e-02 -4.700e-03 -1.886e-01  3.340e-01 -5.650e-02 -1.226e-01
 -8.850e-02 -1.990e-02  7.800e-02  2.733e-01 -1.176e-01 -5.810e-02
  2.918e-01  3.278e-01  1.530e-02  7.850e-02  7.880e-02  1.150e-01
 -1.120e-01  1.770e-01  1.552e-01 -3.415e-01  2.860e-02  7.640e-02
  1.373e-01  2.850e-02  2.966e-01  2.758e-01 -1.515e-01  1.234e-01
 -7.200e-03 -1.658e-01 -2.940e-01  3.892e-01 -2.243e-01  2.120e-02
 -2.215e-01 -4.970e-02 -7.660e-02 -5.290e-02 -4.292e-01  7.710e-02
 -3.077e-01 -3.280e-02 -1.447e-01 -1.442e-01  8.050e-02  1.353e-01
 -1.017e-01 -6.520e-02  5.700e-03  4.950e-01 -2.820e-02  8.320e-02
  9.150e-02  4.880e-02 -7.770e-02  5.370e-02  1.104e-01  6.380e-02
  1.233e-01  2.600e-02 -2.406e-01  1.355e-01 -1.698e-01 -1.748e-01
  1.745e-01 -2.370e-02 -9.200e-03  3.327e-01  1.910e-01  3.356e-01
 -1.470e-02 -5.000e-03 -3.097e-01  5.420e-02  1.057e-01  5.720e-02
 -2.976e-01 -3.004e-01  2.295e-01 -9.910e-02 -3.650e-02  1.166e-01
 -3.594e-01 -1.238e-01  1.862e-01  5.320e-02  1.792e-01  4.700e-02
  2.246e-01 -2.130e-02  2.092e-01  2.047e-01  7.340e-02 -1.887e-01
  3.730e-02  2.500e-02  2.060e-02  1.457e-01 -4.860e-02  1.008e-01
  1.458e-01  2.068e-01 -1.464e-01 -6.400e-03 -3.290e-02  3.240e-02
  5.590e-02 -7.020e-02 -3.650e-02 -1.387e-01 -9.700e-03 -3.486e-01
 -1.304e-01  3.120e-02  1.298e-01 -5.900e-03  2.204e-01  2.889e-01
 -3.348e-01  9.400e-02 -1.565e-01  1.469e-01  7.520e-02  8.880e-02
  2.655e-01 -7.380e-02  2.523e-01  1.083e-01 -3.066e-01 -4.980e-02
  8.730e-02 -2.416e-01 -3.290e-02 -2.960e-01  3.670e-02 -1.312e-01
 -1.021e-01  1.569e-01  3.260e-02  7.440e-02 -3.100e-03  5.360e-02
 -1.200e-01 -3.090e-01 -3.930e-02 -3.560e-02 -3.790e-02  2.208e-01
 -1.549e-01 -1.809e-01 -2.200e-03 -1.736e-01  2.322e-01  8.780e-02
 -5.450e-02  6.410e-02 -7.190e-02 -1.757e-01  4.670e-02 -1.398e-01
  1.930e-01 -8.423e-01  4.090e-02  3.640e-02 -4.190e-02 -1.700e-02
  1.280e-01 -4.950e-02 -1.280e-01 -1.997e-01  1.454e-01  8.940e-02
 -2.910e-02  2.722e-01  3.204e-01  4.930e-02 -4.160e-01 -8.270e-02
 -4.950e-02 -9.600e-03 -4.089e-01 -3.750e-02  1.131e-01 -2.100e-01
 -5.920e-02 -8.000e-03  1.004e-01 -1.062e-01  1.687e-01  5.980e-02
 -4.066e-01  3.142e-01 -2.158e-01  4.300e-02 -2.010e-02 -4.597e-01
  5.240e-02  1.320e-02 -1.379e-01  1.603e-01 -1.517e-01  3.198e-01
  1.859e-01  1.167e-01  1.046e-01 -2.784e-01  7.240e-02  6.420e-02
 -8.920e-02 -7.480e-02  6.400e-02  3.545e-01  1.940e-01 -3.175e-01
  9.000e-04 -6.500e-03 -5.890e-02  3.700e-02  5.630e-02  1.494e-01
 -3.680e-02  1.770e-02  1.530e-02 -1.569e-01 -3.110e-01  3.190e-02
  4.990e-02 -3.188e-01  1.510e-02 -9.260e-02 -8.890e-02  1.143e-01
 -3.381e-01 -1.913e-01  8.160e-02 -4.420e-02 -2.405e-01 -2.170e-02
 -1.062e-01  3.230e-02 -2.380e-02  1.860e-02 -2.750e-02 -1.900e-01]
```

### 単語同士の類似度を計算する

```python
cat_dog = model.similarity("猫", "犬")
cat_human = model.similarity("猫", "人間")

print(f'猫vs犬{cat_dog}')
print(f'猫vs人間{cat_human}')
```

「猫」という単語は「人間」という単語より「犬」という単語に近いと判別できていますね。

```bash
猫vs犬0.6505385637283325
猫vs人間0.3766768276691437
```

### 問題点
vec.gzファイルで読み込むと未知語に対応できないという問題があります。

```python
model.get_word_vector("桃太郎")
```

```bash
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-11-f60e3c32a4a3> in <module>
----> 1 model.get_word_vector("桃太郎")

AttributeError: 'Word2VecKeyedVectors' object has no attribute 'get_word_vector'
```

この問題には、次のbin.gz形式ファイルを利用するパターンで対応できます。

# bin.gz形式ファイル利用パターン

### bin.gz形式のファイルを解凍する

```python
gunzip /xxx/cc.ja.300.bin.gz
```

### fasttextをインストールする

このパターンではgensimは使いません。ピュアなfasttextを利用します。

```python
!pip install fasttext
import fasttext
```

### 事前学習モデルをロードする

```python
model_path = "/content/drive/MyDrive/fasttext/cc.ja.300.bin"
model = fasttext.load_model(model_path)
```

### 未知語の単語ベクトルを取得する

vec.gz形式のファイルを利用した場合、「桃太郎」は未知語でしたが、今回は未知語に対応できており、しっかりと単語ベクトルも取得できています。

```python
model["桃太郎"]
```

```bash
array([-2.11017832e-01, -6.11549020e-02, -5.87812401e-02,  4.15939391e-02,
        1.27968192e-01,  1.75965995e-01, -1.87733136e-02, -1.29021611e-02,
        1.29758656e-01,  6.67858422e-02,  3.65777388e-02,  9.50902402e-02,
       -3.21440957e-03,  1.01252787e-01, -1.32571533e-02, -1.59447402e-01,
       -1.26142308e-01, -5.18641323e-02, -1.92709729e-01, -5.69081455e-02,
        5.72488904e-02,  7.45662600e-02, -2.63597429e-01,  5.22840768e-04,
       -8.07714984e-02,  1.09920315e-02, -3.72601785e-02,  3.31281275e-02,
        1.88335143e-02, -7.42663816e-02,  3.90677974e-02, -1.26953393e-01,
       -1.36732422e-02,  1.13868900e-01, -1.99942157e-01, -8.36302787e-02,
       -2.34866608e-02, -4.61000204e-02, -2.50552185e-02,  5.56282923e-02,
       -2.16998443e-01, -8.50710645e-03, -1.99613899e-01,  1.65409744e-01,
        2.76893824e-01,  4.25050408e-02,  8.77424330e-02,  1.60532400e-01,
        3.18152308e-02,  5.97265363e-02,  9.30823535e-02,  3.17180157e-03,
        1.45810824e-02, -3.66535001e-02,  6.26848778e-03, -2.35797595e-02,
       -5.98657876e-03, -1.57967702e-01,  8.86688679e-02,  5.99692315e-02,
       -2.26924615e-03, -2.02223450e-01,  9.30751264e-02,  8.12020153e-02,
        8.85030180e-02, -3.71126086e-02,  1.46946609e-01, -2.68557351e-02,
       -3.26324962e-02, -3.20300907e-02,  1.77114546e-01,  9.21188667e-03,
        1.32169932e-01,  1.90401882e-01,  1.22353800e-01, -5.94687238e-02,
        7.99566582e-02, -3.19244564e-02,  1.53464004e-01, -1.54775321e-01,
       -7.50129670e-02, -2.52284110e-01, -4.10201885e-02,  8.56377184e-02,
        9.17201489e-02, -8.32509771e-02, -1.05570264e-01, -1.26330763e-01,
        5.39169684e-02, -6.51319772e-02,  3.80685069e-02,  2.18582377e-02,
        5.37983850e-02,  1.60649221e-03, -1.09403208e-01,  1.31449521e-01,
       -1.73065484e-01, -5.51376119e-02, -8.77213478e-02,  8.21764171e-02,
        9.47549939e-03,  4.15314585e-02,  3.15116458e-02, -1.27190098e-01,
        9.15929526e-02,  2.57789731e-01,  9.71682146e-02,  1.35223702e-01,
       -2.50549391e-02, -3.95709947e-02, -3.15480903e-02,  8.48162994e-02,
       -1.18726909e-01,  1.30593583e-01, -1.46044642e-01, -1.34789161e-02,
       -2.13188946e-01,  2.06004262e-01, -4.06386666e-02, -5.99766001e-02,
       -1.64517403e-01, -2.35089034e-01,  1.49892271e-01,  8.34037215e-02,
        5.59076704e-02, -6.25506602e-03,  1.44875124e-01, -3.26874480e-02,
        2.23791189e-02, -3.63625623e-02, -1.28613397e-01,  3.96037288e-03,
        7.98508525e-02, -7.82599151e-02, -9.14560072e-03, -2.47907937e-01,
        6.35485724e-02, -1.00841805e-01, -1.77780524e-01, -8.81870762e-02,
        5.03124930e-02, -1.63599923e-01,  6.71522915e-02,  1.53299317e-01,
       -2.53684185e-02, -5.34955934e-02, -8.44887346e-02,  1.30589306e-01,
        1.11063093e-01, -1.72004402e-02, -1.97306443e-02,  6.97549284e-02,
       -1.23364702e-01, -8.09573904e-02,  5.46613149e-02, -1.54588655e-01,
       -6.67606071e-02, -7.46181421e-03,  1.73905939e-02,  1.58269837e-01,
       -7.91603103e-02, -1.10128902e-01,  2.13448912e-01, -1.05747782e-01,
       -1.65329166e-02,  8.17414224e-02,  3.49752530e-02,  7.50264227e-02,
        7.43481889e-03, -1.60944358e-01, -1.82228759e-01, -3.84702682e-02,
       -3.11158597e-04,  1.74351513e-01,  2.83794012e-02, -1.76270425e-01,
       -1.42247584e-02, -9.01901722e-02,  1.12163149e-01, -4.05135378e-02,
       -1.99156538e-01, -2.38139592e-02,  5.59190065e-02,  9.06309560e-02,
       -3.99347804e-02,  9.18294117e-02,  4.79270443e-02,  9.74692628e-02,
        9.93297994e-02,  2.62023527e-02,  6.94924034e-03, -3.66524979e-02,
       -1.25131249e-01,  1.18306480e-01,  1.36922210e-01, -1.47344470e-01,
        4.64325547e-02, -5.11372611e-02, -1.76337242e-01,  5.48487529e-04,
       -4.40149233e-02,  3.88518721e-02, -9.73530337e-02,  6.91959560e-02,
       -3.21092568e-02,  8.07673782e-02,  1.23765178e-01,  2.68876888e-02,
        1.02935739e-01,  3.06654442e-02, -1.02046020e-02, -5.74413836e-02,
        5.64848259e-02, -1.53644145e-01,  1.76163182e-01, -1.41444296e-01,
        1.32269803e-02, -4.58560973e-01,  1.68367773e-01,  1.49275541e-01,
        1.40211489e-02,  2.22800616e-02, -3.92627604e-02,  1.43062413e-01,
        1.34093285e-01, -8.19070339e-02,  2.19929516e-01, -6.58188090e-02,
        4.70058508e-02, -1.47801358e-03,  2.12415963e-01,  7.88806528e-02,
       -1.34104937e-01,  7.87512809e-02, -2.09096838e-02, -1.43486142e-01,
       -1.49191350e-01, -6.24046959e-02, -1.02979615e-02, -2.86541339e-02,
       -7.41928369e-02, -1.75725579e-01, -3.40551138e-03, -1.35445163e-01,
        2.12806880e-01, -1.25015751e-01, -2.04145581e-01,  6.48211315e-03,
       -2.81811625e-01,  9.51502100e-02,  1.29561294e-02, -2.83128291e-01,
       -5.38711809e-02,  1.26992613e-01,  7.77230784e-02, -6.49034157e-02,
       -7.23240674e-02,  1.40655376e-02,  1.74438193e-01,  7.07441568e-02,
        1.42009988e-01, -3.69406082e-02, -1.22719914e-01,  9.05641913e-03,
       -6.78254217e-02, -7.39191324e-02,  1.01051912e-01,  3.73146161e-02,
        1.51154041e-01,  1.35735288e-01, -1.14098266e-01,  1.81629375e-01,
        1.06007427e-01,  7.24611059e-02, -9.31279659e-02, -4.97951824e-03,
        5.77732548e-02, -8.00412223e-02,  5.54473139e-02,  3.34919766e-02,
       -8.65937918e-02,  1.00335941e-01, -2.28205532e-01,  9.91395861e-02,
       -8.31804238e-03, -1.41845793e-02,  7.59890303e-03,  1.77857190e-01,
        4.16367538e-02, -1.98426411e-01, -4.94988039e-02, -1.18880644e-02,
       -1.87716484e-02,  1.16297491e-02, -1.82370320e-01, -8.35657269e-02,
        1.43025517e-01, -2.08161592e-01,  1.52751237e-01,  1.66463107e-03],
      dtype=float32)
```

### ちなみに

類似度トップ10も取得してみました。

```python
model.get_nearest_neighbors("桃太郎", k=10)
```

桃太郎はゴリラだったのか。。
```bash
[(0.5609155893325806, 'イケメンゴリラ・'),
 (0.5114859938621521, '三遊亭歌之介'),
 (0.508000373840332, 'びだんごで'),
 (0.5065764784812927, '痴憾'),
 (0.5016431212425232, '金太郎'),
 (0.49873778223991394, '鬼ケ島'),
 (0.49698230624198914, 'モモタロウ'),
 (0.4963390529155731, 'ヴェンピー'),
 (0.4879409372806549, 'モモタロ'),
 (0.4812622666358948, '桃')]
```