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。