绘图函数 word2vec 错误“Word2Vec”对象不可下标

问题描述

我有我的 word2vec 模型。 我可以使用它来查看最相似的单词。 现在我创建了一个函数来将单词绘制为向量。 这是我的功能

def tsne_plot(model):

    labels = []
    tokens = []

    for word in model.wv.key_to_index:
        tokens.append(model[word])
        labels.append(word)
    
    tsne_model = TSNE(perplexity=40,n_components=2,init='pca',n_iter=2500,random_state=23)
    new_values = tsne_model.fit_transform(tokens)

    x = []
    y = []
for value in new_values:
    x.append(value[0])
    y.append(value[1])
    
plt.figure(figsize=(16,16)) 
for i in range(len(x)):
    plt.scatter(x[i],y[i])
    plt.annotate(labels[i],xy=(x[i],y[i]),xytext=(5,2),textcoords='offset points',ha='right',va='bottom')
plt.show()

当我调用函数时,出现以下错误

TypeError                                 Traceback (most recent call last)
<ipython-input-47-d0f4ea6902bf> in <module>
----> 1 tsne_plot(model)

<ipython-input-46-b4714ffe935b> in tsne_plot(model)
      5 
      6     for word in model.wv.key_to_index:
----> 7         tokens.append(model[word])
      8         labels.append(word)
      9 

TypeError: 'Word2Vec' object is not subscriptable

我真的不知道如何消除这个错误。我认为这可能是因为最新版本的 Gensim 不使用数组 [...]。 感谢提前!

解决方法

在 Gensim 4.0 中,Word2Vec 对象本身不再可以直接下标访问每个单词。相反,您应该通过其附属 .wv 属性访问单词,该属性包含类型为 KeyedVectors 的对象。

因此,将 model[word] 替换为 model.wv[word],您应该可以开始使用了。