matplotlib 是否有一种方法将LDA gensim与TSNE结合使用?

dly7yett  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(114)

我创建了一个gensim LDA模型,我想在TSNE这样的图中呈现聚类词:

from gensim.models import LdaModel,lsimodel
dictionary = Dictionary(all_texts)
corpus = [dictionary.doc2bow(text) for text in all_texts]
lda_model = LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, alpha="auto",per_word_topics=True,random_state=42)

我创建了一个函数来绘制单词

from sklearn.manifold import TSNE
from bokeh.plotting import figure, output_file, show
from bokeh.models import Label
from bokeh.io import output_notebook
    
# Get topic weights
topic_weights = []
for i, row_list in enumerate(lda_model[corpus]):
    topic_weights.append([w for i, w in row_list[0]])
    
# Array of topic weights    
arr = pd.DataFrame(topic_weights).fillna(0).values
    
# Keep the well separated points (optional)
arr = arr[np.amax(arr, axis=1) > 0.35]
    
# Dominant topic number in each doc
topic_num = np.argmax(arr, axis=1)
    
# tSNE Dimension Reduction
tsne_model = TSNE(n_components=2, verbose=1, random_state=0, angle=.99, init='pca')
tsne_lda = tsne_model.fit_transform(arr)
    
# Plot the Topic Clusters using Bokeh
output_notebook()
n_topics = 10
mycolors = np.array([color for name, color in mcolors.TABLEAU_COLORS.items()])
plot = figure(title="t-SNE Clustering of {} LDA Topics".format(n_topics), 
              plot_width=1500, plot_height=800)
plot.scatter(x=tsne_lda[:,0], y=tsne_lda[:,1], color=mycolors[topic_num])
    
    
from bokeh.models import ColumnDataSource
    
# Obtenir les mots dominants pour chaque cluster
dominant_words = []
for i in range(n_topics):
    topic_words = lda_model.show_topic(i, topn=6)  # Changer le nombre de mots dominants à afficher ici
    words = ", ".join([word for word, _ in topic_words])
    dominant_words.append(words)
    
# Créer une source de données pour la légende
legend_source = ColumnDataSource(data=dict(
    topic_num=[str(i) for i in range(n_topics)],
    color=mycolors[:n_topics],
    words=dominant_words
))
    
# Ajouter les cercles de légende avec les couleurs et les mots
plot.circle(x=0, y=0, fill_color='color', line_color=None, size=10, legend_field='words', source=legend_source)
    
# Afficher la légende
plot.legend.title = "Clusters"
plot.legend.location = "top_left"
plot.legend.label_text_font_size = "12pt"
    
show(plot)

问题是,我想呈现单词的标签而不是点,并且我希望图中单词的大小等于单词在语料库中出现的次数
现在的图表是这样的:

kuuvgm7e

kuuvgm7e1#

Bokeh为您提供具有text_font_size属性的text渲染器。有了这个,你可以把文本放在一个定义的位置,应用一种颜色和改变大小。
下面的示例改编自文档中的文本示例。

import numpy as np

from bokeh.plotting import show, figure, output_notebook
from bokeh.models import ColumnDataSource
from bokeh.palettes import d3

output_notebook()
N = 9
x = np.linspace(-2, 2, N)
y = x**2
a = "abcdefghijklmnopqrstuvwxyz"
text = [a[i*3:i*3+3] for i in range(N)]

source = ColumnDataSource(
    dict(
        x=x,
        y=y,
        text=text,
        color=d3["Category10"][N],
        size=[f'{i}px' for i in range(10,10+N)]
    )
)

p = figure(width=300, height=300)
p.text(
    x="x",
    y="y",
    text="text",
    angle=0.3,
    text_color="color",
    text_font_size="size",
    source=source
)
show(p)

我希望这能帮助你解决你的问题。

相关问题