質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

0回答

307閲覧

GINZA,word2vec,matplotlib,sklearnによる分散表現の2次元グラフへのプロット

shouta1717

総合スコア0

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2022/11/18 02:23

解決したいこと

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

https://github.com/WorksApplications/chiVe

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/11/18 04:43

Gensim 4.0 で Word2Vec インスタンスへの直接的なアクセスができなくなり、代替として .wv attribute が提供されています。なので、以下の様に変更すると動作するかもしれません。 data.append(word2vec_model[vec_words[j][0]]) => data.append(word2vec_model.wv[vec_words[j][0]])
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問