第八天学习进度--Kmeans的应用之文本聚类
文本的聚类,就是为了解决大批量文本的自动分类的问题。
之前遇到过这样一个问题,就是有一堆文章的数据,想要得到这些文章对应的类别。但是这堆文章的数据里面并没有分类的信息,要是按照传统方式,需要人工对每篇文章都进行分类处理,但是这样的分类处理的速度太慢了,而且对于人工来说,工作量也是极其庞大的。是典型的吃力不讨好的一个活,那么有没有什么方法能够对这些数据进行简单的自动聚类呢,也就是无监督对这些文本进行分类。这个时候就要用到Kmeans算法了。
Kmeans就是指K均值聚类算法,本质上为一种无监督的分类算法,是将预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心的一种算法。而每个分配给离他最近的聚类中心的对象就都为一个种类。将文章转化为tf-idf或者对应的词向量之后,就能通过Kmeans来对这些文章做无监督的自动聚类了。
Kmeans一般的过程为:
-
在样本中随机选取k个样本点充当各个簇的中心点
-
计算所有样本点与各个簇中心之间的距离 ,然后把样本点划入最近的簇中
-
根据簇中已有的样本点,重新计算簇中心
-
重复2、3过程
在python中使用文本聚类是一个简单的过程,sklearn中为我们提供了Kmeans的模块
只需导入对应的Kmeans模块即可使用相应的功能
from sklearn.cluster import KMeans
接下来需要构建词向量或者tf-idf,这里我们选择词向量
sklearn同时为我们提供了对应词向量构建的模块CountVectorizer
导入对应的CountVectorizer即可使用
from sklearn.feature_extraction.text import CountVectorizer
接下来调用封装好的相应函数功能即可
count_vec=CountVectorizer(stop_words=stopwords) #stopwords是停用词列表 km_matrix= count_vec.fit_transform(wordlist) #wordlist是以空格为分隔的字符串列表,如['不 开心','很 开心'] num_clusters = 10 #聚为10类,可根据需要修改,聚类的数量需小于最大分类后的数量 km = KMeans(n_clusters=num_clusters) km.fit(km_matrix) clusters = km.labels_.tolist()
对应的clusters就是对应wordlist的分类后的类别列表了(以0-num_clusters为范围)