[python]机器学习 k-mean 聚类分析

1.聚类代码:

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @File  : 聚类2.py
 4 # @Author: 赵路仓
 5 # @Date  : 2020/3/19
 6 # @Desc  :
 7 # @Contact : 398333404@qq.com 
 8 
 9 import csv
10 import re
11 import jieba.analyse
12 from sklearn.cluster import KMeans
13 from sklearn.feature_extraction.text import TfidfTransformer
14 from sklearn.feature_extraction.text import CountVectorizer
15 
16 labels = []
17 corpus = []  # 空语料库
18 # 这是三个要处理的文本 csv格式 需要修改
19 f = csv.reader(open("E:/Jingjinji3.csv", 'r+', encoding='utf-8'))
20 f1 = csv.reader(open("E:/Tianjin3.csv", 'r+', encoding='utf-8'))
21 f2 = csv.reader(open("E:/Hebei3.csv", 'r+', encoding='utf-8'))
22 count = 0
23 
24 # 三个文件依次读取
25 for i in f:
26     count += 1
27     if count == 1:
28         continue
29     # 成果名称所在的列,从0开始 下面相同,需要修改
30     labels.append(i[1])
31     # 关键字所在的列 从0开始 下面相同,需要修改
32     corpus.append(i[24])
33 
34 for i in f1:
35     count += 1
36     if count == 1:
37         continue
38     labels.append(i[2])
39     corpus.append(i[20])
40 
41 for i in f2:
42     count += 1
43     if count == 1:
44         continue
45     labels.append(i[1])
46     corpus.append(i[19])
47 
48 vectorizer = CountVectorizer()  # 该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频 
49 transformer = TfidfTransformer()  # 该类会统计每个词语的tf-idf权值
50 tfidf = transformer.fit_transform(
51     vectorizer.fit_transform(corpus))  # 第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵
52 weight = tfidf.toarray()  # 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
53 word = vectorizer.get_feature_names()  # 获取词袋模型中的所有词
54 
55 for i in range(len(labels)):  # 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
56     print(u"-------这里输出第", i, u"类文本的词语tf-idf权重------")
57     list = weight[i].tolist()
58     print(word[list.index(max(list))], max(weight[i]))
59 
60 # 可以修改,n_clusters 要聚类的类数,n_init 初始化质心的迭代次数 init 选择为随机选取质心 n_jobs并发运行 5
61 mykms = KMeans(n_clusters=100, max_iter=300, n_init=100,
62                init='k-means++', n_jobs=5)
63 y = mykms.fit_predict(weight)
64 
65 # 要写入的文件,可以修改
66 f = csv.writer(open("E:/result.csv", 'w', encoding='utf-8', newline=''))
67 f.writerow(["类别", "名称", "领域"])
68 f = csv.writer(open("E:/result.csv", 'a+', encoding='utf-8', newline=''))
69 
70 # 标签用0-100的数组区分
71 for i in range(0, 20):
72     label_i = []
73     for j in range(0, len(y)):
74         if y[j] == i:
75             label_i.append(labels[j])
76     text = " ".join(label_i)
77     Key = jieba.analyse.extract_tags(text, topK=5)
78     print(Key)
79     print('label_' + str(i) + ':', len(label_i), str(label_i))
80 
81     for a in label_i:
82         f.writerow([str(i), a, ' '.join(Key)])

函数以及用法见代码。

原文地址:https://www.cnblogs.com/zlc364624/p/12548865.html