K-means是一种常用的聚类算法,入门版展示如下,代码传送门:
# -*- coding: utf-8 -*-
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from sklearn.externals import joblib
def jieba_tokenize(text):
return jieba.lcut(text)
tfidf_vectorizer = TfidfVectorizer(tokenizer=jieba_tokenize,lowercase=False)
'''
tokenizer: 指定分词函数
lowercase: 在分词之前将所有的文本转换成小写,因为涉及到中文文本处理,
所以最好是False
'''
text_list = ["今天天气真好啊啊啊啊",
"小明上了清华大学",
"我今天拿到了Google的Offer",
"清华大学在自然语言处理方面真厉害"]
#需要进行聚类的文本集
tfidf_matrix = tfidf_vectorizer.fit_transform(text_list)
num_clusters = 3
km_cluster = KMeans(n_clusters=num_clusters, max_iter=300, n_init=40,
init='k-means++')
'''
n_clusters: 指定K的值
max_iter: 对于单次初始值计算的最大迭代次数
n_init: 重新选择初始值的次数
init: 制定初始值选择的算法
n_jobs: 进程个数,为-1的时候是指默认跑满CPU
注意,这个对于单个初始值的计算始终只会使用单进程计算,
并行计算只是针对与不同初始值的计算。比如n_init=10,n_jobs=40,
服务器上面有20个CPU可以开40个进程,最终只会开10个进程
'''
#返回各自文本的所被分配到的类索引
result = km_cluster.fit_predict(tfidf_matrix)
print ("Predicting result: ", result)
'''
每一次fit都是对数据进行拟合操作,
所以我们可以直接选择将拟合结果持久化,
然后预测的时候直接加载,进而节省时间。
'''
结果图:
结果解释:
因为输入的是4个元素:
text_list = ["今天天气真好啊啊啊啊",
"小明上了清华大学",
"我今天拿到了Google的Offer",
"清华大学在自然语言处理方面真厉害"]
所以处理后也是出来4个结果与输入分别对应,那么聚类结果是第2句和第4句是一类,其余两句自成一派。
备注:本文代码系非原创的,因需要做文本聚类,几乎将博客里的关于这部分的代码都尝试了一遍,这份代码是没有报错的,感恩大神。