gensim训练LDA实战

gensim中lda模型的使用

1.首先是模型的训练
1.1 数据格式

在使用gensim训练LDA模型之前需要先训练一个词袋模型

词袋模型的输入数据是分词后的词列表

多个数据时就是列表套列表,如:

[[想,买辆,汽车]]
1.2 构建词典
from gensim import corpora, models
dictionary = corpora.Dictionary(train)

词典可以存储起来便于后续的使用

存储

dictionary.save('/gensim.dict')

加载

corpora.Dictionary.load('/gensim.dict')
1.3 转换数据

训练时使用的数据需要使用词典转换数据

corpus = [dictionary.doc2bow(text) for text in train]

然后就可以使用corpus训练LDA模型了

1.4 模型的训练
lda = models.LdaModel(corpus=corpus, id2word=dictionary, num_topics=n,iterations=m)

直接使用api训练模型,需要传入数据词典以及topic的个数和迭代的次数

1.5 模型的保存于加载

保存模型

lda.save(filename)

加载模型

lda =models.LdaModel.load(filename)
1.6 使用模型进行预测

训练好模型后会得到模型的各主题的主题词分布,使用下面的代码可以查看各主题的主题词以及权重分布

topic_list = lda.print_topics(n)
for topic in topic_list:
	print(topic)

预测使用的api是:

ret = lda.get_document_topics(corpus)

返回的结果是元祖套元祖,格式如下

((topic_id,概率)...)

因此使用下面的代码可以查看概率最高的预测topic的主题词分布(可能会预测出多个topic,这里我只取了最高的那个)

ret.sort(key = lambda x:x[1],reverse=True)
topic_list[ret[0][0]][1]
2.一些遇到的问题
2.1 预测的ret为空

在一些数据输入后,lda返回的预测结果为空,即没有预测的主题,后来发现是因为该数据由每一个topic的构成的概率都小于一个阈值,被忽略了

可以通过传入参数来设置这个阈值

ret = lda.get_document_topics(corpus,minimum_probability=1e-3)
2.2 训练的词典为空

这个暂时没找到解决办法

由于数据量比较大,无法一次加载到内存中,于是尝试使用下面的方法来加载训练数据

train = (i.strip().split() for i in f)
dictionary = corpora.Dictionary(train)

结果发现使用词典转换的数据是空的,后续的lda也没有训练,还是老老实实的使用列表存储数据

2.3 lda选型时的评价指标

有两种方式来评价,一个是perplex,另一个是使用 CoherenceModel

from gensim.models import CoherenceModel
cm = CoherenceModel(model=lda, corpus=corpus,dictionary=dictionary, coherence='u_mass')
print(f'cm={cm.get_coherence()}')
cv = CoherenceModel(model=lda, texts=train,dictionary=dictionary, coherence='c_v',processes=1)
cv_score = cv.get_coherence()

具体的解释见另一篇文章

3.gensim 的操作
3.1gensim转换后的数据的存储以及加载

在使用dictionary将训练数据转换之后,可以直接将数据存储便于后续的使用,在存储的时候需要序列化存储,使用的api是:

gensim.corpora.MmCorpus.serialize(file_name,corpus)

加载数据时使用:

gensim.corpora.MmCorpus(file_name)
3.2gensim获取topic下的主题词

lda是加载的lda模型

a = lda.get_topic_terms(0,10)
print(a)

输出结果

[(167, 0.12648638), (633, 0.073268488), (1710, 0.041437898), (4176, 0.035599157), (214, 0.035313852), (4062, 0.032541309), (1674, 0.028383246), (4101, 0.024133874), (671, 0.023899818), (8889, 0.022549478)]

前面是词的编号,后面是权重
需要使用模型将其在转换回词

print([lda.id2word[i[0]] for i in a])
['开', '分', '腿', '运动', '作用', '资料', '朋友圈', '达', '距离', '式']

另一种方式直接获取权重和词的计算公式,这是输出全部topic的模型,这里只查看topicid为0的:

topic_list = lda.print_topics(n,num_words=10)
topic_list.sort(key=lambda x:x[0])
print(topic_list[0])
(0, '0.126*"开" + 0.073*"分" + 0.041*"腿" + 0.036*"运动" + 0.035*"作用" + 0.033*"资料" + 0.028*"朋友圈" + 0.024*"达" + 0.024*"距离" + 0.023*"式"')

print_topics有两个参数 第一个是输出的topic个数,第二个是每一个topic输出的主题词的个数

3.3 使用gensim预测

在加载gensim的lda模型进行预测时,输入的数据转换为词向量的形式时不需要加载词典,直接使用lda模型转换即可

lda.id2word.doc2bow(['开', '分', '腿', '运动', '作用', '资料', '朋友圈', '达', '距离', '式'])

这样的形式就可以转换为词向量的稀疏矩阵表示

[(167, 1), (214, 1), (633, 1), (671, 1), (1674, 1), (1710, 1), (4062, 1), (4101, 1), (4176, 1), (8889, 1)]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值