我正在使用scikit learn的Kmeans算法来整理评论。
sentence_list=['hello how are you', "I am doing great", "my name is abc"]
vectorizer=TfidfVectorizer(min_df=1, max_df=0.9, stop_words='english', decode_error='ignore')
vectorized=vectorizer.fit_transform(sentence_list)
km=KMeans(n_clusters=num_clusters, init='k-means++',n_init=10, verbose=1)
km.fit(vectorized)
当我打印矢量化的输出时,它给出了单词的索引和索引的tf-idf分数。
所以我很想知道,鉴于我们只获得了tfidf的单词分数,我们如何根据单个单词而不是整个文档的分数来管理文档?或者也许这样做。有人向我解释这背后的概念吗?
答案 0 :(得分:10)
您应该看看Kmeans algorithm的工作原理。首先,停用词永远不会进入vectorized
,因此被Kmeans完全忽略,并且对文档的聚类方式没有任何影响。现在假设你有:
sentence_list=["word1", "word2", "word2 word3"]
让我们说你想要2个集群。在这种情况下,您希望第二个和第三个文档位于同一个集群中,因为它们共享一个共同的单词。让我们看看这是如何发生的。
文档vectorized
的数字表示如下:
word1 word3 word2
1 0.000000 0.000000 # doc 1
0 1.000000 0.000000 # doc 2
0 0.605349 0.795961 # doc 3
在Kmeans的第一步中,从数据中选择随机一些质心,例如,文档1和文档3将是初始质心:
Centroid 1: [1, 0.000000, 0.000000]
Centroid 2: [0, 0.605349, 0.795961]
现在,如果你计算从每个点(文档)到两个质心中的每一个的距离,你会看到:
最后,我们计算剩余文档2与每个质心之间的距离,以找出它属于哪一个:
>>> from scipy.spatial.distance import euclidean
>>> euclidean([0, 1, 0], [1, 0, 0]) # dist(doc2, centroid1)
1.4142135623730951
>>> euclidean([0, 1, 0], [0, 0.605349, 0.795961]) # dist(doc2, centroid2)
0.8884272507056005
因此第二个文档和第二个质心更接近,这意味着第二个文档被分配给第二个质心。
答案 1 :(得分:1)
TF / IDF是一种度量,用于计算文档中单词相对于该文档中其余单词的重要性。它不计算独立单词的重要性。 (这是有道理的,对吗?因为重要性总是意味着对其他人的特权!)。因此,每个单词的TF / IDF实际上是文档相对于单词的重要度量。
我不知道你的代码中使用了TF / IDF的位置。但是,可以使用TF / IDF分数作为特征来计算kmeans算法。此外,您提到的三个示例文档的聚类根本不可能,而没有两个文档有一个共同的单词!
编辑1:首先,如果单词' cat'在两个文档中,它们可能聚集在一起(取决于两个文档中的其他文字以及其他文档)。其次,你应该学习更多关于k-means的知识。您可以看到,kmeans使用功能将文档聚合在一起,文档中每个单词的每个tf / idf分数都是一个特征度量,用于将该文档与语料库中的其他文档进行比较。