我正在使用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的单词分数,我们如何根据单个单词而不是整个文档的分数来管理文档?或许也可以这样做.有人向我解释这背后的概念吗?
解决方法
您应该看一下
Kmeans algorithm的工作原理.首先,停用词永远不会使其矢量化,因此被Kmeans完全忽略,并且对文档的聚类方式没有任何影响.现在假设你有:
sentence_list=["word1","word2","word2 word3"]
让我们说你想要2个集群.在这种情况下,您希望第二个和第三个文档位于同一个集群中,因为它们共享一个共同的单词.让我们看看这是如何发生的.
docs矢量化的数字表示如下所示:
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]
现在,如果计算从每个点(文档)到两个质心中的每一个的距离,您将看到:
>文档1的距离为0到质心1,因此它属于质心1
>文档3的距离为0到质心2,因此它属于质心2
最后,我们计算剩余文档2和每个质心之间的距离,以找出它属于哪一个:
>>> from scipy.spatial.distance import euclidean >>> euclidean([0,1,0],[1,0]) # dist(doc2,centroid1) 1.4142135623730951 >>> euclidean([0,[0,0.795961]) # dist(doc2,centroid2) 0.8884272507056005
因此第二个文档和第二个质心更接近,这意味着第二个文档被分配给第二个质心.