700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > lda新闻主题提取_R语言文本挖掘实战-Unit5 主题模型

lda新闻主题提取_R语言文本挖掘实战-Unit5 主题模型

时间:2023-10-10 21:06:32

相关推荐

lda新闻主题提取_R语言文本挖掘实战-Unit5 主题模型

5.3 LDA主题模型

主题模型尝试解答下面两个基本问题:

如何确定一个词语是否属于特定主题;文档中一个主题出现的频率。

一种称为Gibbs sampler的LDA主题建模比其他模型更快,在处理大型语料库时非常有用。吉布斯抽样是一种马尔可夫链蒙特卡罗(MCMC)算法。虽然复杂,但它近似分布,然后关联马尔科夫链样本,并用于统计推断技术。实际上,主题建模算法就是这样做的,通过抽样来推断单词的分布,从而推断文档中的主题。抽样会降低准确度但增加模型中采样迭代的次数会趋于稳定的结果。

主题建模的R包,包括topicmodels、irlba和textmineR。

案例:使用来自《卫报》的文章作为语料库,进行一些主题建模,以创建主题模型的交互式可视化和表示文章的极性、主题和大小的树形图。具体步骤:

问题定义和具体目标。《卫报》如何对有关巴基斯坦的文章进行优先排序?确定需要收集的文本。这个语料库是使用报纸的API从GuardianR包中收集的,包含卫报11月14日至12月1日期间所有提到巴基斯坦的文章。文本的组织。按时间顺序组织文章,使用常见的和新的字符操作函数进行文本清洗。特征提取。lda包提供了一个名为lexalize的新函数,用于捕获文档级信息。(与DTM和TDM对比)分析。创建一个主题模型,动态可视化,创建一个树形图。见解或建议。根据观察到的主题对文章进行分组。

library(tm)library(qdap)library(lda)library(GuardianR)library(pbapply)library(LDAvis)library(treemap)library(car)options(stringsAsFactors = F)#Step2.读取数据text<-read.csv("E:/Rdata/text_mining-master/Guardian_articles_11_14__12_1_.csv")#Step3.数据清洗#转换编码类型articles<-iconv(text$body,"latin1","ASCII",sub="")#去掉网址articles<-gsub('httpS+S*','',articles)#去掉括号内的文本articles<-bracketX(articles,bracket = "all") articles<-removeNumbers(articles)articles<-gsub("[[:punct:]]","",articles)articles<-tolower(articles)articles<-removeWords(articles,c(stopwords("en"),'pakistan','gmt','england'))blank.removal<-function(x){x<-unlist(strsplit(x,' '))x<-subset(x,nchar(x)>0)#去掉空字符串x<-paste(x,collapse = ' ')}articles<-pblapply(articles,blank.removal) #lapply,pb显示进度条

处理不确定数量的空格,仅保留一个空格

#Step4.特征提取documents<-lexicalize(articles)

k<-4 #主题数量num.iter<-25alpha<-0.02 #先验文档主题分布eta<-0.02 #先验主题词项分布set.seed(1234)fit<-lda.collapsed.gibbs.sampler(documents = documents$documents,K=k,vocab = documents$vocab,num.iterations = num.iter,alpha = alpha,eta=eta,initial=NULL,burnin = 0,compute.log.likelihood = TRUE)plot(fit$log.likelihood[1,])top.topic.words(fit$topics,7,by.score=TRUE) #四个主题前7个词汇

第四个主题包含“new”、“australia”、“test”、“smith”和“zealand”等术语。第三个话题提到了“球”、“单打”和“三柱门”。这两个主题都和巴基斯坦与澳大利亚和新西兰的板球比赛有关。第一个话题提到了“伊斯兰国”、“巴黎”和“袭击”等词。最后一个主题与一些“攻击”的关系比较模糊。我们可以将主题的数量改为三个

文章-主题矩阵&主题-词汇矩阵

#与第一个主题最相关的文章#document_sums为主题-词汇矩阵,每个文章每个主题的词频top.topic.documents(fit$document_sums,1)a=apply(fit$document_sums+alpha,2,function(x){x/sum(x)})apply(a,1,which.max)#每个文档属于每个主题的概率,加上初始值alpha避免出现NAtheta<-t(pbapply(fit$document_sums+alpha,2,function(x) x/sum(x)))#每个词汇属于每个主题的概率phi<-t(pbapply(t(fit$topics)+eta,2,function(x) x/sum(x)))phi[1:2,1:5] #前2个主题,前5个词语的概率分布

文章-主题矩阵
主题-词汇矩阵

article.json<-createJSON(phi=phi,theta=theta,doc.length = doc.length,vocab = documents$vocab,term.frequency = as.vector(wc))serVis(article.json)

doc.assignment<-function(x){x<-table(x) #频数统计x<-as.matrix(x)x<-t(x)x<-max.col(x) }tmp=fit$assignments[[2]][1:10] fit$assignments[[50]][1:10] table(tmp)t(as.matrix(table(tmp)))max.col(t(as.matrix(table(tmp))))#求出每个文章最可能的主题(属于该主题的词汇最多)assignments<-unlist(pblapply(fit$assignments,doc.assignment))assignments<-recode(assignments,"1='Paris Attacks';2='Unknown';3='Cricket1';4='Cricket2'")article.ref<-seq(1:nrow(text))article.pol<-polarity(articles)[[1]][3]article.tree.df<-cbind(article.ref,article.pol,doc.length,assignments)treemap(article.tree.df,index=c("assignments",'article.ref'),vSize = "doc.length",vColor="polarity",type="value",title="Guardan Articles mentioning Pakistan")

可以从某种程度上推断出新闻工作者创作这篇文章的工作量。基于有限的分析,只有一篇大文章是关于巴黎袭击、ISIS和叙利亚的,而这一时间段的大多数文章都是关于板球的。不出所料,提到巴黎袭击的语言是负面的,而板球大多是正面的。有趣的是,巴黎袭击者是伊拉克和黎凡特伊斯兰国(ISIL)的一部分,而不是巴基斯坦人。然而,卫报在这段时间内的文章确实提到了巴基斯坦,随后又被API退回。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。