首页 > 编程语言 >拓端数据tecdat|python代写主题LDA建模和t-SNE可视化

拓端数据tecdat|python代写主题LDA建模和t-SNE可视化

时间:2022-11-10 17:01:24浏览次数:50  
标签:LDA SNE python topics 主题 lda topic


 

使用潜在Dirichlet分配(LDA)和t-SNE中的可视化进行主题建模。

 

本文中的代码片段仅供您在阅读时更好地理解。有关完整的工作代码,请参阅此回购。

我们将首先介绍主题建模和t-SNE,然后将这些技术应用于两个数据集:20个新闻组和推文。

什么是主题建模?

主题模型是一套算法/统计模型,可以揭示文档集中的隐藏主题。直观地看,因为一个文件是关于某个特定话题,人们所期望的某些词出现在文档中或多或少频繁:“算法”,“编译器”,和“阵”将在大约计算机科学文档更经常出现,“关于政治的文件中的民主','政治家'和'政策',''','a'和'是'两者都可能同样出现。此外,文档通常涉及不同比例的多个主题,特别是在跨学科文档中(例如,60%关于生物学,25%关于统计学,15%关于计算机科学的生物信息学文章)。主题模型在数学框架中捕获这种直觉,以检查和发现主题可能是什么以及每个文档的主题平衡。

热门话题建模算法包括潜在语义分析(LSA),分层Dirichlet过程(HDP)和潜在Dirichlet分配(LDA),其中LDA在实践中已经显示出很好的结果,因此被广泛采用。这篇文章将使用LDA进行主题建模(对于那些喜欢了解LDA理论并且阅读公式很舒服的人,请参阅本文)。

T-SNE

t-SNE或t分布随机邻域嵌入是用于高维数据可视化的维数降低算法。这部分是为了减轻人类不能(至少现在不能)感知超过3-D的向量空间这一事实。

这是一个减少784-D数字表示并在三维空间中可视化的示例(信用:Google嵌入项目)

拓端数据tecdat|python代写主题LDA建模和t-SNE可视化_数据

t-SNE是不确定的,其结果取决于数据批次。换句话说,相对于批次中的其他数据点,相同的高维数据点可以被转换成不同批次的不同2-D或3-D向量。

可以使用各种语言实现t-SNE,但速度可能会有所不同。例如,我对C ++和Python包装器以及Python sklearn版本进行了比较,发现前者在矩阵转换速度方面通常快3倍:

环境

15-inch MacBook Pro, macOS Sierra

2.2 GHz Intel Core i7 processor

16 GB 1600 MHz DDR3 memory

1.将10,000 x 50矩阵转换为10,000 x 2

C ++和Python

real 1m2.662s

user 1m0.575s

sys 0m1.929s

Python sklearn

real 3m29.883s

user 2m22.748s

sys 1m7.010s

2.将20,000 x 50矩阵转换为20,000 x 2

C ++和Python

real 2m40.250s

user 2m32.400s

sys 0m6.420s

Python sklearn

real 6m54.163s

user 4m17.524s

sys 2m31.693s

3.将1,000,000 x 25矩阵转换为1,000,000 x 2

C ++和Python

real 224m55.747s

user 216m21.606s

sys 8m21.412s

Python sklearn

