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

![clip_image010[6]](/image/aHR0cDovL21tYml6LnFwaWMuY24vbW1iaXpfcG5nL1F0UEl4azduT1ZkeUZhRDQ2VzlSSWxOejh4aWJ6a0duU2ExanJ4NTNEaWFQU1djNDlaeTJSNThTQjZyNGNkczg1V29hamF0aWNRQWpqV3RlYnRuWjJsNVlBLzY0MD93eF9mbXQ9cG5nJnRwPXdlYnAmd3hmcm9tPTUmd3hfbGF6eT0xJnd4X2NvPTE=.png)