美文网首页
利用Python进行LDA特征提取

利用Python进行LDA特征提取

作者: luxuriants | 来源:发表于2019-08-19 17:18 被阅读0次

LDA(Latent Dirichlet Allocation):潜在狄利克雷分布,是一种非监督机器学习技术。它认为一篇文档是有多个主题的,而每个主题又对应着不同的词。一篇文档的构造过程,首先是以一定的概率选择某个主题,然后再在这个主题下以一定的概率选出某一个词,这样就生成了这篇文档的第一个词。不断重复这个过程,就生成了整篇文章(当然这里假定词与词之间是没有顺序的,即所有词无序的堆放在一个大袋子中,称之为词袋,这种方式可以使算法相对简化一些)。

LDA的使用是上述文档生成过程的逆过程,即根据一篇得到的文档,去寻找出这篇文档的主题,以及这些主题所对应的词。LDA是NLP领域一个非常重要的非监督算法。

白话解释:比如document的内容为:[自从乔布斯去世之后,iPhone再难以产生革命性的创新了]
通过上述的方法,document将对应两个主题topic1,topic2,进而,主题topic1会对应一些词:[苹果创始人][苹果手机],主题topic2会对应一些词:[重大革新][技术突破]。于是LDA模型的好处显而易见,就是可以挖掘文档中的潜在词或者找到两篇没有相同词的文档之间的联系。

我们的目标是找到每一篇文档的主题分布和每一个主题中词的分布。

在LDA模型中,我们需要先假定一个主题数K,这样所有的分布就都基于K个主题展开。那么具体LDA模型是怎么样的呢?具体如下图:

详细模型原理见CSDN博主蠡1204
原文链接:https://blog.csdn.net/qq_40006058/article/details/85865695

图1.png

解释了这么多,下面就看看详细代码。

# -*- 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])

最后让我们来看看处理的结果!(由于分词中,一些无用词没被全部去除,导致效果并理想。大家再用之前一定要处理好停用词。)

处理结果1.png
处理结果2.png

由于我的文本比较长,分的主题也比较多,就不全部展示给大家了,上面的两张图给大家看一下效果。

今天第一次用markDown插入代码,发现简书的一些标题版式都没了,所以布局不怎么好看,大家多担待,喜欢的请点赞。

相关文章

  • 利用Python进行LDA特征提取

    LDA(Latent Dirichlet Allocation):潜在狄利克雷分布,是一种非监督机器学习技术。它认...

  • 9/100

    plan: 上午: 起床:8:20 特征提取,总流程图; 下午: 洗头,睡觉 lda; 晚上: 行测 数据,整理论...

  • 7/100

    明天依然是论文为主 明天把论文改完,只差程序 程序方面,要做个纹理特征提取,和lda特征选择 这周末之前做好就行

  • 使用Python创建LDA模型进行分类

    来源:数据分析网 线性判别式分析(Linear Discriminant Analysis)简称LDA,是模式识别...

  • 2019-10-12

    原文请看利用Python进行数据分析(10) pandas基础: 处理缺失数据 利用Python进行数据分析(10...

  • 文本挖掘

    1文本词频分析(中英文各一份)及列表的sort()使用2如何利用python统计英文文章词频3主题模型 LDA 入...

  • 《利用Python进行数据分析》PDF高清完整版-免费下载

    《利用Python进行数据分析》PDF高清完整版-免费下载 《利用Python进行数据分析》PDF高清完整版-免费...

  • 利用Python进行数据分析 - 准备工作

    概述 该系列是关于《利用Python进行数据分析》的学习笔记。 涉及内容 主要介绍如何利用Python来进行数据控...

  • 08 特征工程 - 特征降维 - LDA

    线性判断分析(LDA): LDA是一种基于分类模型进行特征属性合并的操作,是一种有监督的降维方法。 LDA原理 L...

  • 利用python进行爬虫

    今天,我们来学习爬虫。什么是爬虫呢? 简单来讲,爬虫是指使用一定的手段自动抓取网页上的内容。它是搜索引擎的核心技术...

网友评论

      本文标题:利用Python进行LDA特征提取

      本文链接:https://www.haomeiwen.com/subject/kfkesctx.html