事前学習モデルのダウンロード
ここの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, '桃')]