ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LDA

2022-02-20 15:31:23  阅读:216  来源: 互联网

标签:LDA dictionary doc tokens num 文档 print


  1 #!/usr/bin/python
  2 # coding:utf8
  3 """
  4 Created on 2018-03-13
  5 Updated on 2018-03-13
  6 Author: 片刻
  7 GitHub: https://github.com/apachecn/AiLearning
  8 Coding: http://blog.csdn.net/github_36299736/article/details/54966460
  9 通俗理解:https://blog.csdn.net/qq_39422642/article/details/78730662
 10 """
 11 
 12 import gensim
 13 from gensim import corpora, models
 14 from nltk.stem.porter import PorterStemmer
 15 from nltk.tokenize import RegexpTokenizer
 16 from stop_words import get_stop_words
 17 
 18 # 创建示例文档
 19 doc_a = "Brocolli is good to eat. My brother likes to eat good brocolli, but not my mother."
 20 doc_b = "My mother spends a lot of time driving my brother around to baseball practice."
 21 doc_c = "Some health experts suggest that driving may cause increased tension and blood pressure."
 22 doc_d = "I often feel pressure to perform well at school, but my mother never seems to drive my brother to do better."
 23 doc_e = "Health professionals say that brocolli is good for your health."
 24 # 将示例文档编译成列表
 25 doc_set = [doc_a, doc_b, doc_c, doc_d, doc_e]
 26 
 27 
 28 # 创建PorterStemmer类的p_stemmer
 29 p_stemmer = PorterStemmer()
 30 # 分词:将文档转化为其原子元素
 31 tokenizer = RegexpTokenizer(r'\w+')
 32 # 创建英文停用词列表
 33 en_stop = get_stop_words('en')
 34 
 35 # print(p_stemmer.stem('boys')) # 输出boy
 36 
 37 
 38 # 循环中标记的文档列表
 39 texts = []
 40 # 遍历文档列表
 41 for i in doc_set:
 42 
 43     # 清理并标记文档字符串
 44     raw = i.lower()
 45     tokens = tokenizer.tokenize(raw)
 46     print(tokens)
 47 
 48     # 从令牌中删除停用词(停用词处理:移除无意义的词)
 49     stopped_tokens = [i for i in tokens if not i in en_stop]
 50 
 51     # 词干令牌(词干提取:将同义词合并)
 52     stemmed_tokens = [p_stemmer.stem(i) for i in stopped_tokens]
 53     # 添加令牌列表
 54     texts.append(stemmed_tokens)
 55 
 56 # 把我们的标记文档转换成一个id <-> 词条字典
 57 dictionary = corpora.Dictionary(texts)
 58 print(dictionary.token2id)  # 来查看每个单词的id
 59 # print(dictionary.roken2id)  # 显示 brocolli 的 id 是 0
 60 
 61 # 将标记文档转换为文档术语矩阵
 62 # doc2bow() 方法将 dictionary 转化为一个词袋
 63 corpus = [dictionary.doc2bow(text) for text in texts]
 64 
 65 
 66 # 生成LDA模型
 67 """
 68 LdaModel 类的详细描述可以在 gensim 文档中查看。我们的实例中用到的参数:
 69 
 70 参数:
 71 num_topics: 必须。LDA 模型要求用户决定应该生成多少个主题。由于我们的文档集很小,所以我们只生成三个主题。
 72 id2word: 必须。LdaModel 类要求我们之前的 dictionary 把 id 都映射成为字符串。
 73 passes: 可选。模型遍历语料库的次数。遍历的次数越多,模型越精确。但是对于非常大的语料库,遍历太多次会花费很长的时间。
 74 """
 75 # ldamodel = gensim.models.ldamodel.LdaModel(
 76 #     corpus, num_topics=3, id2word=dictionary, passes=20)
 77 
 78 # print(dir(ldamodel))
 79 # print(ldamodel.print_topics(num_topics=3, num_words=3))  
 80 
 81 """
 82 这是什么意思呢?每一个生成的主题都用逗号分隔开。每个主题当中有三个该主题当中最可能出现的单词。即使我们的文档集很小,这个模型依旧是很可靠的。还有一些需要我们考虑的问题:
 83 
 84 - health, brocolli 和 good 在一起时有很好的含义。
 85 - 第二个主题有点让人疑惑,如果我们重新查看源文档,可以看到 drive 有很多种含义:driving a car 意思是开车,driving oneself to improve 是激励自己进步。这是我们在结果中需要注意的地方。
 86 - 第三个主题包含 mother 和 brother,这很合理。
 87 
 88 调整模型的主题数和遍历次数对于得到一个好的结果是很重要的。两个主题看起来更适合我们的文档。
 89 """
 90 
 91 lda = gensim.models.ldamodel.LdaModel(
 92     corpus, num_topics=3, id2word=dictionary, passes=20)
 93 
 94 print(lda.print_topics(num_topics=3, num_words=3))   
 95 print(lda[corpus[2]])  

 

标签:LDA,dictionary,doc,tokens,num,文档,print
来源: https://www.cnblogs.com/zxcayumi/p/15915560.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有