【NLP】文本LDA主题聚类&主题词生成&PyLDAvis可视化

【NLP】文本LDA主题聚类&主题词生成&可视化

LDA主题聚类

这是NLP中常用的一类方法,一般Sklearn,genism里有可以实现。一般结果会有文档-主题model(即说明每个文档属于某类主题的概率),概率最大则说明该文档属于该类别。以及主题-词语model,可以给出每个主题的前N个词。

主要部分代码:

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
import lda

vectorizer = CountVectorizer(min_df=10, stop_words=stopwords)  # 定义计数器
transformer = TfidfTransformer()  # 该类会统计每个词语的tf-idf权值
tf = vectorizer.fit_transform(documents)  # 计算TF
tfidf = transformer.fit_transform(tf)  # fit_transform计算tf-idf,fit_transform将文本转为词频矩阵
vocab = vectorizer.get_feature_names()

model = lda.LDA(n_topics=5, n_iter=150, random_state=1)
model.fit(tf)
topic_words = model.topic_word_
# 显示每个话题的前10词
n = 10
topickey=[]
for i, t in enumerate(topic_words):
    topicwords = np.array(vocab)[np.argsort(-t)][:n]
    print('*Topic {}\n- {}'.format(i+1, ' '.join(topicwords)))
    topickey.append(','.join(topicwords))
print(topickey)

# 显示前10个文本的前K个话题
k = 1
doc_topic = model.doc_topic_
print(model.doc_topic_)
for i in range(194):
    topic_most_pr = doc_topic[i].argsort()[::-1]
    print("doc: {} topic: {}".format(textnames[i], topic_most_pr[:k][0]+1))
  # 如果k不等于1,上面topic_most_pr[:k][0]换成topic_most_pr[:k]

这里对于爬取的一些知乎关于疫情的评论数据进行结果示意:
(1)每一类的主题词:
在这里插入图片描述
(2)每一条评论属于哪一类(取概率最大的一类)
解释下图1:比如矩阵的第一个列表就是文档0分别属于(设置分5类)各类的概率,可见属于第3类概率最大。(类别为了好记已经全加1,从第1类开始)
可见图2:输出最大概率的类,结果的确是类3
在这里插入图片描述
在这里插入图片描述

Pyldavis进行可视化

这部分是由于在评估聚类效果的时候,不确定类别是否重叠,因此用pyldavis这个可以对LDA进行可视化的包。
先用sklearn LDA进行运行,再利用PyLdavis可视化。
划分的4类最合适,划分5类及以上有重叠情况:
在这里插入图片描述
在这里插入图片描述
代码里特征数需要注意,这个数值会影响聚类结果和右侧的词频分布。(实验中发现)
在这里插入图片描述
一些中间结果:
在这里插入图片描述
在这里插入图片描述2020-02-09 By EchoZhang

  • 14
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值