• 登录
Skip to content

一起大数据-技术文章心得

一起大数据网由数据爱好者发起并维护,专注数据分析、挖掘、大数据相关领域的技术分享、交流。不定期组织爱好者聚会,期待通过跨行业的交流和碰撞,更好的推进各领域数据的价值落地。

Menu
  • 首页
  • 大数据案例
  • 数据&电子书
  • 视频
    • Excel视频
    • VBA视频
    • Mysql视频
    • 统计学视频
    • SPSS视频
    • R视频
    • SAS视频
    • Python视频
    • 数据挖掘视频
    • 龙星计划-数据挖掘
    • 大数据视频
    • Machine Learning with Python
  • 理论
    • 统计学
    • 数据分析
    • 机器学习
    • 大数据
  • 软件
    • Excel
    • Modeler
    • Python
    • R
    • SAS
    • SPSS
    • SQL
    • PostgreSQL
    • KNIME
  • 技术教程
    • SQL教程
    • SPSS简明教程
    • SAS教程
    • The Little SAS Book
    • SAS EG教程
    • R语言教程
    • Python3教程
    • IT 技术速查手册
    • Data Mining With Python and R
    • SAS Enterprise Miner
  • 问答社区
  • 我要提问
Menu

使用gensim 框架 实现 LDA主题模型

Posted on 2022年9月20日

0、原理

LDA文档主题生成模型,也称三层贝叶斯概率模型,包含词、主题和文档三层结构。gensim流程如图所示:

整体过程就是:首先拿到文档集合,使用分词工具进行分词,得到词组序列;第二步为每个词语分配ID,既corpora.Dictionary;分配好ID后,整理出各个词语的词频,使用“词ID:词频”的形式形成稀疏向量,使用LDA模型进行训练。

1、代码实现

 

from gensim import corpora, models
import jieba.posseg as jp, jieba
# 文本集
texts = [
    '美国教练坦言,没输给中国女排,是输给了郎平',
    '美国无缘四强,听听主教练的评价',
    '中国女排晋级世锦赛四强,全面解析主教练郎平的执教艺术',
    '为什么越来越多的人买MPV,而放弃SUV?跑一趟长途就知道了',
    '跑了长途才知道,SUV和轿车之间的差距',
    '家用的轿车买什么好']
jieba.add_word('四强', 9, 'n')
flags = ('n', 'nr', 'ns', 'nt', 'eng', 'v', 'd')  # 词性
stopwords = ('没', '就', '知道', '是', '才', '听听', '坦言', '全面', '越来越', '评价', '放弃', '人') 
words_ls = []
for text in texts:
    words = [word.word for word in jp.cut(text) if word.flag in flags and word.word not in stopwords]
    words_ls.append(words)
# print(words_ls)
#去重,存到字典
dictionary = corpora.Dictionary(words_ls)
# print(dictionary)
corpus = [dictionary.doc2bow(words) for words in words_ls]
# print(corpus)
lda = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=2)
for topic in lda.print_topics(num_words=4):
    print(topic)
# 主题推断
# print(lda.inference(corpus))
text5 = '中国女排将在郎平的率领下向世界女排三大赛的三连冠发起冲击'
bow = dictionary.doc2bow([word.word for word in jp.cut(text5) if word.flag in flags and word.word not in stopwords])
ndarray = lda.inference([bow])[0]
print(text5)
for e, value in enumerate(ndarray[0]):
    print('\t主题%d推断值%.2f' % (e, value))
    
word_id = dictionary.doc2idx(['体育'])[0]
for i in lda.get_term_topics(word_id):
    print('【长途】与【主题%d】的关系值:%.2f%%' % (i[0], i[1]*100))

2、过程详解

2.1 打印中间过程

print(words_ls)

这是分词过程,然后每句话/每段话构成一个单词的列表,结果如下所示:
[[‘美国’, ‘输给’, ‘中国女排’, ‘输给’, ‘郎平’],
[‘美国’, ‘无缘’, ‘四强’, ‘主教练’],
[‘中国女排’, ‘晋级’, ‘世锦赛’, ‘四强’, ‘主教练’, ‘郎平’, ‘执教’, ‘艺术’],
[‘买’, ‘MPV’, ‘SUV’, ‘跑’, ‘长途’],
[‘跑’, ‘长途’, ‘SUV’, ‘轿车’, ‘差距’],
[‘家用’, ‘轿车’, ‘买’]]

print(dictionary.token2id)

{‘中国女排’: 0, ‘美国’: 1, ‘输给’: 2, ‘郎平’: 3, ‘主教练’: 4, ‘四强’: 5, ‘无缘’: 6, ‘世锦赛’: 7, ‘执教’: 8, ‘晋级’: 9, ‘艺术’: 10, ‘MPV’: 11, ‘SUV’: 12, ‘买’: 13, ‘跑’: 14, ‘长途’: 15, ‘差距’: 16, ‘轿车’: 17, ‘家用’: 18}

