首页 > 编程语言 > 详细

[NLP]LDA主题模型的python实现

时间:2020-11-04 21:17:43      阅读:79      评论:0      收藏:0      [点我收藏+]

在做主题聚类时,主要经过以下几个步骤:

1、数据清洗:因为我是基于新浪微博来做主题的,所以需要先清洗掉数据中的各种表情符号(emoji等),以及多余的符号,清洗后再去重,会发现数据量少很多。

2、分词:这里我使用的是jieba分词,并使用了专用的词典(user_dict.txt),同时网上下载了stopwords.txt

3、lda模型训练:这里经过了建立词典、转换文本为索引并计数、计算tf-idf值、训练lda模型等步骤,具体代码如下所述(转载自博客:https://www.jianshu.com/p/9918cd4d09c1,亲测有效):

# -*- coding:utf-8 -*-
"
Created on Mon Aug 19 14:56:19 2019
@author: Luxuriant
"

import numpy as np
from gensim import corpora, models, similarities
from pprint import pprint
import time

# import logging
# logging.basicConfig(format=‘%(asctime)s : %(levelname)s : %(message)s‘, level=logging.INFO)

def load_stopword():
    ‘‘‘
    加载停用词表
    :return: 返回停用词的列表
    ‘‘‘
    f_stop = open(stopwords.txt, encoding=utf-8)
    sw = [line.strip() for line in f_stop]
    f_stop.close()
    return sw

if __name__ == __main__:

    print(1.初始化停止词列表 ------)
    # 开始的时间
    t_start = time.time()
    # 加载停用词表
    stop_words = load_stopword()

    print(2.开始读入语料数据 ------ )
    # 读入语料库
    f = open(乡贤形象文本-cutfile.txt, encoding=utf-8)
    # 语料库分词并去停用词
    texts = [[word for word in line.strip().lower().split() if word not in stop_words] for line in f]

    print(读入语料数据完成,用时%.3f秒 % (time.time() - t_start))
    f.close()
    M = len(texts)
    print(文本数目:%d个 % M)

    print(3.正在建立词典 ------)
    # 建立字典
    dictionary = corpora.Dictionary(texts)
    V = len(dictionary)

    print(4.正在计算文本向量 ------)
    # 转换文本数据为索引,并计数
    corpus = [dictionary.doc2bow(text) for text in texts]

    print(5.正在计算文档TF-IDF ------)
    t_start = time.time()
    # 计算tf-idf值
    corpus_tfidf = models.TfidfModel(corpus)[corpus]
    print(建立文档TF-IDF完成,用时%.3f秒 % (time.time() - t_start))

    print(6.LDA模型拟合推断 ------)
    # 训练模型
    num_topics = 30
    t_start = time.time()
    lda = models.LdaModel(corpus_tfidf, num_topics=num_topics, id2word=dictionary,
                      alpha=0.01, eta=0.01, minimum_probability=0.001,
                      update_every=1, chunksize=100, passes=1)
    print(LDA模型完成,训练时间为\t%.3f秒 % (time.time() - t_start))

    # 随机打印某10个文档的主题
    num_show_topic = 10  # 每个文档显示前几个主题
    print(7.结果:10个文档的主题分布:--)
    doc_topics = lda.get_document_topics(corpus_tfidf)  # 所有文档的主题分布
    idx = np.arange(M)
    np.random.shuffle(idx)
    idx = idx[:10]
    for i in idx:
        topic = np.array(doc_topics[i])
        topic_distribute = np.array(topic[:, 1])
        # print topic_distribute
        topic_idx = topic_distribute.argsort()[:-num_show_topic - 1:-1]
        print(第%d个文档的前%d个主题: % (i, num_show_topic)), topic_idx
        print(topic_distribute[topic_idx])

    num_show_term = 10  # 每个主题显示几个词
    print(8.结果:每个主题的词分布:--)
    for topic_id in range(num_topics):
        print(主题#%d:\t % topic_id)
        term_distribute_all = lda.get_topic_terms(topicid=topic_id)
        term_distribute = term_distribute_all[:num_show_term]
        term_distribute = np.array(term_distribute)
        term_id = term_distribute[:, 0].astype(np.int)
        print(词:\t, )
        for t in term_id:
            print(dictionary.id2token[t], )
        print(\n概率:\t, term_distribute[:, 1])

 部分效果图如下:

技术分享图片

[NLP]LDA主题模型的python实现

原文:https://www.cnblogs.com/mj-selina/p/13927699.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!