🎉

GINZA,word2vec,matplotlib,sklearnによる分散表現の2次元プロットに関する質問

2022/11/18に公開

解決したいこと

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のバージョンアップにより、どこかのコードが使えなくなっているのかと思い、調べましたが、原因は掴めずでした。何卒よろしくお願いいたします

参考サイト

https://radimrehurek.com/gensim/models/word2vec.html

https://gist.github.com/jshirius/0682042101b80cd77a490f1ef5bda07f

https://github.com/WorksApplications/chiVe

Discussion