精华内容
下载资源
问答
  • python文本聚类分析
    2020-11-28 07:34:32

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

    from __future__ importprint_functionimporttimefrom sklearn.feature_extraction.text importTfidfVectorizerimportmatplotlib.pyplot as pltfrom sklearn.cluster importKMeans, MiniBatchKMeansimportpymssql#读取sqlserver数据库

    defget_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=0for line incursor:

    data_count+=1dataset.append(line[0])

    cursor.close()

    conn_read.close()print(dataset)returndatasetdef 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)returnX, vectorizerdef train(X, vectorizer, true_k=10, minibatch=False, showLable=False):#使用采样数据还是原始数据训练k-means,

    ifminibatch:

    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)ifshowLable:print("Top terms per cluster:")

    order_centroids= km.cluster_centers_.argsort()[:, ::-1]

    terms=vectorizer.get_feature_names()print(vectorizer.get_stop_words())for i inrange(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 inresult]))return -km.score(X)#指定簇的个数k

    defk_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()defmain():'''在最优参数下输出聚类结果'''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)

    更多相关内容
  • python 文本聚类分析案例说明摘要1、结巴分词2、去除停用词3、生成tfidf矩阵4、K-means聚类5、获取主题词 / 主题词团 说明 实验要求:对若干条文本进行聚类分析,最终得到几个主题词团。 实验思路:将数据进行预处理...
  • 资料说明:包括数据+代码+文档+代码讲解。 1.项目背景 2.数据获取 3.数据预处理 4.探索性数据分析 5.特征工程 6.构建聚类模型 7.结论与展望
  • python 文本聚类-Python文本聚类

    千次阅读 2020-11-11 15:16:35
    weight[i][j])) else: tfidf_Res.write(str(tfidf_weight[i][j]) + " ") tfidf_Res.write(" ") tfidf_Res.close() # ======== 聚类分析 ========= km = KMeans(n_clusters=num_clusters) km.fit(tfidf_matrix) print...

    import re

    import os

    import string

    import jieba

    import logging

    import sys

    import codecs

    import traceback

    import pandas as pd

    import numpy as np

    from sklearn import feature_extraction

    from sklearn.feature_extraction.text import TfidfTransformer

    from sklearn.feature_extraction.text import CountVectorizer

    from sklearn.cluster import KMeans

    from collections import Counter

    from sklearn import metrics

    # ======== 数据编码格式转化 ========def get_text():

    base_path = "D:\yuliao\"

    filelist = os.listdir(base_path) #功能相当于在base_path目录下执行dir命令,返回为list类型 data_dict = {}

    f2 = open("D:\data.txt", "w",encoding="utf-8")

    for files in filelist:

    f = open(base_path + files, "r",encoding="utf-8")

    text = f.read().replace(" ", "")

    #data_temp = text # 转换为unicode编码形式 data = "".join(re.findall(u"[一-鿿]+", text)) # 必须为unicode类型,取出所有中文字符 f2.write(data + " ")

    f2.close()

    class TextCluster(object):

    # 初始化函数,重写父类函数 def __init__(self):

    pass

    def seg_words(self, sentence):

    seg_list = jieba.cut(sentence) # 默认是精确模式 return " ".join(seg_list) # 分词,然后将结果列表形式转换为字符串

    # 加载用户词典 def load_userdictfile(self, dict_file):

    jieba.load_userdict(dict_file)

    def load_processfile(self, process_file):

    corpus_list = []

    try:

    fp = open(process_file, "r",encoding="utf-8")

    for line in fp:

    conline = line.strip()

    corpus_list.append(conline)

    return True, corpus_list

    except:

    logging.error(traceback.format_exc())

    return False, "get process file fail"

    def output_file(self, out_file, item):

    try:

    fw = open(out_file, "a")

    fw.write("%s" % (item),encoding="utf-8")

    fw.close()

    except:

    logging.error(traceback.format_exc())

    return False, "out file fail"

    # 释放内存资源 def __del__(self):

    pass

    def process(self, process_file, tf_ResFileName, tfidf_ResFileName, num_clusters, cluster_ResFileName):

    try:

    sen_seg_list = []

    flag, lines = self.load_processfile(process_file)

    if flag == False:

    logging.error("load error")

    return False, "load error"

    for line in lines:

    sen_seg_list.append(self.seg_words(line))

    # 该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频 tf_vectorizer = CountVectorizer()

    # fit_transform是将文本转为词频矩阵 tf_matrix = tf_vectorizer.fit_transform(sen_seg_list)

    tf_weight = tf_matrix.toarray()

    # print tf_weight

    # 该类会统计每个词语的tf-idf权值 tfidf_transformer = TfidfTransformer()

    # fit_transform是计算tf-idf tfidf_matrix = tfidf_transformer.fit_transform(tf_matrix)

    # 获取词袋模型中的所有词语 word_list = tf_vectorizer.get_feature_names()

    # 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重 tfidf_weight = tfidf_matrix.toarray()

    # 打印特征向量文本内容 # print "Features length: " + str(len(word_list)) tf_Res = codecs.open(tf_ResFileName, "w", "utf-8")

    word_list_len = len(word_list)

    for num in range(word_list_len):

    if num == word_list_len - 1:

    tf_Res.write(word_list[num])

    else:

    tf_Res.write(word_list[num] + " ")

    tf_Res.write(" ")

    # 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重 for i in range(len(tf_weight)):

    # print u"-------这里输出第", i, u"类文本的词语tf-idf权重------" for j in range(word_list_len):

    if j == word_list_len - 1:

    tf_Res.write(str(tf_weight[i][j]))

    else:

    tf_Res.write(str(tf_weight[i][j]) + " ")

    tf_Res.write(" ")

    tf_Res.close()

    # 输出tfidf矩阵 tfidf_Res = codecs.open(tfidf_ResFileName, "w", "utf-8")

    for num in range(word_list_len):

    if num == word_list_len - 1:

    tfidf_Res.write(word_list[num])

    else:

    tfidf_Res.write(word_list[num] + " ")

    tfidf_Res.write(" ")

    # 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重 for i in range(len(tfidf_weight)):

    for j in range(len(word_list)):

    if j == word_list_len - 1:

    tfidf_Res.write(str(tfidf_weight[i][j]))

    else:

    tfidf_Res.write(str(tfidf_weight[i][j]) + " ")

    tfidf_Res.write(" ")

    tfidf_Res.close()

    # ======== 聚类分析 ========= km = KMeans(n_clusters=num_clusters)

    km.fit(tfidf_matrix)

    print ("===== 总体轮廓系数 =====")

    print (metrics.silhouette_score(tfidf_matrix, km.labels_, metric="euclidean")) #轮廓系数[-1,1] kas=metrics.silhouette_samples(tfidf_matrix, km.labels_, metric="euclidean") #生成每个文件轮廓系数 print ("===== 每类样本个数 =====")

    print (Counter(km.labels_)) # 每类分到多少样本 # 中心点 # print(km.cluster_centers_) # 每个样本所属的簇 clusterRes = codecs.open(cluster_ResFileName, "w", "utf-8")

    # 将数据写入文件 count = 1

    a=os.listdir("D:\yuliao\")

    kas1=kas.tolist()

    while count <= len(km.labels_):

    clusterRes.write(str(count) +" "+a[count-1]+" "+str(km.labels_[count - 1])+" "+str(kas1[count-1]))

    clusterRes.write(" ")

    count = count + 1

    clusterRes.close()

    except:

    logging.error(traceback.format_exc())

    return False, "process fail"

    # 输出聚类结果if __name__ == "__main__":

    rootdir = "D:\"

    get_text()

    tc = TextCluster()

    tc.process(rootdir+"data.txt", rootdir+"tf_Result.txt", rootdir+"tfidf_Result.txt",3, rootdir+"cluster_Result.txt")

    # data.txt记录所有数据集,一行是一个文本 # tf_Result.txt记录关键词及对应文本出现频数 # tfidf_Result.txt记录关键词及对应文本重要性 # cluster_Result.txt记录聚类结果文件名+对应类别

    展开全文
  • python 文本聚类算法

    千次阅读 2018-08-01 18:44:00
    python 文本聚类算法 三体下载 将下载的文件重命名为santi.txt,放在文件的目录下 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Wed Aug 1 18:31:11 2018 @...

    python 文本聚类算法

    三体下载
    将下载的文件重命名为santi.txt,放在文件的目录下

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    """
    Created on Wed Aug  1 18:31:11 2018
    
    @author: luogan
    """
    
    import jieba
    import re
    from gensim.models import word2vec
    import multiprocessing
    import gensim
    import numpy as  np
    import pandas as pd
    import collections
    import pandas 
    
    
    def segment_text(source_corpus, train_corpus, coding, punctuation):
        '''
        切词,去除标点符号
        :param source_corpus: 原始语料
        :param train_corpus: 切词语料
        :param coding: 文件编码
        :param punctuation: 去除的标点符号
        :return:
        '''
        with open(source_corpus, 'r', encoding=coding) as f, open(train_corpus, 'w', encoding=coding) as w:
            for line in f:
                # 去除标点符号
                line = re.sub('[{0}]+'.format(punctuation), '', line.strip())
                # 切词
                words = jieba.cut(line)
                w.write(' '.join(words))
    
    
    #if __name__ == '__main__':
                
                
                
    # 严格限制标点符号
    strict_punctuation = '。,、':∶;?‘’“”〝〞ˆˇ﹕︰﹔﹖﹑·¨….¸;!´?!~—ˉ|‖"〃`@﹫¡¿﹏﹋﹌︴々﹟#﹩$﹠&﹪%*﹡﹢﹦﹤‐ ̄¯―﹨ˆ˜﹍﹎+=<­­__-\ˇ~﹉﹊()〈〉‹›﹛﹜『』〖〗[]《》〔〕{}「」【】︵︷︿︹︽_﹁﹃︻︶︸﹀︺︾ˉ﹂﹄︼'
    # 简单限制标点符号
    simple_punctuation = '’!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
    # 去除标点符号
    punctuation = simple_punctuation + strict_punctuation
    
    # 文件编码
    coding = 'utf-8'
    
    #coding ="gb18030"
    # 原始语料
    source_corpus_text = 'santi.txt'
    
    # 是每个词的向量维度
    size = 10
    # 是词向量训练时的上下文扫描窗口大小,窗口为5就是考虑前5个词和后5个词
    window = 5
    # 设置最低频率,默认是5,如果一个词语在文档中出现的次数小于5,那么就会丢弃
    min_count = 1
    # 是训练的进程数,默认是当前运行机器的处理器核数。
    workers = multiprocessing.cpu_count()
    # 切词语料
    train_corpus_text = 'words.txt'
    # w2v模型文件
    model_text = 'w2v_size_{0}.model'.format(size)
    
    # 切词 @TODO 切词后注释
    segment_text(source_corpus_text, train_corpus_text, coding, punctuation)
    
    # w2v训练模型 @TODO 训练后注释
    sentences = word2vec.Text8Corpus(train_corpus_text)
    model = word2vec.Word2Vec(sentences=sentences, size=size, window=window, min_count=min_count, workers=workers)
    model.save(model_text)
    
    # 加载模型
    model = gensim.models.Word2Vec.load(model_text)
    
    
    
    
    
    
    g= open("words.txt","r")   #设置文件对象
    std= g.read()     #将txt文件的所有内容读入到字符串str中
    g.close()   #将文件关闭
    
    cc=std.split(' ')
    
    
    
    dd=[]
    kkl=dict()
    
    '''
    将每个词语向量化,并且append 在dd中,形成一个二维数组
    并形成一个字典,index是序号,值是汉字
    '''
    for p in range(len(cc)):
        hk=cc[p]
        if hk in model:
            
            vec=list(model.wv[hk])
            dd.append(vec)
            kkl[p]=hk
            
    #将二维数组转化成numpy
            
    dd1=np.array(dd)
    
    from sklearn.cluster import KMeans       
    
    estimator = KMeans(n_clusters=100)  # 构造聚类器
    estimator.fit(dd1)  # 聚类
    label_pred = estimator.labels_  # 获取聚类标签
    
    #index 是某条向量的序号,值是分类号
    index1=list(range(len(dd1)))
    vc=pd.Series(label_pred,index=index1)
    
    
    aa = collections.Counter(label_pred)
    v = pandas.Series(aa)
    v1=v.sort_values(ascending=False)
    
    
    for n in range(10):
        vc1=vc[vc==v1.index[n]]
        vindex=list(vc1.index)
        
        kkp=pd.Series(kkl)
        
        print('第',n,'类的前10个数据')
        
        ffg=kkp[vindex][:10]
        ffg1=list(set(ffg))
        
        print(ffg1)
    
    
    
    第 0 类的前10个数据
    ['商讨', '合集\u200b', '连载', '刘慈欣简介', '无奈', '编辑', '事先', '题材', '一二三', '今年']
    
    第 1 类的前10个数据
    ['的']
    第 2 类的前10个数据
    ['本书', '活', '举', '作者', '看做', '没想到', '朋友', '见面', '主人公', '十分之一']
    第 3 类的前10个数据
    ['延续', '虽', '球状', '更是', '占', '文革', '部', '冷酷']
    第 4 类的前10个数据
    [nan, '物理学家', '闪电', '怎样', '一年', '一时', '往事', '关于', '却是']
    第 5 类的前10个数据
    ['人类文明', '一段', '试图', '光年', '重新', '星空', '死亡', '内容']
    第 6 类的前10个数据
    ['不了', '大家', '写', '仔细', '有时', '空灵', '许多', '如何', '966', '心中']
    第 7 类的前10个数据
    ['精神', '故事', '科幻', '方式', '永远', '之前']
    第 8 类的前10个数据
    ['里面', '冷兵器', '了', '自己', '立刻', '中', '已', '顶上']
    第 9 类的前10个数据
    ['在', '的']
    

    posted on 2018-08-01 18:44 luoganttcc 阅读(...) 评论(...) 编辑 收藏

    展开全文
  • 中文文本聚类

    2018-09-05 14:01:11
    使用python实现中文文本聚类,利用kmeans算法,包含jiba分词方法等
  •   它摘自于中国科学院计算技术研究所周昭涛的硕士论文《文本聚类分析效果评价及文本表示研究》的第三章。建议先看看原文,可以对聚类评估有一个很好的了解。   综合来说,我们希望最终的聚类结果是:同一个簇内...
  • 大概几万行数据,但是没有归类,要人工归类的话耗时耗力,打算用文本聚类的方法对txt里面的每条数据自动分类。 2. 参考 主要参考https://zhuanlan.zhihu.com/p/78261653 3. 代码 #encoding = utf-8 import ...

    1. 需求

    一个txt文档,如下图。大概几万行数据,但是没有归类,要人工归类的话耗时耗力,打算用文本聚类的方法对txt里面的每条数据自动分类。

    2. 参考

    主要参考https://zhuanlan.zhihu.com/p/78261653

    3. 代码

    #encoding = utf-8
    import numpy as np
    import pandas as pd
    import re
    import os
    import codecs
    import jieba
    
    #打开文件,用jieba进行分词
    f1=open("C:/Users/Administrator/Desktop/test/case.txt","r",encoding='UTF-8',errors='ignore')
    f2=open("C:/Users/Administrator/Desktop/test/case_fenci.txt",'w',encoding='UTF-8',errors='ignore')
    for line in f1:
        seg_list = jieba.cut(line, cut_all=False)
        f2.write((" ".join(seg_list)).replace("\t\t\t","\t"))
    #print(w)
    f1.close()
    f2.close()
    
    titles=open("C:/Users/Administrator/Desktop/test/case_fenci.txt",encoding='UTF-8',errors='ignore').read().split('\n')
    
    #添加停用词
    def get_custom_stopwords(stop_words_file):
        with open(stop_words_file,encoding='utf-8')as f:
            stopwords=f.read()
            stopwords_list=stopwords.split('\n')
            custom_stopwords_list=[i for i in stopwords_list]
        return custom_stopwords_list
    stop_words_file="C:/Users/Administrator/Desktop/test/stopwords.txt"
    stopwords=get_custom_stopwords(stop_words_file)
    
    #聚类
    from sklearn.feature_extraction.text import CountVectorizer
    count_vec=CountVectorizer(stop_words=stopwords)
    km_matrix= count_vec.fit_transform(titles)
    
    #类别保存
    f3 =open("C:/Users/Administrator/Desktop/test/title_clusters.txt", 'w',encoding='UTF-8',errors='ignore')
    for i in clusters:
        f3.write(str(i))
        f3.write("\n")
    f3.close()
    
    print(km_matrix.shape)
    

    4.注意

    1)这里涉及到中文,注意将txt文件格式保存为utf-8格式的,否则可能是乱码。

    2)停用词stopwords要自己创建,里面主要是不被考虑到分词里的单词(根据需求自己写),如下

    展开全文
  • K-Means是聚类算法的一种,通过距离来判断数据点间的相似度并据此对数据进行聚类。 1 聚类算法 科学计算中的聚类方法 方法名称 参数 可伸缩性 用例 几何形状(使用的指标) K-Means number of ...
  • python文本聚类

    2020-12-03 02:09:17
    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台;社区覆盖了云计算、大数据、人工智能、...
  • [python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像 http://blog.csdn.net/eastmount/article/details/50545937 包括输入文档txt,共1000行数据,每行都是分词完的文本。 本文主要讲述以下几点: 1.通过...
  • 一、算法简介算法接受参数k,然后将事先输入的n个数据对象划分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得的一个...
  • 一句一行存入到txt中,接着我们要通过对每句话进行分词转向量,最后使用kmeans进行聚类并输出结果。二、代码 2.1、加载停用词 在stop_words目录下有多个停用词表,需要循环加总所有停用词。 2.2、加载数据 这边...
  • 文本进行聚类文本预处理-->构造特征向量-->聚类,压缩包内含有实验用语料亲测可用, 谢谢支持。
  • Python文本聚类

    2020-11-26 04:13:03
    word_list_len - 1: tfidf_Res.write(str(tfidf_weight[i][j])) else: tfidf_Res.write(str(tfidf_weight[i][j]) + '\t') tfidf_Res.write('\r\n') tfidf_Res.close() # ======== 聚类分析 ========= km = KMeans(n_...
  • 花了好几天时间学习了文本聚类,以下记录一下这次的学习,也整理了一些这方面的资料,和大家分享一下,一起交流学习,进步在于不断总结和分享以及相互交流。文本聚类就是把相似的文档聚集成一簇,通过把文本转换成...
  • Python 文本相似度和聚类文本数据是非结构化的和高噪声的。在执行文本分类时,拥有标记合理的训练数据和有监督学习大有裨益。但是,文档聚类是一个无监督的学习过程,将尝试通过让机器学习各种各样的文本文档及其...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,991
精华内容 6,796
关键字:

python文本聚类分析