改善聚类结果

数据挖掘 Python scikit-学习 聚类
2022-02-23 18:43:10

我是一个初学者,我正在尝试对多句文本进行聚类,但我的结果很糟糕。有什么建议可以提高我的成绩吗?

import pandas
import pprint
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.metrics import adjusted_rand_score
from sklearn.feature_extraction.text import TfidfVectorizer

dataset = pandas.read_csv('text.csv', encoding = 'utf-8')

comments = dataset['comments']

comments_list = comments.values.tolist()

vetorize = TfidfVectorizer()
X = vetorize.fit_transform(comments_list)

clusters_number = 6
model = KMeans(n_clusters = clusters_number, init = 'k-means++', max_iter = 300, n_init = 1)

model.fit(X)

centers = model.cluster_centers_
labels = model.labels_

clusters = {}
for verbatim, label in zip(verbatim_list, labels):
    try:
        clusters[str(label)].append(verbatim)
    except:
        clusters[str(label)] = [verbatim]
pprint.pprint(clusters)

#Top terms for cluster
print("Top termos par cluster:")
ordem_centroides = model.cluster_centers_.argsort()[:, ::-1]
termos = vetorizar.get_feature_names()
for i in range(clusters_number):
    print ("Cluster %d:" % i,)
    for ind in ordem_centroides[i, :10]:
        print (' %s' % termos[ind],)
        print()

我在不同的集群中有许多不同的主题。我预处理了我的数据(停用词,小写,我删除了点...)。但我仍然在一个集群中“喜欢取消订单”,在另一个集群中“喜欢取消订单”。实际上,理想的情况是将所有“取消订单”加入一个集群中。

1个回答

我要说的一个非常明显的提示是,K-means 不是一般用于聚类文本数据的算法。文本数据的性质比结构化数据要复杂一些,在结构化数据上,K-means 是一种基本但仍然有效的算法(当然,它还取决于您对文本进行建模的方式,即如何将文本数据集转换为数字)。让我用一个提示提出两件事:

暗示

文档聚类也称为主题建模所以你真的需要看看这个,因为我假设你还没有(根据使用 k-means 解决这个问题)。现在我们看到了两种用于主题建模的标准算法,但我强烈建议您也查看其他算法。

NMF

非负矩阵分解是一种众所周知的非负矩阵分解方法,例如 TF-IDF 或其他词袋变体。您可以使用 SKLearn简单地将其应用于您的问题

低密度脂蛋白

潜在狄利克雷分配(不要被线性判别分析混淆)。这是一个非常标准的主题建模算法,可以在 SKLearn、Gensim、NLTK、Spacy 和其他 NLP/ML 库中找到实现。

希望它有所帮助!祝你好运 :)