解決したいこと
chiveの辞書を用いて、自分の集めたデータ(企業10社のtextデータから抽出した形態素解析後の単語)を学習させ、単語全ての分散表現を2次元の図にプロットしたいと考えています。
そこで、下記コードを作ったのですが、エラーが出て動きません。
発生している問題・エラー
data.append(word2vec_model[vec_words[j][0]]) TypeError: 'Word2Vec' object is not subscriptable
該当するソースコード(Python)
python
1#%% 2# 自然言語処理(NLP)用のライブラリをインポート 3import spacy 4import numpy as np 5# ファイルのパスを取得するため 6import glob 7# モデルのダウンロード 8import gensim 9vectors = gensim.models.KeyedVectors.load("../data/chive-1.2-mc5_gensim/chive-1.2-mc5.kv") 10# word2vecのインポート 11from gensim.models import Word2Vec 12# プロットに必要なものをインポート 13import matplotlib.pyplot as plt # 図のプロット 14from sklearn.decomposition import PCA # N次元のベクトルをプロットできるよう2次元ベクトルに圧縮 15 16# 単語の元となるテキストデータを検索 17paths = glob.glob('../stopword/*.txt') 18 19# デフォルトの事象をロード 20nlp = spacy.load('ja_ginza_electra') 21# 2次元配列の初期値を指定([[],[],…,[]←10個の状態]) 22word_list = [[] for i in range(len(paths))] 23 24# テキストを会社ごとかつ単語ごとに分けて2次元配列として取得 25for i,path in enumerate(paths): 26 # plotする会社名+単語名にするための会社名を用意 27 company = path.replace("../stopword/","") 28 company_name = company.replace(".txt","") 29 vec = [] 30 with open(path, 'r') as f: 31 # 1行ずつ読み込み 32 text = f.read().split('\n') 33 # 空文字のlistを除去 34 text = list(filter(None, text)) 35 # doc = 36 # 1行のtextから一つの単語を持ってきてその中の単語をwordとして代入 37 for j,word in enumerate(text): 38 words = word.split(",")[0] 39 # 2次元配列で、会社ごとの単語を分けて追加する 40 word_list[i].append(words) 41 42 43# 会社それぞれの単語のベクトル化 44model = Word2Vec(word_list, min_count=0, sg=1) 45# モデルの保存 46model.save("word2vec.model") 47# 読み込み 48model = Word2Vec.load("word2vec.model") 49 50# 単語のベクトル化とプロット 51vec_words = [] 52for i,path in enumerate(paths): 53 for l,word in enumerate(word_list[i]): 54 # プロットする単語の設定 55 vec_words.append([word,"k"])# プロットする値を追加:変数名.append(["値","色(k:黒)"]) 56 # 別の単語設定方法 57 # print(word2vec_model.wv.index_to_key[]) 58 # for s in word2vec_model.mv.index_to_key[]: 59 length = len(vec_words) 60 print(length) 61 data = [] 62#%% 63 # プロットするためのdataの登録 64 j = 0 65 while j < length: 66 data.append(model[vec_words[j][0]]) 67 j += 1 68 69 # 主成分分析(PCA)により2次元に圧縮 70 pca = PCA(n_components=2) 71 pca.fit(data) 72 data_pca = pca.transform(data) 73 74 length_data = len(data_pca) 75 76 # プロットの設定 77 fig = plt.figure(figsize=(10,6),facecolor='w') 78 79 plt.rcParams["font.size"] = 10 80 k = 0 81 for company in company_name: 82 while k < length_data: 83 # 点プロット 84 plt.plot(data_pca[k][0], data_pca[k][1], ms=5.0, zorder=2, marker="・", color=vec_words[k][1]) 85 86 #文字プロット 87 plt.annotate(company + '_' + vec_words[k][0], (data_pca[k][0], data_pca[k][1]), size=12) 88 89 k += 1 90 91 plt.show() 92
自分で試したこと
ここに問題・エラーに対して試したことを記載してください。
・gensimのバージョンアップにより、どこかのコードが使えなくなっているのかと思い、調べましたが、原因は掴めずでした。何卒よろしくお願いいたします
参考サイト
https://radimrehurek.com/gensim/models/word2vec.html
https://gist.github.com/jshirius/0682042101b80cd77a490f1ef5bda07f
あなたの回答
tips
プレビュー