当前位置: 首页 > 后端技术 > Python

Topictecdat-pythonTopicLDAModelingandt-SNEVisualization

时间:2023-03-26 14:59:08 Python

原文:http://tecdat.cn/?p=4261使用LatentDirichletAllocation(LDA)的主题建模和t-SNE中的可视化。本文中的代码片段只是为了让您在阅读时更好地理解。有关完整的工作代码,请参阅此repo。我们将首先介绍主题建模和t-SNE,然后将这些技术应用于两个数据集:20个新闻组和推文。什么是主题建模?主题模型是一组算法/统计模型,可以揭示文档集合中的隐藏主题。直觉上,因为一篇文档是关于特定主题的,所以人们会期望某些词或多或少地出现在文档中:“算法”、“编译器”和“数组”会出现在关于计算机科学的文档中。更常见的是,“民主”','politician'和'policy'在有关政治的文档中,''','a'和'yes'可能都出现。此外,文档经常引用不同比例的主题,尤其是在跨学科文档中(例如,生物学60%,统计学25%,计算机科学中的生物信息学文章15%)。主题模型在数学框架中捕捉这种直觉,以检查和发现可能的主题以及每个文档的主题平衡。热门主题建模算法包括潜在语义分析(LSA)、分层狄利克雷过程(HDP)和潜在狄利克雷分配(LDA),其中LDA在实践中已经显示出很好的效果,所以被广泛采用。本贴将使用LDA进行主题建模(喜欢了解LDA理论且能轻松阅读公式的朋友请参考本贴)。T-SNEt-SNE或t-distributedrandomneighborDomainembedding是一种用于高维数据可视化的降维算法。这在一定程度上是为了减轻人类不能(至少现在还不能)感知3-D以外的向量空间这一事实。它是784维数值表示的缩减,在3D空间可视化示例中(来源:谷歌嵌入式项目)t-SNE是不确定的,其结果取决于数据批次。也就是说,同一个高维数据点相对于batch中的其他数据点可以针对不同的batch转化为不同的2-D或3-D向量。t-SNE可以用多种语言实现,但速度可能会有所不同。例如,我将C++和Python包装器与Pythonsklearn版本进行了比较,发现前者在矩阵转换速度方面通常快3倍:环境15英寸MacBookPro,macOSSierra2.2GHzIntelCorei7处理器16GB1600MHzDDR3内存1。将10,000x50矩阵转换为10,000x2C++和Pythonreal1m2.662suser1m0.575ssys0m1.929sPythonsklearnreal3m29.883suser2m22.748ssys1m7.010s2。将20,000x500矩阵转换为20,pythonreal2m40.250suser2m32.400ssys0m6.420spythonsklearnreal6M54.163Suser4M17.524SSSYS2M31.693S3。.412sPythonsklearnoutofmemory...:(t-SNE的作者说他们“已经将这种技术应用于多达3000万个示例的数据集”(尽管他没有指定数据和运行时的维度)。如果你有一个更大的数据集,你可以扩展你的硬件,调整参数(例如,sklearn的t-SNE中的角度参数),或尝试替代方案(例如LargeVis,其作者声称“LargeVis显着降低了图形构建的计算成本step与tSNE相比”。我还没有测试过。把它们放在一起:20个新闻组示例每个文档中的基本主题并将它们可视化为我们的组ingt-SNE。获取数据幸运的是,sklearn具有轻松检索和过滤20个新闻组数据的功能:fromsklearn.datasetsimportfetch_20newsgroups#我们只想保留文档的主体!remove=('headers','footers','quotes')#fetchtrainandtestdatanewsgroups_train=fetch_20newsgroups(subset='train',remove=remove)newsgroups_test=fetch_20newsgroups(subset='test',remove=remove)#a18,846条经过清理的新闻列表仅在字符串中保留format#onletters&让它们全部小写data]最后,我们可以向量化标记并训练LDA模型:importldafromsklearn.feature_extraction.textimportCountVectorizern_topics=20#topicsn_iter=500#numberofiterations#vectorizer:忽略英语停用词和出现次数少于5次的词cvectorizer=CountVectorizer(min_df=5,stop_words='english')cvz=cvectorizer.fit_transform(news)#训练一个LDA模型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)x20(n\_topics)的矩阵请注意,我们在这里有一个很好的概率解释:每一行都是该新闻属于某个主题的概率分布(通过我们的LDA模型学习)(例如,X\_topics[0][0]表示第一个新闻属于主题1的概率)。使用t-SNE减少到二维,我们有一个学习的LDA模型。但是我们无法直观地检查我们的模型有多好。t-SNE来拯救:从sklearn.manifold导入TSNE#一个t-SNE模型#角度值接近1意味着牺牲速度的准确性#pca初始化通常会导致更好的结果stsne_model=TSNE(n_components=2,verbose=1,random_state=0,angle=.99,init='pca')#20-D->2-Dtsne_lda=tsne_model.fit_transform(X_topics)可视化组及其关键字我们现在准备使用流行的Python可视化库Bokeh来可视化新闻组和关键字。undefinedwidth=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]}))绘制每个主题的关键词:#随机选择一个新闻(主题内)坐标作为关键词:ifnotnp.isnan(topic_coord).any():breaktopic_coord[topic_num]=tsne_lda[_lda_keys.index(topic_num)]#在xrange(X_topics.shape[1]):plot_lda.text(topic_coord[i,0],topic_coord[i,1],[topic_summaries[i]])#hovertoolshover=plot_lda.select(dict(type=HoverTool))hover.tooltips={"content":"@content-topic:@topic_key"}#savetheplotsave(plot_lda,'{}.html'.format(title))这是很多代码...但如果你已经做到这一点,你会得到这样的交互式图:当我们为每个文档分配一个主导主题时,有些情况下即使是最有可能的主题的概率也很低(极端情况下每个主题被分配5%,即均匀分布)在换句话说,我们的模型无法自信地(以高利润率)为此类新闻分配主题。一种解决方法是添加阈值因子以帮助过滤掉不可靠的分配。在我们训练LDA模型之后,在我们使用t-SNE降维之前,简单地说明这些行:importnumpythreshold=0.5_idx=np.amax(X_topics,axis=1)>threshold#idxofdocthatabovethethresholdX_topics=X_topics[_idx]并重新运行我们将得到的代码:看起来好多了:隔离且定义明确的组!然而,我们以非置信任务(在本例中,超过一半的数据)为代价来实现这一点。这表明我们的LDA模型只能从这个数据集中学到这么多,而且我们的模型没有信心为所有新闻分配一个好的主题。也就是说,如果您仔细检查每个主题,就会发现每个主题所学的流行语是有一定道理的:例如,“healthcareusesnumberpatients”(医疗保健)与“godjesuschristianbible”(宗教)相对。Tweet示例Twitter已成为最流行的新闻和社交网络服务(SNS)平台之一。在之前的博客RealTimeTwitterTrendDiscovery中,我们讨论了如何实时可视化Twitter趋势。然而,我们也可以使用推文语料库来建模主题。我们不是将推文保存在内存中进行实时处理,而是希望将推文保存到磁盘并累积一定数量(至少数百万)以高效地模拟主题。首先,我们需要设置推文连接:查看此部分。有了凭据,我们就可以获取实时推文:至少需要一两天的时间来积累相当数量的推文。有时连接可能会中断:只需重新运行脚本即可将新推文保存到磁盘。获得足够多的推文后,我们可以加载推文、处理它们、对其进行矢量化并计算tf-idf分数、训练LDA模型、缩减为二维并可视化结果。请在此处查看完整脚本。您将得到这样的图表:这是一个模型的可视化,该模型在200万条推文上进行训练,仅显示5,000个数据点(或推文)。我们有一些很好的集群学习模型:“sexgirlporn”代表一些与色情相关的推文,“videolikenew”代表社交网络内容,“trumphillarycliton”代表政治和选举。