本文实现代码也只是对以上博主博客的一个引用实现:

题目:读数据库,对文本进行聚类分析

代码分析:(完整代码在下方)

①确定k值

python按照文本相似度聚类 python中文文本聚类_应用推广

 

运行结果:

python按照文本相似度聚类 python中文文本聚类_应用推广_02

 

 ②由上图可以确定一个k值,修改

python按照文本相似度聚类 python中文文本聚类_python按照文本相似度聚类_03

 

 

python按照文本相似度聚类 python中文文本聚类_sql_04

 

 运行结果:

python按照文本相似度聚类 python中文文本聚类_python按照文本相似度聚类_05

 说明:数据库不便透露,数据格式如下txt文件:

python按照文本相似度聚类 python中文文本聚类_python按照文本相似度聚类_06

 

 

python按照文本相似度聚类 python中文文本聚类_python按照文本相似度聚类_07

python按照文本相似度聚类 python中文文本聚类_聚类分析_08

农业 三农 农机 农资
生物医药中间体 生产工艺 低聚硒酸软骨素
草皮
神经病理性疼痛 健康 养生
超声心动图 运动 心肌 健康
软件
沥青混凝土
残余应力 无缝管
果醋饮料 酿造工艺 饮料
艾滋病 梅毒感染 梅毒 传染病
养生 健康
复合材料
三农 农业 时政
火焰温度 锅炉
万向轴
电源
时政
焦炉煤气 净化公司
魔芋 时政
污水
铝合金 激光
科学 科普
防雷
畜牧业
棉花
时政
奶牛 三农 畜牧业
时政 于桥水库
级配碎石
三农 畜牧业 池塘
草皮 土壤结构 三农 农业 种植业
环境污染
硫化工艺 乳胶
吸收系数
多糖
秸秆
环境污染 时政
葡萄
真空机组 真空系统
白灵菇 杏鲍菇
豆乳
时政
变压器油
预应力 波纹管
地下空间
时政
钻井液
钻井液 环境保护
钻井液
时政
钻井液
时政
沥青混凝土
丹参 中药 三倍体
沼气 水污染
三农 农业
健康
纳米粒子 科学 科普
蔬菜
蔬菜
能源
蔬菜
蔬菜 潜叶蝇
蔬菜 三农
应用推广 抽油机
聚丙烯酰胺 水污染 污水
三农 时政
营养学 营养餐
畜牧业
三农 畜牧业 海参 养殖技术
组态
时政
应用推广
时政
羊肉营养 三农 肉羊 畜牧业
超滤膜 中空纤维超滤膜 微孔滤膜
通信 谐波 gprs
风机变频器 关系逻辑
真空断路器
畜牧业
煤气 高炉炼铁 高炉 煤炭
水污染 时政
造纸原料 环境保护 环境污染 时政 造纸术
酒精 发酵工艺 燃料
时政
蝴蝶兰
三农 硅肥 畜牧业 饲料
蔬菜
肉牛
时政
肺癌 喉癌
葡萄 三农 时政
地质
施工工法 顶管 smw工法
钻井液
韭菜
天然气投资 能源 球罐
砂岩
时政 施工工艺
菜花 三农

部分数据

 

 完整代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : kmeans.py
# @Author: 田智凯
# @Date  : 2020/3/19
# @Desc  :机器学习kmeans算法,对科技成果项目进行聚类分析

from __future__ import print_function

import time

from sklearn.feature_extraction.text import TfidfVectorizer
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans, MiniBatchKMeans
import pymssql


#读取sqlserver数据库
def get_dbdata():
    conn_read = pymssql.connect("127.0.0.1", "sa", "###", "test", charset="GBK")
    dataset = []
    sql = "select guanjianci from julei_test"
    cursor = conn_read.cursor()
    cursor.execute(sql)
    data_count = 0
    for line in cursor:
        data_count +=1
        dataset.append(line[0])
    cursor.close()
    conn_read.close()
    print(dataset)
    return dataset

def transform(dataset, n_features=1000):
    vectorizer = TfidfVectorizer(max_df=0.5, max_features=n_features, min_df=2, use_idf=True)
    X = vectorizer.fit_transform(dataset)
    return X, vectorizer


def train(X, vectorizer, true_k=10, minibatch=False, showLable=False):
    # 使用采样数据还是原始数据训练k-means,
    if minibatch:
        km = MiniBatchKMeans(n_clusters=true_k, init='k-means++', n_init=1,
                             init_size=1000, batch_size=1000, verbose=False)
    else:
        km = KMeans(n_clusters=true_k, init='k-means++', max_iter=300, n_init=1,
                    verbose=False)
    km.fit(X)
    if showLable:
        print("Top terms per cluster:")
        order_centroids = km.cluster_centers_.argsort()[:, ::-1]
        terms = vectorizer.get_feature_names()
        print(vectorizer.get_stop_words())
        for i in range(true_k):
            print("Cluster %d:" % i, end='')
            for ind in order_centroids[i, :10]:
                print(' %s' % terms[ind], end='')
            print()
    result = list(km.predict(X))
    print('Cluster distribution:')
    print(dict([(i, result.count(i)) for i in result]))
    return -km.score(X)

#指定簇的个数k
def k_determin():
    '''测试选择最优参数'''
    dataset = get_dbdata()
    print("%d documents" % len(dataset))
    X, vectorizer = transform(dataset, n_features=500)
    true_ks = []
    scores = []
    #中心点的个数从3到200(根据自己的数据量改写)
    for i in range(3, 200, 1):
        score = train(X, vectorizer, true_k=i) / len(dataset)
        print(i, score)
        true_ks.append(i)
        scores.append(score)
    plt.figure(figsize=(8, 4))
    plt.plot(true_ks, scores, label="error", color="red", linewidth=1)
    plt.xlabel("n_features")
    plt.ylabel("error")
    plt.legend()
    plt.show()


def main():
    '''在最优参数下输出聚类结果'''
    dataset = get_dbdata()
    X, vectorizer = transform(dataset, n_features=500)
    score = train(X, vectorizer, true_k=25, showLable=True) / len(dataset)
    print(score)

if __name__ == '__main__':
    start=time.time()
    #k_determin()#先确定k值
    main()
    end=time.time()
    print('程序运行时间',end-start)