给出已经分好的英文数据集,数据集中没有重复的单词,进行文本聚类
聚类就是先把英文单词转化为向量,根据要聚成多少类,随机选择点,用欧氏距离或者余弦距离进行计算,把随机选择的中心点附近的点跟他归为一类,所以要先计算tdidf的值,
关于pycharm中kmeans包中的函数介绍
- n_clusters: 簇的个数,即你想聚成几类
- init: 初始簇中心的获取方法
- n_init: 获取初始簇中心的更迭次数,为了弥补初始质心的影响,算法默认会初始10个质心,实现算法,然后返回最好的结果。
- max_iter: 最大迭代次数(因为kmeans算法的实现需要迭代)
- tol: 容忍度,即kmeans运行准则收敛的条件
- precompute_distances:是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是True 会把整个距离矩阵都放到内存中,auto 会默认在数据样本大于featurs*samples 的数量大于12e6 的时候False,False 时核心实现的方法是利用Cpython 来实现的
- verbose: 冗长模式(不太懂是啥意思,反正一般不去改默认值)
- random_state: 随机生成簇中心的状态条件。
- copy_x: 对是否修改数据的一个标记,如果True,即复制了就不会修改数据。bool 在scikit-learn 很多接口中都会有这个参数的,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据。这个要理解Python 的内存机制才会比较清楚。
- n_jobs: 并行设置
- algorithm: kmeans的实现算法,有:’auto’, ‘full’, ‘elkan’, 其中 ‘full’表示用EM方式实现
- 虽然有很多参数,但是都已经给出了默认值。所以我们一般不需要去传入这些参数,参数的。可以根据实际需要来调用。
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(r'D:\实验室项目练习\Tweet').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 = r"D:\实验室项目练习\kmeans\tdidf.txt"
result = codecs.open(resName, 'w','utf-8')
for j in range(len(word)):
result.write(word[j] + ' ')
result.write('\r\n\r\n')
# 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(weight)):
print( u"-------这里输出第",i,"类文本的词语tf-idf权重------" )
for j in range(len(word)):
#print( weight[i][j],)
result.write(str(weight[i][j]) + ' ')
result.write('\r\n\r\n')
########################################################################
# 第二步 聚类Kmeans
print('Start Kmeans:')
from sklearn.cluster import KMeans
"""调用KMeans算法 进行聚类 ,分类"""
#clf = KMeans()
"""对数据进行拟合,训练模型"""
#clf.fit
clf = KMeans(n_clusters=300,max_iter=600)
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_)
这篇文章关于函数介绍的比较详细,贴在这里方便以后查找,之前记得找过一篇介绍函数的但是找不到了。。。。就把这个放这里吧/