zoukankan      html  css  js  c++  java
  • python聚类算法实战详细笔记 (python3.6+(win10、Linux))

    python聚类算法实战详细笔记 (python3.6+(win10、Linux))


    一、基本概念:
        1、计算TF-DIF

    TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
    字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
    TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,
    则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),
    IDF逆向文件频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率。
    IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。
        2、K-means聚类计算
    K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,
    它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。
    K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。
    算法采用误差平方和准则函数作为聚类准则函数。


    二、python3.5 3.6环境配置
        1、
    安装了VS2015;
        2、在Python3.5安装路径中有一个Scripts文件夹,里面有pip.exe或者类似的可执行文件,安装一下;
        3、下载相对应的whl安装包,下载地址http://www.lfd.uci.edu/~gohlke/pythonlibs/;
    下载:1)numpy-1.12.1+mkl-cp36-cp36m-win32.whl
         2)scipy-0.19.0-cp36-cp36m-win32.whl
         3)scikit_learn-0.18.1-cp36-cp36m-win32.whl
        4、安装, 下载好以后,进入whl文件所在文件夹,进入cmd,输入命令: 
         1)pip install numpy-1.12.1+mkl-cp36-cp36m-win32.whl 回车;显示successful,不要关闭cmd;
         2)pip install scipy-0.19.0-cp36-cp36m-win32.whl 回车;显示successful,不要关闭cmd;
         3)pip install scikit_learn-0.18.1-cp36-cp36m-win32.whl 回车;显示successful,不要关闭cmd;
        5、验证一下,输入命令:  输入import numpy 回车 无异常,输入import scipy 回车 无异常,输入import sklearn 回车 无异常
       
       环境配置成功
    三、文本聚类算法步骤
       本次目标是对海量淘宝商品标题进行分类
        1、准备数据
    (5000条淘宝商品标题)
       a、采集
       b、手工准备
       范本:https://pan.baidu.com/s/1eR4V77W (标题原文5000行【文本文件】)
        2、初步加工
       a、中文分词
       b、手工处理
       范本:https://pan.baidu.com/s/1mi4Z9wO (分词后的标题5000行【文本文件】)
        3、计算TF-IDF代码如下:
            代码如下

    ============================tfidf.py begin====================================================
    # coding=utf-8    

    import time            
    import re            
    import os    
    import sys  
    import codecs  
    import shutil  
    from sklearn import feature_extraction    
    from sklearn.feature_extraction.text import TfidfTransformer    
    from sklearn.feature_extraction.text import CountVectorizer  
     
    if __name__ == "__main__":  
       corpus = [] #文档预料 空格连接  
     
       #读取预料 一行预料为一个文档  
       aa = 0
       for line in open('D:/pyfenlei/5000/p1.txt', 'r').readlines():  
    # print (line) 
    # print(aa)
    aa = aa +1
    if (line.strip()):
       corpus.append(line.strip())  
       #print corpus  
       time.sleep(5)  
         
       #将文本中的词语转换为词频矩阵 矩阵元素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()  
     
       resName = "D:/pyfenlei/5000/p1.tfidf"  
       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 ("-------这里输出第",i,u"类文本的词语tf-idf权重------")
    for j in range(len(word)):  
       result.write(str(weight[i][j]) + ' ')  
    result.write(' ')  
     
       result.close()
    ============================tfidf.py end======================================================  
    计算结果https://pan.baidu.com/s/1nuOujgP  (TF-IDF权重值5000行【文本文件】)


        4、计算K-means代码如下(暂定聚40个类)
            代码如下
    ============================Kmeans.py begin===================================================
    # coding=utf-8    
    """  
    #K-means  
    """    
       
    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__":  
         
       corpus = []  
         
       #读取预料 一行预料为一个文档  
       for line in open('D:/pyfenlei/5000/p1.txt', 'r').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()  


       from sklearn.cluster import KMeans  
       clf = KMeans(n_clusters=40)  
       s = clf.fit(weight)  


       kmName = "D:/pyfenlei/5000/p1.km" 
       kmresult = codecs.open(kmName, 'w', 'utf-8')  
       i = 1  
       while i <= len(clf.labels_):  
    kmresult.write("%d,%d " % (i, clf.labels_[i-1]))   
    i = i + 1  


       kmresult.close()
     
       #用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数  
       print(clf.inertia_) 
    ============================Kmeans.py end=================================================== 
    计算结果https://pan.baidu.com/s/1skR9P7J (K-means标题行与分类簇号共5000行【文本文件】)


        5、标题归类如下:
            代码如下

    ============================btgl.py begin===================================================
    # coding=utf-8
    """  
    #标题归类 
    """


    import time
    import re
    import os
    import sys
    import codecs


    if __name__ == "__main__":
       ywName = "D:/pyfenlei/5000/p1.yw"
       kmName = "D:/pyfenlei/5000/p1.km"
       ywList = [line.strip() for line in open(
    ywName, encoding='utf-8').readlines()]
       kmList = [line.strip().split(',')[1].strip()
         for line in open(kmName, encoding='utf-8').readlines()]
       for i in range(len(kmList)):
    btglName = "D:/pyfenlei/gl/p1_%s.btgl"
    btglresult = codecs.open(btglName % (kmList[i]), 'a', 'utf-8')
    btglresult.write("%s " % (ywList[i]))
    btglresult.close()
       print("标题归类完毕!")
    ============================btgl.py end==================================================
    计算结果https://pan.baidu.com/s/1sl2N7Tr (40个聚类对应的标题归并后的40个标题列表文件【文本文件】)


        6、词群归类如下:
            代码如下:

    ============================cqgl.py begin================================================
    # coding=utf-8
    """  
    #标题归类 
    """


    import time
    import re
    import os
    import sys
    import codecs


    if __name__ == "__main__":
       fcName = "D:/pyfenlei/5000/p1.txt"
       kmName = "D:/pyfenlei/5000/p1.km"
       fcList = [line.strip() for line in open(
    fcName, encoding='utf-8').readlines()]
       kmList = [line.strip().split(',')[1].strip()
         for line in open(kmName, encoding='utf-8').readlines()]
       for i in range(len(kmList)):
    cqglName = "D:/pyfenlei/gl/p1_%s.cqgl"
    cqglresult = codecs.open(cqglName % (kmList[i]), 'a', 'utf-8')
    cqglresult.write("%s " % (fcList[i]))
    cqglresult.close()
       print("词群归类完毕!")
    ============================cqgl.py end===================================================
    计算结果https://pan.baidu.com/s/1pL6p0ev (40个聚类对应的分词归并后的40个词群【文本文件】)


    代码没有进行整合,也不具备大规模聚类,仅供参考!


    参考资料:

    https://sourceforge.net/projects/scipy/files/scipy/
    https://github.com/scipy/scipy/releases
    https://pypi.python.org/pypi/scipy (这里的scipy好像很难安装成功)
    http://www.lfd.uci.edu/~gohlke/pythonlibs/ (这里有scipy的各种版本)


    本人原创未经许可,可以随意转载!

  • 相关阅读:
    最大子矩阵和(二维矩阵转一维DP)
    最长公共子序列+编辑距离
    过河(DP)
    墙壁涂色(DP)
    数组分组(DP)
    一维消消乐(DP)
    逃生(地图上的dp)
    kuangbin专题专题十一 网络流 POJ 3436 ACM Computer Factory
    网络流算法模板
    Codeforces Round #614 (Div. 2) C
  • 原文地址:https://www.cnblogs.com/bdccloudy/p/7665215.html
Copyright © 2011-2022 走看看