【机器学习】--LDA初始和应用

一、前述

LDA是一种 非监督机器学习 技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。由于 Dirichlet分布随机向量各分量间的弱相关性(之所以还有点“相关”,是因为各分量之和必须为1),使得我们假想的潜在主题之间也几乎是不相关的,这与很多实际问题并不相符,从而造成了LDA的又一个遗留问题。

二、具体过程

对于语料库中的每篇文档,LDA定义了如下生成过程(generativeprocess):

1.对每一篇文档,从主题分布中抽取一个主题;

2.从上述被抽到的主题所对应的单词分布中抽取一个单词;

3.重复上述过程直至遍历文档中的每一个单词。

语料库中的每一篇文档与T(通过反复试验等方法事先给定)个主题的一个多项分布 (multinomialdistribution)相对应,将该多项分布记为θ。每个主题又与词汇表(vocabulary)中的V个单词的一个多项分布相对应,将这个多项分布记为φ。

三、案例

假设文章1开始有以下单词:

高斯分为主题二,是因为有一定的概率。

如此反复,当各个概率分布不再发生变化时,即完成了收敛和训练过程 训练思想仍然是EM算法(摁住一个,去计算另一个) 对比K-means

实际工程过程中: 每一个主题对每一个词都有一个基本出现次数(人工设定) 每一篇文章在各个主题上都有一个基本出现词数

步骤:

新来一片文章,需要确定它的主题分布: 先随机化主题分布 1.根据主题分布和主题-单词模型,找寻每个 单词所对应的主题 2.根据单词主题重新确定主题分布 1,2反复,直到主题分布稳定 最终得到两个模型: 1.每篇文章的主题分布 2.每个主题产生词的概率

用途: 1.根据文章的主题分布,计算文章之间的相似性 2.计算各个词语之间的相似度

四、代码

# -*- coding: utf-8 -*-

import jieba
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation


for i in range(4):
    with open('./data/nlp_test%d.txt' % i, encoding='UTF-8') as f:
        document = f.read()

        document_cut = jieba.cut(document)
        result = ' '.join(document_cut)
        print(result)
        with open('./data/nlp_test%d.txt' % (i+10), 'w', encoding='UTF-8') as f2:
            f2.write(result)
    f.close()
    f2.close()


# 从文件导入停用词表
stpwrdpath = "./data/stop_words.txt"
stpwrd_dic = open(stpwrdpath, 'r', encoding='UTF-8')
stpwrd_content = stpwrd_dic.read()
# 将停用词表转换为list
stpwrdlst = stpwrd_content.splitlines()
stpwrd_dic.close()
print(stpwrdlst)


# 向量化 不需要tf_idf
corpus = []
for i in range(4):
    with open('./data/nlp_test%d.txt' % (i+10), 'r', encoding='UTF-8') as f:
        res = f.read()
        corpus.append(res)
    print(res)

cntVector = CountVectorizer(stop_words=stpwrdlst)
cntTf = cntVector.fit_transform(corpus)
print(cntTf)

# 打印输出对应关系
# 获取词袋模型中的所有词
wordlist = cntVector.get_feature_names()
# 元素a[i][j]表示j词在i类文本中的权重
weightlist = cntTf.toarray()
# 打印每类文本的词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(weightlist)):
    print("-------第", i, "段文本的词语权重------")
    for j in range(len(wordlist)):
        print(wordlist[j], weightlist[i][j])

lda = LatentDirichletAllocation(n_components=3,#3个话题
                                learning_method='batch',
                                random_state=0)
docres = lda.fit_transform(cntTf)

print("文章的主题分布如下:")
print(docres)
print("主题的词分布如下:")
print(lda.components_)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

教程 | 一文读懂如何用LSA、PSLA、LDA和lda2vec进行主题建模

在自然语言理解任务中,我们可以通过一系列的层次来提取含义——从单词、句子、段落,再到文档。在文档层面,理解文本最有效的方式之一就是分析其主题。在文档集合中学习、...

13600
来自专栏ATYUN订阅号

如何通过热图发现图片分类任务的数据渗出

文末GitHub链接提供了生成以下图片所需的数据集和源代码。本文的所有内容都可以在具有1G内存GPU的笔记本电脑上复现。

14310
来自专栏腾讯大数据的专栏

深度卷积神经网络 CNNs 的多 GPU 并行框架 及其在图像识别的应用

将深度卷积神经网络(Convolutional Neural Networks, 简称CNNs)用于图像识别在研究领域吸引着越来越多目光。由于卷积神经网...

35250
来自专栏AI黑科技工具箱

新的正则化神器:DropBlock(Tensorflow实践)

在我们测试MNIST上,3层卷积+ dropXXX,所有参数均为改变的情况下,可以提升MNIST准确率1〜2点。

1.3K60
来自专栏AI科技大本营的专栏

Fast.ai深度学习实战课程 Lesson7 学习笔记:CNN Architectures

本篇是AI100学院此前重点推出的《Fast.ai 深度学习实战课程》(中文字幕)第七节的学习笔记,分享者胡智豪。 如果你对深度学习感兴趣,该系列课程千万不...

48060
来自专栏量化投资与机器学习

【ML系列】一招鲜,判断哪些输入特征对神经网络是重要的!

没错,但这不是今天的重点。我们想知道的是输入特征对神经网络的预测计算有多重要。例如,通过学习时间、年龄、身高和缺席人数等几个预测因素来预测谁会通过考试。直觉上,...

11920
来自专栏机器之心

训练的神经网络不工作?一文带你跨过这37个坑

选自Medium 作者:Slav Ivanov 机器之心编译 参与:黄小天、Smith 近日,Slav Ivanov 在 Medium 上发表了一篇题为《37 ...

355100
来自专栏Petrichor的专栏

深度学习: BP (反向传播) 计算 & 链式法则

每个epoch: \qquad 每个batch: \qquad\qquad 每个level (n = N, … to 1,即从顶层往底层): \qq...

35140
来自专栏腾讯大讲堂的专栏

Mariana CNN 并行框架与图像识别

本文是腾讯深度学习系列文章的第三篇,聚焦于腾讯深度学习平台Mariana中深度卷积神经网络Deep CNNs的多GPU模型并行和数据并行框架。 将深度卷积神经网...

32570
来自专栏机器之心

学界 | 新研究提出DeepXplore:首个系统性测试现实深度学习系统的白箱框架

选自arXiv 机器之心编译 作者:Kexin Pei等 参与:吴攀、李亚洲 对于自动驾驶系统等事关人身安全的深度学习应用,了解其在极端情况下的表现是非常重要的...

36590

扫码关注云+社区

领取腾讯云代金券