別棟備忘録4

*

Word2Vecの学習済みmodelを扱う備忘録

      2024/02/06

学習した後のモデルを処理する文法を確認するためのコードを貼っておきます。
gensimのword2vecで学習したモデルshoken6.modelを分析します。

pythonのコード

from gensim.models import word2vec
import numpy as np
import matplotlib.pyplot as plt

model = word2vec.Word2Vec.load("./shoken6.model")

print("***********************************")

print(len(model.wv.index2word)) #語彙の数
print(model.wv.vectors.shape)   #分散表現の形状
print(model.wv.vectors)         #分散表現
print(model.wv.index2word[100:110])   #最初の100番目からの10語

print("***********************************")
print(model.wv.index2word[100], "のベクトル")
print(model.wv.vectors[100])          #100番目の単語のベクトル
print(model.wv.__getitem__("素直"))    #"素直"のベクトル
print("***********************************")

"""
#言葉の足し算や引き算は以下の通り
pos = "理科"
neg = "国語"
results = model.wv.most_similar(positive=[pos],negative=[neg])
print ("pos:"+pos,"neg:"+neg)
"""

#1語の場合の類似度の確認
word_0 = '理科'
results = model.wv.most_similar(word_0)
print(word_0, "と類似度の高い単語") 
for result in results:
    print(result)

print("***********************************")
#"理科"と"化学"の類似度の確認
word_1 = '理科'
word_2 = '化学'

#コサイン類似度は、一般に2つのベクトルから次のように計算します。
a = model.wv.__getitem__(word_1)
b = model.wv.__getitem__(word_2)
cos_sim = np.dot(a, b)/np.linalg.norm(a)/np.linalg.norm(b)
#printの結果は、.most_similarで表示されるものと一致しているはずです
print(word_1, "と", word_2, "のコサイン類似度:", cos_sim)

plt.imshow(model.wv.__getitem__(word_1).reshape(10,20))
plt.colorbar()
plt.show()

plt.imshow(model.wv.__getitem__(word_2).reshape(10,20))
plt.colorbar()
plt.show()

plt.imshow(model.wv.__getitem__('素直').reshape(10,20))
plt.colorbar()
plt.show()

 

アウトプットに関して

print(len(model.wv.index2word)):辞書に登録された単語数
980

print(model.wv.vectors.shape):辞書は980語それぞれに対して200次元
(980, 200)

print(model.wv.vectors):各語のベクトル
[[-0.31556305 0.25042534 -0.30843705 … 0.2533021 -0.04526643
0.02186958]
[ 0.13697276 -0.17418513 -0.03861225 … -0.22277528 0.8458962
-0.01522555]
[-0.31386554 0.0706657 0.5122351 … 0.17934604 -0.07095998
-0.31546038]

[ 0.03189972 0.02713368 -0.03583989 … -0.02857453 0.06417285
-0.10585895]
[-0.06771924 0.05249714 0.02783762 … 0.06250255 0.03627604
-0.10140464]
[ 0.03818886 0.08298691 -0.02858759 … 0.08591254 0.168906
0.0820125 ]]

print(model.wv.index2word[100:110]):辞書に登録された単語の確認
[‘素直’, ‘理解’, ‘に対する’, ‘でき’, ‘・’, ‘きちんと’, ‘クラス’, ‘について’, ‘国語’, ‘ため’]

print(model.wv.most_similar(word_0)):類似度の高い語の表示
理科 と類似度の高い単語
(‘化学’, 0.9509211182594299)
(‘生物’, 0.9498825073242188)
(‘英語’, 0.9344501495361328)
(‘地理’, 0.9291201829910278)
(‘物理’, 0.9286836385726929)
(‘数学’, 0.9245099425315857)
(‘国語’, 0.9208290576934814)
(‘分野’, 0.9112943410873413)
(‘特に’, 0.9080013036727905)
(‘現代文’, 0.8767422437667847)

plt.imshow(model.wv.__getitem__(word_1).reshape(10,20))
“理科”(上)と”化学”(下)の図(類似度0.951)

“素直”の図(”理科”との類似度0.552)

 - Python, stringDistance, 備忘録