zoukankan      html  css  js  c++  java
  • 【机器学习】K-means文本聚类,python

    K-means是一种常用的聚类算法,展示如下:

    Created on 2016-01-06 @author: Eastmount

    代码传送门:

    # coding=utf-8  
    """ 
    Created on 2016-01-06 @author: Eastmount  
    """  
      
    import time          
    import re          
    import os  
    import sys
    import codecs
    import shutil
    import numpy as np
    from sklearn import feature_extraction  
    from sklearn.feature_extraction.text import TfidfTransformer  
    from sklearn.feature_extraction.text import CountVectorizer  
     
    if __name__ == "__main__":
        
        #########################################################################
        #                           第一步 计算TFIDF
        
        #文档预料 空格连接
        corpus = []
        
        #读取预料 一行预料为一个文档
        for line in open('one1.txt', encoding = "utf-8").readlines():
            #print(line)
            corpus.append(line.strip())
        #print corpus
        #time.sleep(1)
        
        #将文本中的词语转换为词频矩阵 矩阵元素a[i][j] 表示j词在i类文本下的词频
        vectorizer = CountVectorizer()
     
        #该类会统计每个词语的tf-idf权值
        transformer = TfidfTransformer()
     
        #第一个fit_transform是计算tf-idf 第二个fit_transform是将文本转为词频矩阵
        tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
     
        #获取词袋模型中的所有词语  
        word = vectorizer.get_feature_names()
     
        #将tf-idf矩阵抽取出来,元素w[i][j]表示j词在i类文本中的tf-idf权重
        weight = tfidf.toarray()
     
        #打印特征向量文本内容
        print( 'Features length: ' + str(len(word)))
        resName = "BHTfidf_Result.txt"
        result = codecs.open(resName, 'w', 'utf-8')
        for j in range(len(word)):
            result.write(word[j] + ' ')
        result.write('
    
    ')
     
        #打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重  
        for i in range(len(weight)):
            #print( u"-------这里输出第",i,u"类文本的词语tf-idf权重------"  )
            for j in range(len(word)):
                #print( weight[i][j],)
                result.write(str(weight[i][j]) + ' ')
            result.write('
    
    ')
     
        result.close()
     
     
        ########################################################################
        #                               第二步 聚类Kmeans
     
        print( 'Start Kmeans:')
        from sklearn.cluster import KMeans
        clf = KMeans(n_clusters=10)
        s = clf.fit(weight)
        #print( s)
     
        #20个中心点
        print(clf.cluster_centers_)
        
        #每个样本所属的簇
        print(clf.labels_)
        i = 1
        while i <= len(clf.labels_):
            #print( i, clf.labels_[i-1])
            print(clf.labels_[i-1])
            i = i + 1
     
        #用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
        #print(clf.inertia_)
    

    结果图:

    结果解释:

    文本文件中输入的有12段文本内容,所以处理后也是出来12个结果与输入分别对应。

    那么聚类结果是第1段和第2段是一类,第5段和第7段是一类,剩余几段自成一派。

    [0 0 6 4 3 9 3 5 1 8 2 7]

    备注:本文代码系非原创的,因需要做文本聚类,几乎将博客里的关于这部分的代码都尝试了一遍,这份代码是没有报错的,感恩大神Eastmount。

  • 相关阅读:
    Ajax
    事件委托
    事件对象
    js的基础类型与引用类型
    Javascript和HTML dom
    用jQuery写的最简单的表单验证
    初学HTML5的一点理解
    CMake 入门
    centos7上rpm安装wkhtmltopdf
    centos7 下安装思源黑体字体
  • 原文地址:https://www.cnblogs.com/helenlee01/p/12617474.html
Copyright © 2011-2022 走看看