python用kemeans对关键词进行分类

#计算关键词的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个质心中每一个的距离。

然后选取距离最近的那个星团作为,这样经过第一步每一个星星都有了所属的星团;第二步对于每一个星团,重新计算它的质心(对里面所有的星星坐标求平均)。重复迭代第一步和第二步直到质心不变或者变化很小。

来源

原文地址:https://www.cnblogs.com/zlj843767688/p/12555795.html