【机器学习】K-means文本聚类,python

K-means是一种常用的聚类算法,展示如下:

Created on 2016-01-06 @author: Eastmount

代码传送门:

# coding=utf-8  
""" 
Created on 2016-01-06 @author: Eastmount  
"""  
  
import time          
import re          
import os  
import sys
import codecs
import shutil
import numpy as np
from sklearn import feature_extraction  
from sklearn.feature_extraction.text import TfidfTransformer  
from sklearn.feature_extraction.text import CountVectorizer  
 
if __name__ == "__main__":
    
    #########################################################################
    #                           第一步 计算TFIDF
    
    #文档预料 空格连接
    corpus = []
    
    #读取预料 一行预料为一个文档
    for line in open('one1.txt', encoding = "utf-8").readlines():
        #print(line)
        corpus.append(line.strip())
    #print corpus
    #time.sleep(1)
    
    #将文本中的词语转换为词频矩阵 矩阵元素a[i][j] 表示j词在i类文本下的词频
    vectorizer = CountVectorizer()
 
    #该类会统计每个词语的tf-idf权值
    transformer = TfidfTransformer()
 
    #第一个fit_transform是计算tf-idf 第二个fit_transform是将文本转为词频矩阵
    tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
 
    #获取词袋模型中的所有词语  
    word = vectorizer.get_feature_names()
 
    #将tf-idf矩阵抽取出来,元素w[i][j]表示j词在i类文本中的tf-idf权重
    weight = tfidf.toarray()
 
    #打印特征向量文本内容
    print( 'Features length: ' + str(len(word)))
    resName = "BHTfidf_Result.txt"
    result = codecs.open(resName, 'w', 'utf-8')
    for j in range(len(word)):
        result.write(word[j] + ' ')
    result.write('

')
 
    #打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重  
    for i in range(len(weight)):
        #print( u"-------这里输出第",i,u"类文本的词语tf-idf权重------"  )
        for j in range(len(word)):
            #print( weight[i][j],)
            result.write(str(weight[i][j]) + ' ')
        result.write('

')
 
    result.close()
 
 
    ########################################################################
    #                               第二步 聚类Kmeans
 
    print( 'Start Kmeans:')
    from sklearn.cluster import KMeans
    clf = KMeans(n_clusters=10)
    s = clf.fit(weight)
    #print( s)
 
    #20个中心点
    print(clf.cluster_centers_)
    
    #每个样本所属的簇
    print(clf.labels_)
    i = 1
    while i <= len(clf.labels_):
        #print( i, clf.labels_[i-1])
        print(clf.labels_[i-1])
        i = i + 1
 
    #用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
    #print(clf.inertia_)

结果图:

结果解释:

文本文件中输入的有12段文本内容,所以处理后也是出来12个结果与输入分别对应。

那么聚类结果是第1段和第2段是一类,第5段和第7段是一类,剩余几段自成一派。

[0 0 6 4 3 9 3 5 1 8 2 7]

备注:本文代码系非原创的,因需要做文本聚类,几乎将博客里的关于这部分的代码都尝试了一遍,这份代码是没有报错的,感恩大神Eastmount。

原文地址:https://www.cnblogs.com/helenlee01/p/12617474.html