zoukankan      html  css  js  c++  java
  • [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)])

    函数以及用法见代码。

  • 相关阅读:
    POJ-1502-MPI Maelstrom
    POJ-3259-Wormholes
    【BZOJ4399】—膜法少女LJJ(线段树合并)
    省选模板复习—【计算几何】
    【BZOJ2115】【WC2011】—Xor(线性基)
    【洛谷P5290】【十二省联考2019】春节十二响(贪心+启发式合并)
    【BZOJ5461】 【PKUWC2018】—Minimax(线段树合并优化dp)
    【LOJ#3043】【洛谷P5280】【ZJOI2019】—线段树(计数dp+线段树)
    【省选模拟】—猎人杀(概率dp)
    【BZOJ4828】【HNOI2017】—大佬(LmyAKIOI!)
  • 原文地址:https://www.cnblogs.com/zlc364624/p/12548865.html
Copyright © 2011-2022 走看看