#计算关键词的tfidf from sklearn.cluster import KMeans import pymysql def mysql(): db = pymysql.connect(host='localhost', user='root', passwd='199126', db='kettle', port=3306, charset='utf8') cursor = db.cursor() sql1 = "SELECT guanjianci,id,jianjie FROM keji3_copy1 " cursor.execute(sql1) alldata = cursor.fetchall() corpus = [] for s in alldata: guanjian = s[0] id = s[1] jianjie=s[2] corpus.append(jianjie) return corpus def update(i,a): db = pymysql.connect(host='localhost', user='root', passwd='199126', db='kettle', port=3306, charset='utf8') cursor = db.cursor() try: sql1 = "UPDATE keji3 SET fenlei ='%s' where id = %s" % (i, a) cursor.execute(sql1) # 提交到数据库执行 db.commit() except: print("2") # 打印结果 print(i,a) # !/usr/bin/env python # -*- coding: utf-8 -*- ''' Author: razrlele Email: razrlele@gmail.com ''' import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.cluster import KMeans def jieba_tokenize(text): return jieba.lcut(text) tfidf_vectorizer = TfidfVectorizer(tokenizer=jieba_tokenize, lowercase=False) ''' tokenizer: 指定分词函数 lowercase: 在分词之前将所有的文本转换成小写,因为涉及到中文文本处理, 所以最好是False ''' text_list = mysql() # 需要进行聚类的文本集 tfidf_matrix = tfidf_vectorizer.fit_transform(text_list) num_clusters = 20 km_cluster = KMeans(n_clusters=num_clusters, max_iter=300, n_init=40, init='k-means++', n_jobs=-1) ''' 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) a=0 for i in result: a=a+1 update(i,a)
对于kemeans的使用,我的理解是
1)随机选择k个样本作为初始簇类的均值向量;
2)将每个样本数据集划分离它距离最近的簇;
3)根据每个样本所属的簇,更新簇类的均值向量;
4)重复(2)(3)步,当达到设置的迭代次数或簇类的均值向量不再改变时,模型构建完成,输出聚类算法结果。
K-means算法是将样本聚类成k个簇(cluster),具体算法描述如下:
1、 随机选取k个聚类质心点(cluster centroids)为。 2、 重复下面过程直到收敛 { 对于每一个样例i,计算其应该属于的类
对于每一个类j,重新计算该类的质心
} |
K是我们事先给定的聚类数,代表样例i与k个类中距离最近的那个类,的值是1到k中的一个。
质心代表我们对属于同一个类的样本中心点的猜测,拿星团模型来解释就是要将所有的星星聚成k个星团,首先随机选取k个宇宙中的点(或者k个星星)作为k个星团的质心,然后第一步对于每一个星星计算其到k个质心中每一个的距离。
然后选取距离最近的那个星团作为,这样经过第一步每一个星星都有了所属的星团;第二步对于每一个星团,重新计算它的质心(对里面所有的星星坐标求平均)。重复迭代第一步和第二步直到质心不变或者变化很小。