`
strayly
  • 浏览: 97397 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

计算文本词频进行聚类

 
阅读更多
import jieba
import jieba.analyse
import math
import operator
from sklearn.cluster import KMeans, MiniBatchKMeans, AffinityPropagation, DBSCAN
from sklearn.cluster import MeanShift, estimate_bandwidth
from collections import Counter
from sklearn.manifold import TSNE
from sklearn.decomposition import TruncatedSVD
from sklearn.decomposition import PCA
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import Normalizer
import numpy as np
import matplotlib.pyplot as plt
from collections import defaultdict
import os
#np.set_printoptions(threshold=np.inf)

#加载手工设置的某些词的idf值
def load_idf_file(path):
    idf_dict = {}
    handle = open(path, 'r',encoding= 'utf8')
    line = handle.readline()               # 调用文件的 readline()方法 
    datas = []
    while line: 
        line = line.strip() 
        if len(line)>0:
            line_arr = line.split(' ')
            idf_dict[line_arr[0]] = float(line_arr[1])
        line = handle.readline() 
    handle.close()
    return idf_dict

def cal_idf(data_set,idf_dict):
    doc_num = len(data_set)
    word_doc_count=defaultdict(int)
    for word_str in data_set:
        word_list = word_str.split(' ')
        word_list = list(set(word_list))
        for item in word_list:
            if item and item.strip()!='':
                word_doc_count[item]+=1

    word_idf = {}
    default_idf_keys = idf_dict.keys()
    for k,v in word_doc_count.items():  
        idf = math.log(doc_num*1.0 / v)  
        if k in default_idf_keys: word_idf[k] = idf_dict[k]
        else:word_idf[k] = idf
    #path = "idf.txt"  
    #save(word_idf, path)  
    return word_idf
def cal_tfidf(data_set,idf_ret):
    doc_word_tfidf = []    
    i = 0
    for word_str in data_set:
        word_list = word_str.split(' ')
        doc_word_total = len(word_list)
        doc_word_dict = defaultdict(int)
        doc_word_tfidf_dict = defaultdict(int)
        for item in word_list:
            if item and item.strip()!='':
                doc_word_dict[item]+=1
        for k,v in doc_word_dict.items():
            doc_word_tfidf_dict[k]=(v/doc_word_total)*idf_ret[k]
        doc_word_tfidf.append(doc_word_tfidf_dict)
        i=i+1
    return doc_word_tfidf    


def save(idf_dict, path):  
    f = open(path, 'a+',encoding= 'utf8')
    f.truncate()  
    for key in idf_dict.keys():  
        f.write(str(key) + " " + str(idf_dict[key]) + "\n")  
    f.close()  

# 切词
def jieba_tokenize():
    jieba_need =[]
    for item in datas:
        temp_list1 = jieba.analyse.extract_tags(item,topK=10) 
        w_len = len(temp_list1)
        if w_len>2:
            w_num = math.ceil(float(w_len)*0.6)
            temp_list1 = temp_list1[0:w_num]
        temp_list=[e for e in temp_list1 if e not in lines + [' '] and len(e)>1]
        jieba_need.append(" ".join(temp_list))
    return jieba_need


# 降维
def reduction(matrix):
    svd = TruncatedSVD(50)
    normalizer = Normalizer(copy=False)
    lsa = make_pipeline(svd, normalizer)
    X = lsa.fit_transform(matrix)
    return X

jieba.analyse.set_idf_path("./jieba/idf.txt")
data_num = 10000
k_num = 200

i = 0
output = open('../data.txt', 'r',encoding= 'utf8')
line = output.readline()               # 调用文件的 readline()方法 
datas = []
while line: 
    line = line.strip() 
    if len(line)>0:
        i=i+1
        datas.append(line)
        if i>=data_num:break    
    line = output.readline() 
output.close()


npyfile = "data.npy"
if os.path.exists(npyfile):
    X = np.load("data.npy")
else:
    # 读取停用词
    with open('./stop_words.txt',encoding='utf-8') as f:
        entities = list(f)
        lines = []
        for line in entities:
            line1 = line.strip()
            lines.append(line1)
    #加载手工设置的idf
    default_idf_dict = load_idf_file("./jieba/idf.txt")
    my_train = jieba_tokenize()

    idf_ret = cal_idf(my_train,default_idf_dict)
    tfidf_ret = cal_tfidf(my_train,idf_ret)
    doc_rows = len(datas)
    word_rows = len(idf_ret)
    #把每个文档每个分词的词频 转换成 矩阵[文档数,分词数]
    X = np.zeros([doc_rows,word_rows])
    for i in range(doc_rows):
        j = 0
        for k,v in idf_ret.items():
            X[i][j] = tfidf_ret[i][k]
            j=j+1
    X = np.array(X)
    np.save("data.npy",X)
#降维
X = reduction(X)
#cl = MiniBatchKMeans(n_clusters=k_num, init='k-means++', n_init=1,init_size=1000, batch_size=10000, verbose=False)
#cl = KMeans(n_clusters=k_num, init='k-means++', random_state=30, n_init=1,verbose=False)
cl = DBSCAN(eps=0.2, min_samples=30)
result = cl.fit_predict(X)
num_clusters = len(set(result))

# 结果输出
ret = [[] for y in range(len(result))] 
for i in range(len(datas)): 
    classid = result[i]
    ret[classid].append(datas[i])

for m in range(num_clusters):
    file = "./result/result_"+str(m)+".txt"
    handle = open(file, 'w+',encoding= 'utf8')
    for n in range(len(ret[m])):
        handle.write(ret[m][n]+"\n")
    handle.close()

分享到:
评论

相关推荐

    【项目实战】Python基于KMeans算法进行文本聚类项目实战

    在本项目实战中,我们将深入探讨如何利用Python和KMeans算法进行文本聚类。文本聚类是无监督学习的一种应用,旨在将相似的文本分组到一起,无需预先指定类别。这个项目涵盖了从数据获取、预处理到模型构建的全过程,...

    文本聚类用的Tfid词频计算

    通过这些组件,我们可以处理文本数据,去除停用词,进行词干提取,计算TF-IDF值,并以此作为特征进行文本的聚类或分类。在实际应用中,这些工具可以帮助我们有效地理解和挖掘大量文本数据中的潜在结构和模式。

    英文文本分类和聚类的语料

    在“20_newsgroups”中,虽然每个文档已经有了类别标签,但我们可以忽略这些标签,仅根据文本内容进行聚类,以探究数据的内在结构。常用的聚类方法有K-means、层次聚类、DBSCAN等。通过聚类,我们可以发现潜在的话题...

    K-Means文本聚类python实现

    文本聚类是机器学习领域的一种无监督学习方法,主要用于对大量文本数据进行分类,而无需预先知道具体的类别信息。在本案例中,我们将探讨如何使用Python实现K-Means算法来对文本数据进行聚类。K-Means是一种简单且...

    matlab.rar_text genetic_文本聚类_文本聚类 matlab_文本聚类matlab_遗传算法 聚类

    总的来说,"matlab.rar_text genetic_文本聚类_文本聚类 matlab_文本聚类matlab_遗传算法 聚类"这个资源为研究者和实践者提供了一套基于MATLAB的文本聚类解决方案,利用遗传算法进行智能优化,适用于处理大规模文本...

    java文本聚类Kmeans源码

    2. **距离度量**:计算文本之间的相似度通常采用余弦相似度或欧几里得距离。对于词向量表示的文本,可以使用余弦相似度,因为它能较好地捕捉词与词之间的语义关系。 3. **质心计算**:对于文本数据,质心不再简单地...

    退火软近邻丢失的文本分类与聚类_Text Classification and Clustering with Annealin

    在文本分类和聚类中,数据预处理如词干提取、停用词移除、TF-IDF(词频-逆文档频率)转换等都是数据挖掘的一部分,这些步骤对于构建高质量的输入特征向量至关重要。 在给定的文件内容中,虽然没有直接讨论“退火软...

    Chapter 7 文本分类与聚类 (研究进展、现状&趋势)1

    在文本处理的初期阶段,文本数据通常是以无结构的形式存在,为了利用机器学习模型进行分类或聚类,必须先将文本转化为结构化的特征向量形式。构建文本特征向量是将非结构化文本数据转换为模型可以理解的数值型输入...

    基于K-means的文本聚类实验 Java

    3. 向量化:将文本转化为数值形式,常用的方法有词袋模型(Bag-of-Words)、TF-IDF(词频-逆文档频率)和词嵌入(如Word2Vec)。 接下来,我们将使用Java实现K-means算法: 1. 定义数据结构:创建一个表示文本的类...

    java文本聚类

    总之,Java文本聚类结合K-MEANS算法和TF-IDF权重计算,提供了一种有效的方法来对大量文本数据进行自动分类。这个项目提供了一个实战平台,对于学习和理解这些概念以及在Java环境中如何实现它们非常有帮助。通过深入...

Global site tag (gtag.js) - Google Analytics