gensim中LDA生成文档主题,并对主题进行聚类

7人阅读 评论(0) 收藏 举报
分类:

gensim入门学习资料如下:

学习连接

gensim中lda模型官方文档:

官网

使用gensim中的LDA模型计算主题:

代码地址

corpo.Dictionary(texts)方法介绍:

texts=[[word11,word12,....],[word21,word22,word23,],[word31,....]]

word11中第一个1是代表第一篇文章,第二个1表示文章中的第一个词语(进行分词后的词语)

输出的结果是一个词典:{1:word1,2:word2,....}1,2表示词语的id(自动生成),word1表示词语。对每一词生成一个ID,相同的词语ID一致。

[dic.doc2bow(text) for text in texts]

texts同上,doc2bow是用ID替代texts中的词语,以便于后面进行计算。

lda=model.LdaModel(corpus,id2word=dic)

topic_list=lda.print_topics(num_topics=20,num_words=20)

id2word=dic之后,计算结果就会直接出错对应的词语而不是iD,num_topics表示主题的数量,num_words表示显示多个文档的主题。

下面介绍使用LDA进行聚类

#!/usr/bin/python
# -*- coding:utf8 -*-

import os
import time
import re
import jieba.analyse


def post_cut(url):
	fr = open(url + "/post_data.txt","r",encoding="utf8")
	fo = open(url + "/post_key.txt", "a+",encoding="utf8")
	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 + " "
			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","r",encoding="utf8")
	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+",encoding="utf8")
	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","r",encoding="utf8")
	fo2 = open(url + "/post_vec_lda.txt", "a+",encoding="utf8")
	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)

sklearn的LDA模型使用如下:

sklearn中的LDA


查看评论

从C++到Java --理解面向对象是关键所在

从C++到Java --理解面向对象是关键所在 作者:张岩 发布时间:2001/04/06 文章摘要:  如果你没有被流放到孤岛的话,那么你一定会听说了Java的出现对开发者和用户的潜在冲击了。在这篇...
  • CandyCat
  • CandyCat
  • 2001-05-17 21:41:00
  • 1289

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

主题模型文本分析小例子
  • u010297828
  • u010297828
  • 2016-01-05 20:56:39
  • 9261

文本分析--基于gensim的文本主题模型分析

#!/usr/bin/python # -*- coding:utf8 -*-import os import time import re import jieba.analyse import t...
  • kevinelstri
  • kevinelstri
  • 2017-04-12 18:05:21
  • 1048

使用gensim中的lda模型训练主题分布

一直在寻找各种大神的LDA算法,不过调试一直没有成功,最后还是选择使用gensim的LDA工具来训练自己的文本数据吧。 #coding=utf-8 import codecs from gensim ...
  • accumulate_zhang
  • accumulate_zhang
  • 2017-03-16 22:32:41
  • 5590

初试主题模型LDA-基于python的gensim包

LDA是文本挖掘中常用的主题模型,用来从大量文档中提取出最能表达各个主题的一些关键词,具体算法原理可参阅KM上相关文章。笔者因业务需求,需对腾讯微博上若干账号的消息进行主题提取,故而尝试了一下该算法,...
  • a_step_further
  • a_step_further
  • 2016-04-18 08:11:04
  • 8323

NLP 主题抽取 Topic LDA代码实践 gensim包 代码

NLP 主题抽取Topic LDA代码实践 gensim包 代码         分享一个代码实践:用gensim包的LDA模型实践NLP的一个典型任务,主题抽取。         顺带提一点...
  • Scotfield_msn
  • Scotfield_msn
  • 2017-06-07 22:49:13
  • 1574

用gensim做LDA实践之文本分类

之前看LDA,一直没搞懂到底作用是什么,公式推导了一大堆,dirichlet分布求了一堆倒数,却没有真正理解精髓在哪里。最近手上遇到了一个文本分类的问题,采用普通的VSM模型的时候,运行的太慢,后来查...
  • tianbwin2995
  • tianbwin2995
  • 2016-06-27 14:43:22
  • 7456

LDA小结及在gensim中的应用

首先,感谢Rickjin的《LDA数学八卦》,能兼具如此数学功底和写作功底的人,着实不多。这是我的个人的思路小结,没有数学推导,如果想仔细研究,推荐大家去阅读那篇八卦,写的很精彩。   LDA是N...
  • qq575379110
  • qq575379110
  • 2017-05-06 23:43:31
  • 809

gensim做主题模型

作为python的一个库,gensim给了文本主题模型足够的方便,像他自己的介绍一样,topic modelling for humans 具体的tutorial可以参看他的官方网页,当然是全英...
  • whzhcahzxh
  • whzhcahzxh
  • 2013-12-24 15:28:00
  • 18984

gensim中实践LDA

????from sklearn import datasets news_dataset=datasets.fetch_20newsgroups(subset="all",remove=("head...
  • a1368783069
  • a1368783069
  • 2016-08-01 23:53:39
  • 5531
    个人资料
    持之以恒
    等级:
    访问量: 16万+
    积分: 4266
    排名: 8880
    最新评论