print(corpus)

按照词ID:词频构成corpus:
[[(0, 1), (1, 1), (2, 2), (3, 1)],
[(1, 1), (4, 1), (5, 1), (6, 1)],
[(0, 1), (3, 1), (4, 1), (5, 1), (7, 1), (8, 1), (9, 1), (10, 1)],
[(11, 1), (12, 1), (13, 1), (14, 1), (15, 1)],
[(12, 1), (14, 1), (15, 1), (16, 1), (17, 1)],
[(13, 1), (17, 1), (18, 1)]]

print(lda)

LdaModel(num_terms=19, num_topics=2, decay=0.5, chunksize=2000)

print(topic)

前面设置了num_topics = 2 所以这里有两个主题,很明显第一个是汽车相关topic,第二个是体育相关topic。
(0, ‘0.089“跑” + 0.088“SUV” + 0.088“长途” + 0.069“轿车”‘)
(1, ‘0.104“美国” + 0.102“输给” + 0.076“中国女排” + 0.072“郎平”‘)

2.2 主题推断

print(lda.inference(corpus))

上面语料属于哪个主题:
(array([[5.13748 , 0.86251986],
[0.6138436 , 4.386156 ],
[8.315966 , 0.68403417],
[5.387934 , 0.612066 ],
[5.3367395 , 0.6632605 ],
[0.59680593, 3.403194 ]], dtype=float32), None)

for e, values in enumerate(lda.inference(corpus)[0]):
    print(texts[e])
    for ee, value in enumerate(values):
        print('\t主题%d推断值%.2f' % (ee, value))

美国教练坦言,没输给中国女排,是输给了郎平
主题0推断值0.62
主题1推断值5.38
美国无缘四强,听听主教练的评价
主题0推断值1.35
主题1推断值3.65
中国女排晋级世锦赛四强,全面解析主教练郎平的执教艺术
主题0推断值0.82
主题1推断值8.18
为什么越来越多的人买MPV,而放弃SUV?跑一趟长途就知道了
主题0推断值1.63
主题1推断值4.37
跑了长途才知道,SUV和轿车之间的差距
主题0推断值0.65
主题1推断值5.35
家用的轿车买什么好
主题0推断值3.38
主题1推断值0.62

做了几次不知道是不是因为语料太短的原因,效果比较差,分类很不准确。

text5 = '中国女排将在郎平的率领下向世界女排三大赛的三连冠发起冲击'
bow = dictionary.doc2bow([word.word for word in jp.cut(text5) if word.flag in flags and word.word not in stopwords])
ndarray = lda.inference([bow])[0]
print(text5)
for e, value in enumerate(ndarray[0]):
    print('\t主题%d推断值%.2f' % (e, value))

中国女排将在郎平的率领下向世界女排三大赛的三连冠发起冲击
主题0推断值2.40
主题1推断值0.60

word_id = dictionary.doc2idx(['长途'])[0]
for i in lda.get_term_topics(word_id):
    print('【长途】与【主题%d】的关系值:%.2f%%' % (i[0], i[1]*100))

【长途】与【主题0】的关系值:1.61%
【长途】与【主题1】的关系值:7.41%

恭喜你,又看完一篇文章,扫码领个红包吧!图片

发表评论 取消回复

要发表评论,您必须先登录。

推荐访问

欢迎加入我们的付费交流社群,增长见识,互帮互助! 自2023-05-01起正式运营。
图片

数据分析交流:数据分析交流
Excel学习: Excel学习交流
Python交流:一起学习Python(数据分
SQL交流:一起学习SQL(数据分析
微博:一起大数据

最新提问

  • 统计方面的3个Python包
  • 更新R及Rstudio
  • TFP CausalImpact:一个Python包,用于估计设计干预对时间序列的因果效应
  • 根据公式的结构,写出计算的表达式,并结算结果
  • excel中提取超级链接公式中的链接地址
  • 用python解析公式并进行可视化
  • Python设置镜像源默认为清华的方法
  • VAR、VMA、VARMA 和 ARIMA
  • Python 的表达式解析库来解析公式
  • PandasAI:一个Python库,将生成式AI能力集成到Pandas中,允许进行高级数据分析任务,例如数据合成和增强

文章标签

AMOS CBC Excel GBDT KNN Modeler Mysql pandas PostgreSQL python python数据可视化 R SAS sklearn SPSS SQL SVM Tableau TensorFlow VBA 主成分分析 关联规则 决策树 协同过滤 可视化 因子分析 大数据 大数据分析 推荐系统 数据分析 数据可视化 数据挖掘 数据透视表 文本挖掘 时间序列 机器学习 深度学习 神经网络 结构方程 统计学 联合分析 聚类 聚类分析 逻辑回归 随机森林
©2023 一起大数据-技术文章心得 | Design: Newspaperly WordPress Theme