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個質心中每一個的距離。

 

然后選取距離最近的那個星團作為,這樣經過第一步每一個星星都有了所屬的星團;第二步對於每一個星團,重新計算它的質心(對里面所有的星星坐標求平均)。重復迭代第一步和第二步直到質心不變或者變化很小。

 

來源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM