Python – 计算词向量(word2vec)的层次聚类并以树状图形式展示结果

我使用领域文本语料库生成了一个100维的词向量模型,并合并了常见短语,例如(good bye => good_bye)。然后我提取了1000个所需词的向量。

因此,我有了一个包含1000个numpy.array的数组,如下所示:

[[-0.050378,0.855622,1.107467,0.456601,...[100 dimensions], [-0.040378,0.755622,1.107467,0.456601,...[100 dimensions], ... ...[1000 Vectors]]

以及一个单词数组,如下所示:

["hello","hi","bye","good_bye"...1000]

我已经对数据进行了K-Means聚类,得到的结果是合理的:

X = np.array(words_vectors)kmeans = KMeans(n_clusters=20, random_state=0).fit(X)for idx,l in enumerate(kmeans.labels_):    print(l,words[idx])--- Output ---0 hello0 hi1 bye1 good_bye

0 = 问候 1 = 告别

然而,一些词让我觉得层次聚类更适合这个任务。我尝试使用了AgglomerativeClustering,可惜…对于这个Python新手来说,事情变得复杂,我迷失了方向。

我该如何聚类我的向量,使输出大致像这个维基页面上的树状图那样?enter image description here


回答:

直到现在我也有同样的问题!每次在线搜索(关键词 = 词向量上的层次聚类)总能找到你的帖子。我不得不给你一个可能有效的解决方案。

sentences = ['hi', 'hello', 'hi hello', 'goodbye', 'bye', 'goodbye bye']sentences_split = [s.lower().split(' ') for s in sentences]import gensimmodel = gensim.models.Word2Vec(sentences_split, min_count=2)from matplotlib import pyplot as pltfrom scipy.cluster.hierarchy import dendrogram, linkagel = linkage(model.wv.syn0, method='complete', metric='seuclidean')# calculate full dendrogramplt.figure(figsize=(25, 10))plt.title('Hierarchical Clustering Dendrogram')plt.ylabel('word')plt.xlabel('distance')dendrogram(    l,    leaf_rotation=90.,  # rotates the x axis labels    leaf_font_size=16.,  # font size for the x axis labels    orientation='left',    leaf_label_func=lambda v: str(model.wv.index2word[v]))plt.show()

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注