out of memory... :(

t-SNE的作者说,他们“已经将这项技术应用于数据集,最多有3000万个例子”(尽管他没有指定数据和运行时的维度)。如果你有一个更大的数据集,你可以扩大你的硬件,调整参数(例如,sklearn的t-SNE中的angle参数),或尝试替代(如LargeVis,其作者声称“与tSNE比较,LargeVis显着降低了图形构建步骤的计算成本“。我还没有测试过它。

把它放在一起:20个新闻组的例子

足够的理论:让我们亲自动手吧。在本节中,我们将在20个新闻组数据集上应用LDA算法,以发现每个文档中的基础主题,并使用t-SNE将它们显示为组。

获取数据

幸运的是,它sklearn具有轻松检索和过滤20个新闻组数据的功能:

from sklearn.datasets import fetch_20newsgroups

# we only want to keep the body of the documents!

remove = ('headers', 'footers', 'quotes')

# fetch train and test data

newsgroups_train = fetch_20newsgroups(subset ='train', remove =remove)

newsgroups_test = fetch_20newsgroups(subset ='test', remove =remove)

# a list of 18,846 cleaned news in string format

# only keep letters & make them all lower case

news = [' ' .join(filter(unicode .isalpha, raw .lower() .split())) for raw in

newsgroups_train .data + newsgroups_test .data]

LDA模型

在我们获得清理后的数据后,我们可以对令牌进行矢量化并训练LDA模型:

import lda

from sklearn.feature_extraction.text import CountVectorizer

n_topics = 20 # number of topics

n_iter = 500 # number of iterations

# vectorizer: ignore English stopwords & words that occur less than 5 times

cvectorizer = CountVectorizer(min_df =5, stop_words ='english')

cvz = cvectorizer .fit_transform(news)

# train an LDA model

lda_model = lda .LDA(n_topics =n_topics, n_iter =n_iter)

X_topics = lda_model .fit_transform(cvz)

其中X_topics是18,846(num_news)乘20(n_topics)矩阵。注意,我们在这里有一个很好的概率解释:每一行是属于某个主题的这个新闻的概率分布(由我们的LDA模型学习)(例如,X_topics[0][0]代表属于主题1的第一个新闻的可能性)。

用t-SNE减少到2-D

我们有一个学习过的LDA模型。但我们无法直观地检查我们的模型有多好。t-SNE来救援:

from sklearn.manifold import TSNE

# a t-SNE model

# angle value close to 1 means sacrificing accuracy for speed

# pca initializtion usually leads to better results

tsne_model = TSNE(n_components =2, verbose =1, random_state =0, angle =.99, init='pca')

# 20-D -> 2-D

tsne_lda = tsne_model .fit_transform(X_topics)

可视化组及其关键字

现在,我们已准备好使用流行的Python可视化库散景来可视化新闻组和关键字。

首先我们做一些设置工作(导入类和函数,设置参数等):

import numpy as np

import bokeh.plotting as bp

from bokeh.plotting import save

from bokeh.models import HoverTool

n_top_words = 5 # number of keywords we show

# 20 colors

colormap = np .array([

"#1f77b4", "#aec7e8", "#ff7f0e", "#ffbb78", "#2ca02c",

"#98df8a", "#d62728", "#ff9896", "#9467bd", "#c5b0d5",

"#8c564b", "#c49c94", "#e377c2", "#f7b6d2", "#7f7f7f",

"#c7c7c7", "#bcbd22", "#dbdb8d", "#17becf", "#9edae5"

])

然后我们找到每个新闻最可能的主题:

_lda_keys = []

for i in xrange(X_topics .shape[0]):

_lda_keys += _topics[i] .argmax(),

并获得每个主题的顶级单词:

topic_summaries = []

topic_word = lda_model .topic_word_ # all topic words

vocab = cvectorizer .get_feature_names()

for i, topic_dist in enumerate(topic_word):

topic_words = np .array(vocab)[np .argsort(topic_dist)][: -(n_top_words + 1): -1] # get!

topic_summaries .append(' ' .join(topic_words)) # append!

最后但并非最不重要的是,我们绘制新闻(每个点代表一个新闻):

title = '20 newsgroups LDA viz'

num_example = len(X_topics)

plot_lda = bp .figure(plot_width =1400, plot_height =1100,

title =title,

tools ="pan,wheel_zoom,box_zoom,reset,hover,previewsave",

x_axis_type =None, y_axis_type =None, min_border =1)

plot_lda .scatter(x =tsne_lda[:, 0], y =tsne_lda[:, 1],

color =colormap[_lda_keys][:num_example],

source =bp .ColumnDataSource({

"content": news[:num_example],

"topic_key": _lda_keys[:num_example]

}))

并绘制每个主题的关键词:

# randomly choose a news (within a topic) coordinate as the crucial words coordinate

topic_coord = np .empty((X_topics .shape[1], 2)) * np .nan

for topic_num in _lda_keys:

if not np .isnan(topic_coord) .any():

break

topic_coord[topic_num] = tsne_lda[_lda_keys .index(topic_num)]

# plot crucial words

for i in xrange(X_topics .shape[1]):

plot_lda .text(topic_coord[i, 0], topic_coord[i, 1], [topic_summaries[i]])

# hover tools

hover = plot_lda .select(dict(type =HoverTool))

hover .tooltips = {"content": "@content - topic: @topic_key"}

# save the plot

save(plot_lda, '{}.html' .format(title))

这是很多代码...但如果你已经做到这一点,你会得到一个像这样的交互式情节:

拓端数据tecdat|python代写主题LDA建模和t-SNE可视化_python_02

拓端数据tecdat|python代写主题LDA建模和t-SNE可视化_建模_03

当我们为每个文档分配一个主要主题时,有些情况甚至最可能的主题的概率相当低(极端情况是每个主题被分配5%,即,均匀分布)。换句话说,我们的模型无法自信(利润率很高)为这样的新闻分配主题。

一种解决方法是添加一个阈值因子,以帮助过滤掉非自信的分配。在我们训练LDA模型之后,在我们使用t-SNE减少维数之前,简单地说明这些线:

import numpy

threshold = 0.5

_idx = np .amax(X_topics, axis =1) > threshold # idx of doc that above the threshold

X_topics = X_topics[_idx]

并重新运行我们将得到的代码:

拓端数据tecdat|python代写主题LDA建模和t-SNE可视化_数据_04

看起来好多了:孤立和明确的团体!然而,我们以牺牲非自信的任务为代价来实现这一目标(在这种情况下,超过一半的数据)。这表明我们的LDA模型只能从这个数据集中学到很多,而且我们的模型没有信心为所有新闻分配一个好的主题。

也就是说,如果你仔细检查每个主题,那么为每个主题学到的热门话语都有一定道理:例如,'医疗保健使用号码患者'(医疗保健)反对'god jesus christian bible'(宗教)。

推文示例

Twitter已成为最受欢迎的新闻和社交网络服务(SNS)平台之一。在上一篇博客实时Twitter趋势发现中,我们讨论了如何实时可视化Twitter趋势。然而,我们也可以使用推文语料库来模拟主题。

我们希望将推文保存到磁盘并积累一定数量(至少数百万)来有效地模拟主题,而不是将推文放在内存中进行实时处理。

首先,我们需要建立一个推文连接:请查看本节的内容。凭借凭据,我们可以抓取实时推文:

至少花一两天时间来积累相当数量的推文。有时连接可能会中断:只需重新运行脚本,以便将新推文保存到磁盘。

获得足够的推文后,我们可以加载推文,处理它们,对它们进行矢量化并计算tf-idf分数,训练LDA模型,减少到2-D,并可视化结果。请参阅此处的完整脚本。

你会得到一个如下图:

拓端数据tecdat|python代写主题LDA建模和t-SNE可视化_建模_05

拓端数据tecdat|python代写主题LDA建模和t-SNE可视化_python_06


标签:LDA,SNE,python,topics,主题,lda,topic
From: https://blog.51cto.com/u_14293657/5841873

相关文章

  • AD域/OpenLDAP账号密码被修改或过期,802.1x认证自动重连导致账户被锁定,无法上网怎么办?
    搭建了微软ActiveDirectory(AD)或OpenLDAP的企业,通常会让员工使用AD域账号或OpenLDAP账号密码登录电脑终端、OA、VPN、VDI或进行网络接入802.1x认证。AD域/OpenLDAP......
  • Python之os模块
    Python之os模块os是operationsystem(操作系统)的缩写;os模块就是python对操作系统操作接口的封装。os模块提供了多数操作系统的功能接口函数。(OS模块提供了与操作系统进行......
  • 【python】点燃我,温暖你 ,快来Get同款~
    前言大家早好、午好、晚好吖❤~最近,一部名叫《点燃我,温暖你》得电视剧冲进了大家得视野~讲述得是肆意张扬的编程天才李峋与勇敢坚韧的少女学霸朱韵从青涩校园到职场......
  • Python第十章实例、实战
    01    02      03    04      05      06    实战一       实例二     ......
  • ✍73 配置sqlalchemy及STPython
    使用SQLAlchemy来操作神通数据库需对原有SQLAlchemy包进行扩展:神通oscar方言(mysql,oracle之类的数据库都有方言)对Python解释器也进行扩展:神通STPytho......
  • Python爬虫的scrapy框架的简单应用
    load_mzitu\mzitu\​​item.py​​#-*-coding:utf-8-*-#Defineherethemodelsforyourscrapeditems##Seedocumentationin:#http://doc.scrapy.org/en/latest/......
  • python 解构生成的可执行文件(如main.exe)
    python打包成的main.exe中包含了哪些东西,可以通过以下命令解压到当前目录下一个名为 main.exe_extracted的文件夹中:pythonpyinstxtractor.pymainx.exe文件pyi......
  • 成品直播源码推荐,python实现列表插入、查找、删除
    成品直播源码推荐,python实现列表插入、查找、删除#列表的插入、查找、删除实现 classTestArray:  def__init__(self,capacity)->None:    #由于python......
  • Python批量创建文件和文件夹
    Python批量创建文件和文件夹前言:本来计划利用windows批处理脚本批量创建文件和文件夹(文件和文件名称顺序命名),编写批处理脚本过程中,出现很多问题难以解决,耗费时间过多。既......
  • python 代码打包成可执行文件 pyinstaller
    1.打包为一个目录pyinstaller-Dxxx.py2.打包为一个文件pyinstaller-Fxxx.py打包过程中会生成一个xxx.spec文件,如果有自定义的引用,可以修改这个文件,然后执......