基于gensim的文本主题模型(LDA)分析

最近参加牛客网的一个数据挖掘比赛,里面用到文本分析,其中用到主题模型(LDA),在这里顺便就写一个小小的例子吧。

我用的是python代码,调用gensim包,对进八万条短文本进行主题模型分析。

http://blog.csdn.net/huagong_adu/article/details/7937616

http://blog.echen.me/2011/08/22/introduction-to-latent-dirichlet-allocation/

1.gensim的安装与使用:

不多说,https://pypi.python.org/pypi直接搜gensim下载解压python setup.py install安装即可

使用,查看gensim官网文档http://radimrehurek.com/gensim/tutorial.html

2.文本分词

推荐结巴分词,我这里用的是取关键词

key_list = jieba.analyse.extract_tags(term[2],30) #get keywords 
3.统计主题模型

步骤:构建词典—>对应text的向量(word2vec1)—>统计tfidf—>对应text的向量(word2vec2)—>lda模型—>lda特征向量

核心代码:

    dic = corpora.Dictionary(data_list) #构造词典
    corpus = [dic.doc2bow(text) for text in data_list] # 每个text 对应的稀疏向量
    tfidf = models.TfidfModel(corpus) #统计tfidf
    print "lda"
    corpus_tfidf = tfidf[corpus]  #得到每个文本的tfidf向量,稀疏矩阵
    lda = models.LdaModel(corpus_tfidf, id2word = dic, num_topics = 200) 
    corpus_lda = lda[corpus_tfidf] #
至此得到的corpus_lda就是每个text的LDA向量,稀疏的,元素值是隶属与对应序数类的权重

4.工程文件

本工程是,先对文本做LDA分析,然后用kmeans聚类,从而提取每个文本的特征向量,经过实验,在本工程场景,lda向量和直接聚类与先lda再聚类之后的效果相差不大

文本文件在我的资源,如有需要自行查找(文本三个字段,id,title(可能空),content(可能空))我的资源http://download.csdn.net/detail/u010297828/9391608

#!/usr/bin/python  
# -*- coding:utf8 -*-  
 
import os
import time
import re
import jieba.analyse

def post_cut(url):
    fr = open(url+"/post_data.txt")
    fo = open(url+"/post_key.txt","a+")
    for line in fr.readlines():
        term = line.strip().split("\t")
        if len(term) == 3 and  term[2] != "":
            key_list = jieba.analyse.extract_tags(term[2],30) #get keywords 
            ustr = term[0]+"\t"
            for i in key_list:
                ustr += i.encode("utf-8") +" " 
            fo.write(ustr+"\n")
    fr.close()
    fo.close()

def post_tfidf(url):
    from sklearn.feature_extraction.text import HashingVectorizer
    fr = open(url+"/post_key.txt")
    id_list = []
    data_list = []
    for  line in fr.readlines():
        term = line.strip().split("\t")
        if len(term) == 2:
            id_list.append(term[0])
            data_list.append(term[1])
        
    hv = HashingVectorizer(n_features = 10000,non_negative=True)#该类实现hash技巧
    post_tfidf = hv.fit_transform(data_list)    #return feature vector 'fea_train' [n_samples,n_features]  
    print 'Size of fea_train:' + repr(post_tfidf.shape) 
    print post_tfidf.nnz
    post_cluster(url,id_list,post_tfidf)
    
def post_cluster(url,id,tfidf_vec):
    from sklearn.cluster import KMeans
    kmean = KMeans(n_clusters = 300)
    print "kmeans"
    kmean.fit(tfidf_vec)
#     pred = kmean.transform(tfidf_vec)
    
#   count1 = 0
 #   count2 = 0
#     pred_str = []
# 
#     for item in pred:
#         count1 += 1
#         vec = ""
#         for tmp in item :
#             vec += str(tmp)[0:7] + "\t"
#         pred_str.append(vec)
#         
#     print len(pred_str)
#     print len(id)
    
    pred = kmean.predict(tfidf_vec)
    fo = open(url+"/cluster.txt","a+")
    for i in range(len(pred)):
        count2 += 1
        fo.write(id[i]+"\t"+str(pred[i])+"\n")
    fo.close()
    print "%d+%d"%(count1,count2)
    
