Как применить t-SNE на модели Word2Vec
Я работаю над анализом настроений в Amazon Food Reviews и пытаюсь применить Word2Vec к обзорам и визуализировать его с помощью t-SNE.
Я легко смог визуализировать, используя пакет слов, представляющий то же самое, используя следующий код:
from sklearn.manifold import TSNE
data_2000 = final_counts[0:2000,:]
top_2000 = data_2000.toarray()
labels = final['Score']
labels_2000 = labels[0:2000]
model = TSNE(n_components=2, random_state=0)
tsne_data = model.fit_transform(top_2000)
# creating a new data frame which help us in ploting the result
tsne_data = np.vstack((tsne_data.T, labels_2000)).T
tsne_df = pd.DataFrame(data=tsne_data, columns=("Dim_1", "Dim_2",
"label"))
# Ploting the result of tsne
sns.FacetGrid(tsne_df, hue="label", size=6).map(plt.scatter,
'Dim_1', 'Dim_2').add_legend()
plt.show()
Кроме того, тот же код не работает, когда я кормить модель w2v_model, которая имеет тип gensim.models.word2vec.Word2Vec
Я получил модель, используя следующий код:
w2v_model=gensim.models.Word2Vec(list_of_sent,min_count=5,size=50,
workers=4)
1 ответ
Вам нужно извлечь все вложения слов после обучения модели. Я бы порекомендовал извлечение в pd.DataFrame следующим образом:
all_vocab = list(w2v_model.wv.vocab.keys())
data_dict = {word: w2v_model.wv[word] for word in all_vocab}
result = pd.DataFrame(data=data_dict).transpose()
Если затем вы хотите уменьшить размерность в Scikit, просто получите доступ к массиву вложений через result.values
from torchtext import vocab
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
glove = vocab.GloVe(name = '6B', dim = 100)
print(f'There are {len(glove.itos)} words in the vocabulary')
def tsne_plot(glove,n=200,n_components=2):
"Creates and TSNE model and plots it"
labels = []
tokens = []
for word , tensor_value in zip(glove.itos[:n],glove.vectors[:n]):
tokens.append(tensor_value.numpy())
labels.append(word)
tsne_model = TSNE(perplexity=40, n_components=n_components, init='pca', n_iter=2500, random_state=23)
new_values = tsne_model.fit_transform(tokens)
fig = plt.figure(figsize=(16, 16))
if n_components==3:
ax = fig.add_subplot(111, projection='3d')
ax.scatter(new_values[:,0],new_values[:,1],new_values[:,2],c="r",marker="o")
for i in range(len(new_values)):
ax.text(new_values[i][0],new_values[i][1],new_values[i][2],labels[i])
else:
plt.scatter(new_values[:,0],new_values[:,1])
for i in range(len(new_values)):
plt.annotate(labels[i],
xy=(new_values[i][0],new_values[i][1]),
xytext=(5, 2),
textcoords='offset points',
ha='right',
va='bottom')
return new_values,labels
new_values,labels = tsne_plot(glove,n_components=2)