美文网首页
使用gensim 框架 实现 LDA主题模型

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

作者: 岁月淡如水 | 来源:发表于2019-03-25 14:46 被阅读0次

0、原理

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

整体过程就是:首先拿到文档集合,使用分词工具进行分词,得到词组序列;第二步为每个词语分配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%
原文参考:http://www.pianshen.com/article/636768367/

相关文章

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

    0、原理 整体过程就是:首先拿到文档集合,使用分词工具进行分词,得到词组序列;第二步为每个词语分配ID,既corp...

  • LDA主题模型——gensim实战

    今天我们来谈谈主题模型(Latent Dirichlet Allocation),由于主题模型是生成模型,而我们常...

  • 10 主题模型 - 代码案例一 - LDA主题模型初识

    08 主题模型 - LDA09 主题模型 - LDA参数学习-Gibbs采样 安装 lda 库使用第三方的lda库...

  • LDA模型伪代码块

    Gensim的基本用法 Gensim非常适合用来实现各种文本模型、主题模型,包括tf-idf模型、LSI模型以及L...

  • 词典构造方法之LDA主题模型

    词典构造方法之LDA主题模型 主题模型LDA原理理解 LDA是一种非监督学习技术,可以用来识别大规模文档集(doc...

  • 无监督第五节:LDA (Latent Dirichlet All

    1.算法实现 LDA是生成式概率模型。基本的观点是一个文档由多个隐主题生成,每个主题是由单词的分布式表达。 LDA...

  • LDA主题模型

    LDA数学八卦学习笔记 数学知识 Gamma函数 Gamma函数的性质其可以看作阶乘在实数集上的扩展 Gamma分...

  • LDA主题模型

    JGibbLDA是Java版本的LDA算法,可以通过命令行的方式使用,也可以通过通过调用LDACmdOption中...

  • LDA主题模型

    待整理 假设文档是由n个词组成的,且不考虑词之间的关系,假设我们的词典有V个词语,v1,v2,...vv,那么最简...

  • LDA主题模型

    一、几个基础概念 1、贝叶斯理论:先验分布+数据(似然)=后验分布2、二项分布、Beta分布与共轭分布先验分布和后...

网友评论

      本文标题:使用gensim 框架 实现 LDA主题模型

      本文链接:https://www.haomeiwen.com/subject/fuovvqtx.html