当前位置:   article > 正文

[python]LDA模型使用流程及代码_lda代码

lda代码

目录

数据预处理

去除停用词

构建LDA模型

可视化——pyLDAvis

 主题个数确认

困惑度计算

一致性得分


数据预处理

该步骤可自行处理,用excel也好,用python也罢,只要将待分析文本处理为csv或txt存储格式即可。注意:一条文本占一行

例如感想.txt:

我喜欢吃汉堡

小明喜欢吃螺蛳粉

螺蛳粉外卖好贵

以上句子来源于吃完一个汉堡还想再点碗螺蛳粉,但外卖好贵从而选择放弃的我

去除停用词

  1. import re
  2. import jieba as jb
  3. def stopwordslist(filepath):
  4. stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
  5. return stopwords
  6. # 对句子进行分词
  7. def seg_sentence(sentence):
  8. sentence = re.sub(u'[0-9\.]+', u'', sentence)
  9. #jb.add_word('词汇') # 这里是加入自定义的词来补充jieba词典
  10. sentence_seged = jb.cut(sentence.strip())
  11. stopwords = stopwordslist('自己搜来的停用词表.txt') # 这里加载停用词的路径
  12. outstr = ''
  13. for word in sentence_seged:
  14. if word not in stopwords and word.__len__()>1:
  15. if word != '\t':
  16. outstr += word
  17. outstr += " "
  18. return outstr
  19. inputs = open('感想.txt', 'r', encoding='utf-8')
  20. outputs = open('感想分词.txt', 'w',encoding='utf-8')
  21. for line in inputs:
  22. line_seg = seg_sentence(line) # 这里的返回值是字符串
  23. outputs.write(line_seg + '\n')
  24. outputs.close()
  25. inputs.close()

该步骤生成感想分词.txt:

我 喜欢 吃 汉堡

小明 喜欢 吃 螺蛳粉

螺蛳粉 外卖 好贵

句子 来源于 吃完 一个 汉堡  再点碗 螺蛳粉 外卖 好贵  选择 放弃 

构建LDA模型

假设主题个数设为4个(num_topics的参数)

  1. import codecs
  2. from gensim import corpora
  3. from gensim.models import LdaModel
  4. from gensim.corpora import Dictionary
  5. train = []
  6. fp = codecs.open('感想分词.txt','r',encoding='utf8')
  7. for line in fp:
  8. if line != '':
  9. line = line.split()
  10. train.append([w for w in line])
  11. dictionary = corpora.Dictionary(train)
  12. corpus = [dictionary.doc2bow(text) for text in train]
  13. lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=4, passes=100)
  14. # num_topics:主题数目
  15. # passes:训练伦次
  16. # num_words:每个主题下输出的term的数目
  17. for topic in lda.print_topics(num_words = 20):
  18. termNumber = topic[0]
  19. print(topic[0], ':', sep='')
  20. listOfTerms = topic[1].split('+')
  21. for term in listOfTerms:
  22. listItems = term.split('*')
  23. print(' ', listItems[1], '(', listItems[0], ')', sep='')

可视化——pyLDAvis

  1. import pyLDAvis.gensim_models
  2. '''插入之前的代码片段'''
  3. import codecs
  4. from gensim import corpora
  5. from gensim.models import LdaModel
  6. from gensim.corpora import Dictionary
  7. train = []
  8. fp = codecs.open('感想分词.txt','r',encoding='utf8')
  9. for line in fp:
  10. if line != '':
  11. line = line.split()
  12. train.append([w for w in line])
  13. dictionary = corpora.Dictionary(train)
  14. corpus = [dictionary.doc2bow(text) for text in train]
  15. lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=4, passes=100)
  16. # num_topics:主题数目
  17. # passes:训练伦次
  18. # num_words:每个主题下输出的term的数目
  19. for topic in lda.print_topics(num_words = 20):
  20. termNumber = topic[0]
  21. print(topic[0], ':', sep='')
  22. listOfTerms = topic[1].split('+')
  23. for term in listOfTerms:
  24. listItems = term.split('*')
  25. print(' ', listItems[1], '(', listItems[0], ')', sep='')
  26. d=pyLDAvis.gensim_models.prepare(lda, corpus, dictionary)
  27. '''
  28. lda: 计算好的话题模型
  29. corpus: 文档词频矩阵
  30. dictionary: 词语空间
  31. '''
  32. #pyLDAvis.show(d) #展示在浏览器
  33. # pyLDAvis.displace(d) #展示在notebook的output cell中
  34. pyLDAvis.save_html(d, 'lda_pass4.html')

