当前位置:   article > 正文

LDA模型原理+代码+实操_lda代码

lda代码

LDA模型主要用来生成TOPIC


前言

LDA模型需要一定的数学基础去理解,但是理解成黑盒也能一样用。

一、原理

可以通过以下资料详细了解原理。

【python-sklearn】中文文本 | 主题模型分析-LDA(Latent Dirichlet Allocation)_哔哩哔哩_bilibili

https://www.jianshu.com/p/5c510694c07e

主题模型:LDA原理详解与应用_爱吃腰果的李小明的博客-CSDN博客_lda模型

主题模型-潜在狄利克雷分配-Latent Dirichlet Allocation(LDA)_哔哩哔哩_bilibili

隐含狄利克雷分布(Latent Dirichlet Allocation,LDA),是一种主题模型topic model),典型的词袋模型,即它认为一篇文档是由一组词构成的一个集合,词与词之间没有顺序以及先后的关系。一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。它可以将文档集中每篇文档的主题按照概率分布的形式给出,对文章进行主题归纳,属于无监督学习。

需要区分的是,另外一种经典的降维方法线性判别分析(Linear Discriminant Analysis, 简称也为LDA)。此LDA在模式识别领域(比如人脸识别,舰艇识别等图形图像识别领域)中有非常广泛的应用

LDA在训练时不需要手工标注的训练集,需要的仅仅是文档集以及指定主题的数量k即可。此外LDA的另一个优点则是,对于每一个主题均可找出一些词语来描述它。选择模型中topic的数量——人为设置参数,之后输入的每篇文章都给一个topic的概率 每个topic再给其下单词概率,topic的具体实现由自己来定

具体的生成模型类比如下图所示:

二、代码

1.引入库

  1. import os
  2. import pandas as pd
  3. import re
  4. import jieba
  5. import jieba.posseg as psg

 2.路径读取

  1. output_path = '../result'
  2. file_path = '../data'
  3. os.chdir(file_path)
  4. data=pd.read_excel("data.xlsx")#content type
  5. os.chdir(output_path)
  6. dic_file = "../stop_dic/dict.txt"
  7. stop_file = "../stop_dic/stopwords.txt"

 和相同目录下创建三个文件夹:result、data、stop_dic

3.分词

  1. def chinese_word_cut(mytext):
  2. jieba.load_userdict(dic_file)
  3. jieba.initialize()
  4. try:
  5. stopword_list = open(stop_file,encoding ='utf-8')
  6. except:
  7. stopword_list = []
  8. print("error in stop_file")
  9. stop_list = []
  10. flag_list = ['n','nz','vn']
  11. for line in stopword_list:
  12. line = re.sub(u'\n|\\r', '', line)
  13. stop_list.append(line)
  14. word_list = []
  15. #jieba分词
  16. seg_list = psg.cut(mytext)
  17. for seg_word in seg_list:
  18. word = re.sub(u'[^\u4e00-\u9fa5]','',seg_word.word)
  19. find = 0
  20. for stop_word in stop_list:
  21. if stop_word == word or len(word)<2: #this word is stopword
  22. find = 1
  23. break
  24. if find == 0 and seg_word.flag in flag_list:
  25. word_list.append(word)
  26. return (" ").join(word_list)
data["content_cutted"] = data.content.apply(chinese_word_cut)

这一步稍微需要一点时间,分词处理

4.LDA分析

  1. from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
  2. from sklearn.decomposition import LatentDirichletAllocation

需要sklearn库

  1. def print_top_words(model, feature_names, n_top_words):
  2. tword = []
  3. for topic_idx, topic in enumerate(model.components_):
  4. print("Topic #%d:" % topic_idx)
  5. topic_w = " ".join([feature_names[i] for i in topic.argsort()[:-n_top_words - 1:-1]])
  6. tword.append(topic_w)
  7. print(topic_w)
  8. return tword
  9. n_features = 1000 #提取1000个特征词语
  10. tf_vectorizer = CountVectorizer(strip_accents = 'unicode',
  11. max_features=n_features,
  12. stop_words='english',
  13. max_df = 0.5,
  14. min_df = 10)
  15. tf = tf_vectorizer.fit_transform(data.content_cutted)
  16. n_topics = 8
  17. lda = LatentDirichletAllocation(n_components=n_topics, max_iter=50,
  18. learning_method='batch',
  19. learning_offset=50,
  20. # doc_topic_prior=0.1,
  21. # topic_word_prior=0.01,
  22. random_state=0)
  23. lda.fit(tf)

5.输出每个主题对应词语

  1. n_top_words = 25
  2. tf_feature_names = tf_vectorizer.get_feature_names()
  3. topic_word = print_top_words(lda, tf_feature_names, n_top_words)

6.输出每篇文章对应主题 

  1. import numpy as np
  2. topics=lda.transform(tf)
  3. topic = []
  4. for t in topics:
  5. topic.append(list(t).index(np.max(t)))
  6. data['topic']=topic
  7. data.to_excel("data_topic.xlsx",index=False)
  8. topics[0]#0 1 2

7.可视化 

  1. import pyLDAvis
  2. import pyLDAvis.sklearn
  3. pyLDAvis.enable_notebook()
  4. pic = pyLDAvis.sklearn.prepare(lda, tf, tf_vectorizer)
  5. pyLDAvis.save_html(pic, 'lda_pass'+str(n_topics)+'.html')
  6. pyLDAvis.show(pic)

8.困惑度

  1. import matplotlib.pyplot as plt
  2. plexs = []
  3. scores = []
  4. n_max_topics = 16
  5. for i in range(1,n_max_topics):
  6. print(i)
  7. lda = LatentDirichletAllocation(n_components=i, max_iter=50,
  8. learning_method='batch',
  9. learning_offset=50,random_state=0)
  10. lda.fit(tf)
  11. plexs.append(lda.perplexity(tf))
  12. scores.append(lda.score(tf))
  13. n_t=15#区间最右侧的值。注意:不能大于n_max_topics
  14. x=list(range(1,n_t))
  15. plt.plot(x,plexs[1:n_t])
  16. plt.xlabel("number of topics")
  17. plt.ylabel("perplexity")
  18. plt.show()
  1. n_t=15#区间最右侧的值。注意:不能大于n_max_topics
  2. x=list(range(1,n_t))
  3. plt.plot(x,scores[1:n_t])
  4. plt.xlabel("number of topics")
  5. plt.ylabel("score")
  6. plt.show()

三、实操

运行起来遇到了一些问题,经过查阅搜索都是环境和版本的问题,通过调整版本解决了;建议大家在conda=4.12.0,pandas=1.3.0,pyLDAvis=2.1.2的版本下进行运行,基本不会出现什么问题。

最后的结果如下:


总结

关于LDA模型理解的还不是很透彻,代码的运行中目前用csv文件的话只要改read_csv()就可以,还出了一些编码解码的问题,大家可以尝试换gbk什么的,菜鸡一枚,希望有大佬可以指教。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/358842
推荐阅读
相关标签
  

闽ICP备14008679号