如何查看聚类基于哪些词
How to see on what words the clusters were based on
我正在使用此代码对我的文档进行聚类。
图形输出如下所示:
我正在尝试完成一种打印出集群所基于的最常见单词的方法。 gensim d2v 可以吗?
kmeans_model = KMeans(n_clusters=3, init='k-means++', max_iter=100)
X = kmeans_model.fit(d2v_model.dv.vectors)
labels=kmeans_model.labels_.tolist()
l = kmeans_model.fit_predict(d2v_model.dv.vectors)
pca = PCA(n_components=2).fit(d2v_model.dv.vectors)
datapoint = pca.transform(d2v_model.dv.vectors)
data['cluster'] = kmeans_model.labels_
clusters = data.groupby('cluster')
for i, cluster in enumerate(clusters.groups):
with open('cluster'+str(cluster)+ '.csv', 'w', encoding="utf-8", newline='') as f:
data = data.replace(r'\r+|\n+|\t+',' ', regex=True)
data = clusters.get_group(cluster)[['NR_SOLICITACAO','DS_ANALISE','PRE_PROCESSED']] # get title and overview columns
f.write(data.to_csv(index_label='id')) # set index to id
import matplotlib.pyplot as plt
label1 = ["#0000FF", "#006400", "#FFFF00", "#CD5C5C", "#FF0000", "#FF1493"]
color = [label1[i] for i in labels]
plt.scatter(datapoint[:, 0], datapoint[:, 1], c=color)
centroids = kmeans_model.cluster_centers_
centroidpoint = pca.transform(centroids)
plt.scatter(centroidpoint[:, 0], centroidpoint[:, 1], marker='^', s=150, c='#000000')
plt.show()
您似乎正在使用 Gensim Doc2Vec
模型('Paragraph Vectors' 算法),并且您的代码显示了根据 .dv
属性 计算的聚类。那是 full-document 向量,而不是单个 word-vectors.
如此派生的聚类不会与(例如)LDA 主题可能具有的单个词具有相同类型的直接可报告关系。在那里,LDA模型本身可以直接报告一个词所暗示的主题,或者最能说明一个主题的词。
但是您可以通过间接方式探查个人 word-tokens 与您的群体之间的相似关系。是否有任何能为您的需求提供可接受的结果,您必须尝试和评估。一些可能性:
直接调查 sets-of-documents:您可以简单地单独计算每个集群中的所有单词 - 就像整个集群一样是一份文件。然后在每个集群中选择 most-distinct 的单词。这可以很简单,如按每个词组中出现的次数对所有词进行顺序排序,并报告其在一个词组中的排名比其他词中的同一个词排名最高 'higher' 的词。或者,您可以使用 term-importance 的其他度量,例如 TF-IDF.
Doc-vectors 到 word-vector 相关性:如果您使用 Doc2Vec
模式,该模式也训练 word-vectors 同时 – 例如 PV-DM 模式 (dm=1
), 或者使用 PV-DBOW (dm=0
) 同时添加 non-default dbow_words=1
参数——那么模型的 d2v_model.wv
属性 将在兼容坐标 space.
中具有有效的 word-vectors
因此,您可以查找 similar-to 聚类质心点或 similar-to 每个聚类(甚至可能是每个文档)的较大子集的单词,以获得words-that-may-be-descriptive.
您可以通过使用 doc-vectors 对 .wv
集 word-vectors 执行 .most_similar()
来执行此操作(无论是针对完整文档,还是针对cluster) 作为 positive
个示例。例如:
words_near_one_doc = d2v_model.wv.most_similar(positive=[doc_vec1])
...或...
words_near_centroid_of_3_docs = d2v_model.wv.most_similar(positive=[doc_vec1, doc_vec2, doc_vec3])
- 使用合成文档进行探索,例如 one-word 文档,或被单词扰乱的真实文档 additions/removals:您可以检查您的词汇表,然后使用
Doc2Vec
模型为每个只有一个单词的合成文档推断新的 doc-vectors。 (考虑更多 epochs
,因为文档缺乏正常大小,这会在确定向量之前提示大量训练,并记住这种不自然的过程,如果没有真实文档的正常变化,可能会产生奇怪的结果) .查看那些退化的文档案例在您的 pre-existing 集群中的位置,并将它们视为标签。或者类似地,获取现有文档——可能是那些特别靠近集群之间边界的文档——并尝试从中提取 adding/removing 个单词,以及 re-inferring 个新向量。查看哪些词最强烈 'move' 文档或 away-from 您现有的集群,并考虑将这些词用作正面或负面标签。
我正在使用此代码对我的文档进行聚类。
图形输出如下所示:
kmeans_model = KMeans(n_clusters=3, init='k-means++', max_iter=100)
X = kmeans_model.fit(d2v_model.dv.vectors)
labels=kmeans_model.labels_.tolist()
l = kmeans_model.fit_predict(d2v_model.dv.vectors)
pca = PCA(n_components=2).fit(d2v_model.dv.vectors)
datapoint = pca.transform(d2v_model.dv.vectors)
data['cluster'] = kmeans_model.labels_
clusters = data.groupby('cluster')
for i, cluster in enumerate(clusters.groups):
with open('cluster'+str(cluster)+ '.csv', 'w', encoding="utf-8", newline='') as f:
data = data.replace(r'\r+|\n+|\t+',' ', regex=True)
data = clusters.get_group(cluster)[['NR_SOLICITACAO','DS_ANALISE','PRE_PROCESSED']] # get title and overview columns
f.write(data.to_csv(index_label='id')) # set index to id
import matplotlib.pyplot as plt
label1 = ["#0000FF", "#006400", "#FFFF00", "#CD5C5C", "#FF0000", "#FF1493"]
color = [label1[i] for i in labels]
plt.scatter(datapoint[:, 0], datapoint[:, 1], c=color)
centroids = kmeans_model.cluster_centers_
centroidpoint = pca.transform(centroids)
plt.scatter(centroidpoint[:, 0], centroidpoint[:, 1], marker='^', s=150, c='#000000')
plt.show()
您似乎正在使用 Gensim Doc2Vec
模型('Paragraph Vectors' 算法),并且您的代码显示了根据 .dv
属性 计算的聚类。那是 full-document 向量,而不是单个 word-vectors.
如此派生的聚类不会与(例如)LDA 主题可能具有的单个词具有相同类型的直接可报告关系。在那里,LDA模型本身可以直接报告一个词所暗示的主题,或者最能说明一个主题的词。
但是您可以通过间接方式探查个人 word-tokens 与您的群体之间的相似关系。是否有任何能为您的需求提供可接受的结果,您必须尝试和评估。一些可能性:
直接调查 sets-of-documents:您可以简单地单独计算每个集群中的所有单词 - 就像整个集群一样是一份文件。然后在每个集群中选择 most-distinct 的单词。这可以很简单,如按每个词组中出现的次数对所有词进行顺序排序,并报告其在一个词组中的排名比其他词中的同一个词排名最高 'higher' 的词。或者,您可以使用 term-importance 的其他度量,例如 TF-IDF.
Doc-vectors 到 word-vector 相关性:如果您使用
中具有有效的 word-vectorsDoc2Vec
模式,该模式也训练 word-vectors 同时 – 例如 PV-DM 模式 (dm=1
), 或者使用 PV-DBOW (dm=0
) 同时添加 non-defaultdbow_words=1
参数——那么模型的d2v_model.wv
属性 将在兼容坐标 space.
因此,您可以查找 similar-to 聚类质心点或 similar-to 每个聚类(甚至可能是每个文档)的较大子集的单词,以获得words-that-may-be-descriptive.
您可以通过使用 doc-vectors 对 .wv
集 word-vectors 执行 .most_similar()
来执行此操作(无论是针对完整文档,还是针对cluster) 作为 positive
个示例。例如:
words_near_one_doc = d2v_model.wv.most_similar(positive=[doc_vec1])
...或...
words_near_centroid_of_3_docs = d2v_model.wv.most_similar(positive=[doc_vec1, doc_vec2, doc_vec3])
- 使用合成文档进行探索,例如 one-word 文档,或被单词扰乱的真实文档 additions/removals:您可以检查您的词汇表,然后使用
Doc2Vec
模型为每个只有一个单词的合成文档推断新的 doc-vectors。 (考虑更多epochs
,因为文档缺乏正常大小,这会在确定向量之前提示大量训练,并记住这种不自然的过程,如果没有真实文档的正常变化,可能会产生奇怪的结果) .查看那些退化的文档案例在您的 pre-existing 集群中的位置,并将它们视为标签。或者类似地,获取现有文档——可能是那些特别靠近集群之间边界的文档——并尝试从中提取 adding/removing 个单词,以及 re-inferring 个新向量。查看哪些词最强烈 'move' 文档或 away-from 您现有的集群,并考虑将这些词用作正面或负面标签。