这样就会生成看起来很炫酷的图啦(只是示例):

 主题个数确认

计算不同参数下结果的 Perlexity(困惑度) Coherence score(一致性评分),选择困惑度最低且一致性评分最高的参数值作为最终参数设定。

困惑度计算

  1. import gensim
  2. from gensim import corpora, models
  3. import matplotlib.pyplot as plt
  4. import matplotlib
  5. from nltk.tokenize import RegexpTokenizer
  6. from nltk.stem.porter import PorterStemmer
  7. # 准备数据
  8. PATH = "感想分词.txt" #已经进行了分词的文档(如何分词前面的文章有介绍)
  9. file_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')
  10. data_set=[] #建立存储分词的列表
  11. for i in range(len(file_object2)):
  12. result=[]
  13. seg_list = file_object2[i].split() #读取没一行文本
  14. for w in seg_list :#读取每一行分词
  15. result.append(w)
  16. data_set.append(result)
  17. print(data_set) #输出所有分词列表
  18. dictionary = corpora.Dictionary(data_set) # 构建 document-term matrix
  19. corpus = [dictionary.doc2bow(text) for text in data_set]
  20. Lda = gensim.models.ldamodel.LdaModel # 创建LDA对象
  21. #计算困惑度
  22. def perplexity(num_topics):
  23. ldamodel = Lda(corpus, num_topics=num_topics, id2word = dictionary, passes=50) #passes为迭代次数,次数越多越精准
  24. print(ldamodel.print_topics(num_topics=num_topics, num_words=20)) #num_words为每个主题下的词语数量
  25. print(ldamodel.log_perplexity(corpus))
  26. return ldamodel.log_perplexity(corpus)
  27. # 绘制困惑度折线图
  28. x = range(1,20) #主题范围数量
  29. y = [perplexity(i) for i in x]
  30. plt.plot(x, y)
  31. plt.xlabel('主题数目')
  32. plt.ylabel('困惑度大小')
  33. plt.rcParams['font.sans-serif']=['SimHei']
  34. matplotlib.rcParams['axes.unicode_minus']=False
  35. plt.title('主题-困惑度变化情况')
  36. plt.show()

 

一致性得分

  1. import gensim
  2. from gensim import corpora, models
  3. import matplotlib.pyplot as plt
  4. import matplotlib
  5. from nltk.tokenize import RegexpTokenizer
  6. from nltk.stem.porter import PorterStemmer
  7. import gensim
  8. import gensim.corpora as corpora
  9. from gensim.utils import simple_preprocess
  10. from gensim.models import CoherenceModel
  11. # 准备数据
  12. PATH = "感想分词.txt" #已经进行了分词的文档(如何分词前面的文章有介绍)
  13. file_object2=open(PATH,encoding = 'utf-8',errors = 'ignore').read().split('\n')
  14. data_set=[] #建立存储分词的列表
  15. for i in range(len(file_object2)):
  16. result=[]
  17. seg_list = file_object2[i].split() #读取没一行文本
  18. for w in seg_list :#读取每一行分词
  19. result.append(w)
  20. data_set.append(result)
  21. print(data_set) #输出所有分词列表
  22. dictionary = corpora.Dictionary(data_set) # 构建 document-term matrix
  23. corpus = [dictionary.doc2bow(text) for text in data_set]
  24. Lda = gensim.models.ldamodel.LdaModel # 创建LDA对象
  25. def coherence(num_topics):
  26. ldamodel = Lda(corpus, num_topics=num_topics, id2word = dictionary, passes=50) #passes为迭代次数,次数越多越精准
  27. coherence_model_lda = CoherenceModel(model=ldamodel, texts=data_set, dictionary=dictionary, coherence='c_v')
  28. coherence_lda = coherence_model_lda.get_coherence()
  29. print('\nCoherence Score: ', coherence_lda)
  30. return coherence_lda
  31. # 绘制困惑度折线图
  32. x = range(1,20) #主题范围数量
  33. y = [coherence(i) for i in x]
  34. plt.plot(x,y)
  35. plt.xlabel('主题数目')
  36. plt.ylabel('coherence大小')
  37. plt.rcParams['font.sans-serif']=['SimHei']
  38. matplotlib.rcParams['axes.unicode_minus']=False
  39. plt.title('主题-coherence变化情况')
  40. plt.show()

 结语

整个流程就大致是这样啦!有问题欢迎一起交流!!

 

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

闽ICP备14008679号