LDA主题模型及案例

LDA即LatentDirichletAllocation(隐含狄利克雷分布)

注意:每个文档中含有多个主题,输出主题概率分布,无监督

案例:LDA主题分类(sklearn) 自动将4个文本分为两类(聚类)

LDA分析步骤:

  1. 读取数据,并分词

  2. 去除停用词

  3. 构建Tfidf矩阵,每一行代表一个test的文档,每一列代表一个词语的tfidf值

  4. LDA分析(fit和transform),输出结果

#  -*- coding: utf-8 -*-
import jieba

filepaths = ['data/test1.txt', 'data/test2.txt', 'data/test3.txt', 'data/test4.txt']

docs = [open(f).read() for f in filepaths] #文档

docs = [jieba.lcut(doc)
        for doc in docs] #分词
print(docs)

docs = [[w
         for w in doc
         if len(w)>1]
         for doc in docs]  #本文中去停止词操作比较简单,只保留词语长度大于1的。

corpus = [' '.join(doc)
          for doc in docs]#处理之后,每个文档的词语列表,加上空格
print("分词:",corpus)

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import LatentDirichletAllocation

tfidf = TfidfVectorizer()
tfidf_matrix = tfidf.fit_transform(corpus)
print("词频统计矩阵:",tfidf_matrix)  #词频统计,4*496
# 4行指的是四个文档
# 496列是496个词语(也就是语料中一共出现了496个词语)


# '''
# 由于LDA属于聚类分析的一种,而聚类分析过程中会随机初始化,为了保证你也能得到与大邓一样的运行结果,我设置了random_state=123456。
# 当然设置成别的数字也可以,这里的random_state相当于口令,咱们两个口令一致才能得到相同的答案。如果你换了random_state,
# 那么咱们两个得到的结果可能会有出入。
# '''
lda = LatentDirichletAllocation(n_components=2,
                                random_state=123456)#n_components,由于我们有预先的知识,知道这四个文档来源于三国和三体,所以话题数K天然的等于2
docres = lda.fit_transform(tfidf_matrix)
print("分类结果矩阵:",docres) #4*2,4个文档分别属于两个话题的概率,取其中概率大的

猜你喜欢

转载自blog.csdn.net/pangxing6491/article/details/89419392