Ответ 1
Две части ответа: как получить ярлыки слов и как построить надписи на диаграмме рассеяния.
Ярлыки Word в gensim word2vec
model.wv.vocab
является типом {word: object of numeric vector}. Чтобы загрузить данные в X
для t-SNE, я сделал одно изменение.
vocab = list(model.wv.vocab)
X = model[vocab]
Это выполняет две вещи: (1) он дает вам отдельный список vocab
для окончательной диаграммы данных для построения, и (2) когда вы индексируете model
, вы можете быть уверены, что знаете порядок слов.
Действуйте по-прежнему с помощью
tsne = TSNE(n_components=2)
X_tsne = tsne.fit_transform(X)
Теперь поставьте X_tsne
вместе с списком vocab
. Это легко с pandas, поэтому import pandas as pd
, если этого еще нет.
df = pd.DataFrame(X_tsne, index=vocab, columns=['x', 'y'])
Теперь слова vocab являются индексами кадра данных.
У меня нет вашего набора данных, но в другом SO, который вы упомянули, пример df
, который использует группы новостей sklearn, будет выглядеть примерно так:
x y
politics -1.524653e+20 -1.113538e+20
worry 2.065890e+19 1.403432e+20
mu -1.333273e+21 -5.648459e+20
format -4.780181e+19 2.397271e+19
recommended 8.694375e+20 1.358602e+21
arguing -4.903531e+19 4.734511e+20
or -3.658189e+19 -1.088200e+20
above 1.126082e+19 -4.933230e+19
разброс точек
Мне нравится объектно-ориентированный подход к matplotlib, так что это начинается немного иначе.
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.scatter(df['x'], df['y'])
Наконец, метод annotate
будет обозначать координаты. Первые два аргумента - текстовая метка и 2-кортеж. Используя iterrows()
, это может быть очень кратким:
for word, pos in df.iterrows():
ax.annotate(word, pos)
[Спасибо Рикардо в комментариях к этому предложению.]
Затем сделайте plt.show()
или fig.savefig()
. В зависимости от ваших данных вам, вероятно, придется столкнуться с ax.set_xlim
и ax.set_ylim
, чтобы увидеть в плотном облаке. Это пример группы новостей без каких-либо настроек:
Вы также можете изменить размер, цвет и т.д. Счастливая тонкая настройка!