LoginSignup
3
5

More than 1 year has passed since last update.

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

Posted at

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

ここのJapaneseからダウンロードします。
binでbin.gz、textでvec.gz形式のファイルをダウンロードできます。

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

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

gensimを使用します。Google colabを使っています。model_pathは自身でcc.ja.300.vec.gzを配置したパスを指定してください。

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

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

match_top_ten = model.most_similar("", topn=10)
print(match_top_ten)

猫っぽい単語が10件とその類似度が取得できました。

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

単語ベクトルを取得する

wv = model[""]
print(wv)

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

[-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]

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

cat_dog = model.similarity("", "")
cat_human = model.similarity("", "人間")

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

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

猫vs犬0.6505385637283325
猫vs人間0.3766768276691437

問題点

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

model.get_word_vector("桃太郎")
---------------------------------------------------------------------------
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形式のファイルを解凍する

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

fasttextをインストールする

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

!pip install fasttext
import fasttext

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

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

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

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

model["桃太郎"]
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も取得してみました。

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

桃太郎はゴリラだったのか。。

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5