🎉
GINZA,word2vec,matplotlib,sklearnによる分散表現の2次元プロットに関する質問
解決したいこと
chiveの辞書を用いて、自分の集めたデータ(企業10社のtextデータから抽出した形態素解析後の単語)を学習させ、単語全ての分散表現を2次元の図にプロットしたいと考えています。
そこで、下記コードを作ったのですが、エラーが出て動きません。
発生している問題・エラー
data.append(word2vec_model[vec_words[j][0]])
TypeError: 'Word2Vec' object is not subscriptable
該当するソースコード(Python)
#%%
# 自然言語処理(NLP)用のライブラリをインポート
import spacy
import numpy as np
# ファイルのパスを取得するため
import glob
# モデルのダウンロード
import gensim
vectors = gensim.models.KeyedVectors.load("../data/chive-1.2-mc5_gensim/chive-1.2-mc5.kv")
# word2vecのインポート
from gensim.models import Word2Vec
# プロットに必要なものをインポート
import matplotlib.pyplot as plt # 図のプロット
from sklearn.decomposition import PCA # N次元のベクトルをプロットできるよう2次元ベクトルに圧縮
# 単語の元となるテキストデータを検索
paths = glob.glob('../stopword/*.txt')
# デフォルトの事象をロード
nlp = spacy.load('ja_ginza_electra')
# 2次元配列の初期値を指定([[],[],…,[]←10個の状態])
word_list = [[] for i in range(len(paths))]
# テキストを会社ごとかつ単語ごとに分けて2次元配列として取得
for i,path in enumerate(paths):
# plotする会社名+単語名にするための会社名を用意
company = path.replace("../stopword/","")
company_name = company.replace(".txt","")
vec = []
with open(path, 'r') as f:
# 1行ずつ読み込み
text = f.read().split('\n')
# 空文字のlistを除去
text = list(filter(None, text))
# doc =
# 1行のtextから一つの単語を持ってきてその中の単語をwordとして代入
for j,word in enumerate(text):
words = word.split(",")[0]
# 2次元配列で、会社ごとの単語を分けて追加する
word_list[i].append(words)
# 会社それぞれの単語のベクトル化
model = Word2Vec(word_list, min_count=0, sg=1)
# モデルの保存
model.save("word2vec.model")
# 読み込み
model = Word2Vec.load("word2vec.model")
# 単語のベクトル化とプロット
vec_words = []
for i,path in enumerate(paths):
for l,word in enumerate(word_list[i]):
# プロットする単語の設定
vec_words.append([word,"k"])# プロットする値を追加:変数名.append(["値","色(k:黒)"])
# 別の単語設定方法
# print(word2vec_model.wv.index_to_key[])
# for s in word2vec_model.mv.index_to_key[]:
length = len(vec_words)
print(length)
data = []
#%%
# プロットするためのdataの登録
j = 0
while j < length:
data.append(model[vec_words[j][0]])
j += 1
# 主成分分析(PCA)により2次元に圧縮
pca = PCA(n_components=2)
pca.fit(data)
data_pca = pca.transform(data)
length_data = len(data_pca)
# プロットの設定
fig = plt.figure(figsize=(10,6),facecolor='w')
plt.rcParams["font.size"] = 10
k = 0
for company in company_name:
while k < length_data:
# 点プロット
plt.plot(data_pca[k][0], data_pca[k][1], ms=5.0, zorder=2, marker="・", color=vec_words[k][1])
#文字プロット
plt.annotate(company + '_' + vec_words[k][0], (data_pca[k][0], data_pca[k][1]), size=12)
k += 1
plt.show()
自分で試したこと
ここに問題・エラーに対して試したことを記載してください。
・gensimのバージョンアップにより、どこかのコードが使えなくなっているのかと思い、調べましたが、原因は掴めずでした。何卒よろしくお願いいたします
参考サイト
Discussion