摘要: 我正在使用tf-idf和k-means聚类进行文本聚类。我遵循了this article的做法。尽管我还没有完全了解集群方面的情况,但该概念目前仍适用于我的目的。
对我来说,主要目的是对每个文档进行聚类和标记,并在不阅读文档的情况下了解文档的含义。
代码:我正在使用下面的代码来完成代码,类似于本文。
vectorizer = TfidfVectorizer(
stop_words=stopwords,
max_df=0.8,
min_df=2,
ngram_range=(2, 2),
)
x = vectorizer.fit_transform([doc["text"] for doc in data])
n_clusters = len(data)
model = KMeans(
n_clusters=n_clusters, init="k-means++", max_iter=500, n_init=10
)
preds = model.fit_predict(x)
order_centroids = model.cluster_centers_.argsort()[:, ::-1]
terms = vectorizer.get_feature_names()
for i, pred in enumerate(preds):
ind = order_centroids[pred, :1]
print("Doc", i, "is related to:", terms[ind[0]])
简单输出:
Doc 0 is related to: flight ban
Doc 1 is related to: durable ergonomic
Doc 2 is related to: every element
Doc 3 is related to: zvartnots airport
Doc 4 is related to: zvartnots airport
Doc 5 is related to: line light
Doc 6 is related to: global interactive
Doc 7 is related to: fact mr
...
问题:我仅生成二元组(ngram_range=(2, 2)
)。问题是,尽管有些二元组是我的停用词,但它们的单字组却不是。例如。 “供水” 对我的情况可能没有意义,我想忽略它。但是“ water”和“ supply”一词可能对矢量化程序很有帮助,因此我不能单独将它们添加为停用词。我该如何忽略/添加一些双字母组作为停用词,使它们不再成为主题?
可选问题:您可能已经猜到,通过这种方法和现实生活中的数据,我发现了许多毫无意义的主题。我该如何“打分”这些主题,以便我只能挑选那些得分较高的主题?换句话说,如何过滤结果,以选择出真正适合集群的主题,例如“是的,此文档绝对属于该集群”?
建议。您只需使用文章中的文档即可生成最少的可复制示例。
编辑1:我尝试先拟合矢量化器,然后将一些双字停用词添加到矢量化器的停用词属性(vectorizer.stopwords_
,而不是vectorizer.stopwords
),然后尝试转换文档但是那没有用;我仍然看到作为主题添加的停用词。