def post_lda(url,cluster):
    from gensim import corpora, models,matutils
    count = 0
    fr = open(url+"/post_key.txt")
    fo2 = open(url+"/post_vec_lda.txt","a+")
    id_list = []
    data_list = []
    
    for  line in fr.readlines():
        term = line.strip().split("\t")
        if len(term) == 2:
            count += 1
            id_list.append(term[0])
            word = term[1].strip().split()
            data_list.append(word)
    print "lda"
    dic = corpora.Dictionary(data_list) #构造词典
    corpus = [dic.doc2bow(text) for text in data_list] # 每个text 对应的稀疏向量
    tfidf = models.TfidfModel(corpus) #统计tfidf
    print "lda"
    corpus_tfidf = tfidf[corpus]  #得到每个文本的tfidf向量,稀疏矩阵
    lda = models.LdaModel(corpus_tfidf, id2word = dic, num_topics = 200) 
    corpus_lda = lda[corpus_tfidf] #每个文本对应的LDA向量,稀疏的,元素值是隶属与对应序数类的权重
    print "lda"

    num = 0
    for doc in corpus_lda:
        wstr = ""
        for i in range(len(doc)):
            item = doc[i]
            wstr += str(item[0]) +","+str(item[1])[0:7] + "/"
        fo2.write(id_list[num]+"\t"+wstr[0:-1]+"\n")
        num += 1
    fr.close()
    fo2.close()
    print num
    
    if cluster:
        lda_csc_matrix = matutils.corpus2csc(corpus_lda).transpose()  #gensim sparse matrix to scipy sparse matrix
        post_cluster(url,id_list,lda_csc_matrix)


if __name__ == "__main__":
    url = "path"
    time = time.time()
    post_cut(url)
    post_tfidf(url)
    lda_cluster = False
    post_lda(url,lda_cluster)

    print time.time() - time


  • 13
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
LDA(Latent Dirichlet Allocation)是一种文本主题模型,它可以将文本表示为多个主题的混合,并且每个主题又表示为多个单词的分布。LDA算法可以用于文本分类、信息检索、推荐系统等领域。 下面介绍基于gensim模块实现LDA算法的步骤: 1. 准备数据 我们需要将文本数据转换为词袋模型(bag-of-words),即将每个文档表示为一个向量,向量的每个元素表示一个单词在文档中出现的次数。可以使用gensim提供的corpora.Dictionary类来构建词袋模型。 ```python from gensim import corpora # 构建词袋模型 texts = [['human', 'interface', 'computer'], ['survey', 'user', 'computer', 'system', 'response', 'time'], ['eps', 'user', 'interface', 'system'], ['system', 'human', 'system', 'eps'], ['user', 'response', 'time'], ['trees'], ['graph', 'trees'], ['graph', 'minors', 'trees'], ['graph', 'minors', 'survey']] dictionary = corpora.Dictionary(texts) corpus = [dictionary.doc2bow(text) for text in texts] ``` 2. 训练模型 使用gensim提供的models.ldamodel.LdaModel类来训练LDA模型。需要指定主题数目和迭代次数等参数。 ```python from gensim import models # 训练LDA模型 lda_model = models.LdaModel(corpus=corpus, id2word=dictionary, num_topics=3, iterations=100) ``` 3. 查看结果 可以使用lda_model.print_topics()方法查看每个主题的单词分布。 ```python # 查看每个主题的单词分布 for topic in lda_model.print_topics(): print(topic) ``` 4. 推断文档主题 可以使用lda_model.get_document_topics()方法推断文档的主题分布。 ```python # 推断文档主题 doc = corpus[0] doc_topics = lda_model.get_document_topics(doc) print(doc_topics) ``` 至此,基于gensim模块的LDA算法实现就完成了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值