机器学习之文本挖掘—基于R语言

发布于:2023-01-22 ⋅ 阅读:(463) ⋅ 点赞:(0)

文本挖掘框架与方法

  • 将大写字母转化为小写字母
  • 删除数字
  • 删除标点符号
  • 剔除停用词
  • 词干提取
  • 词语替换

LDA模型

LDA是一个生成式过程,他按照下面的步骤进行迭代,直到达到一个平稳状态

  • 1.如果有1~ j个文档,1~k个主题,那么对每个文档(j)使用一个多项式分布(狄利克雷分布)将其随机分配给各个主题(k)。例如,文档A分配给主题1的概率是25%,分配给主题2的概率是25%,分配给主题3的概率是50%。
  • 2 .如果有1~j个词,那么每个词都以某个概率属于某个主题(k),例如:词mean以0.25的概率属于主题statistics。
  • 3 .对于文档j和主题k中的每一个词i,计算该文档中的词分配给该主题的比例,记为主题(k)在文档(j)的概率P(k|j)。再从包含该词的文档中计算该词(i)在主题(k)中的比例,记为词(i)属于主题(k)的概率P(i|k)
    1. 重新抽样,即基于r属于w的概率为w分配一个新的t,此处的基准概率为P(k|j)×P(i|k)
    1. 重复这个过程,经过多次迭代,算法最终会收敛

实战分析

1.数据理解与准备

我们使用的基础软件包是tm,这是专门的文本挖掘软件包。还需要SnowballC包进行词干提取,使用RColorBrewer包进行上色,当然还有wordcloud包

install.packages("tm")
install.packages("wordcloud")
install.packages("RColorBrewer")
library(tm)
library(wordcloud)
library(RColorBrewer)

数据文件的下载地址
或者使用百度网盘下载链接
提取码:99o4
别忘了把文件放在工作路径下

getwd()
name <- file.path("E:/r1/text")
dir(name)

在这里插入图片描述
这里的text是一个单独的文件夹
将语法资料库命名为docs,并使用Corpus()函数建立语料库。函数包装了DirSource函数,他是tm包的一部分

docs <- Corpus(DirSource(name))

现在,使用tm包中的tm_map函数进行文本转换

docs <- tm_map(docs,tolower)#小写
docs <- tm_map(docs,removeNumbers)#去掉数字
docs <- tm_map(docs,removePunctuation)#去掉标点符号
docs <- tm_map(docs,removeWords,stopwords("english"))#剔除停用词
docs <- tm_map(docs,stripWhitespace)#删除空白字符

此时,应该删除不必要的词。例如,在演讲过程中,当国会议员对于某个部分鼓掌欢呼的时候,文本中就会出现(Applause),这是必须要删除的:

docs <- tm_map(docs,removeWords,c("applause","can","cant","will",
                                  "that","weve","dont","wont","youll","youre"))

结束文本和冗余词后,请确认文档还是纯文本形式,然后将其放入文档—词矩阵并查看维度:

dtm <- DocumentTermMatrix(docs)
dim(dtm)
rownames(dtm) <- c("2010","2011","2012","2013","2014","2015","2016")
inspect(dtm[1:7,1:5])

在这里插入图片描述

2.模型构建与模型评价

1.词频分析与主题模型

首先建立一个对象,计算每列综合,然后按照降序重新排列。要计算每列总合,要在代码中使用as.matrix函数。默认的排序方式是升序,所以在freq前面加一个负号就变成了降序

freq <- colSums(as.matrix(dtm))
ord <- order(-freq)
freq[head(ord)]
freq[tail(ord)]

在这里插入图片描述
生成词云:

wordcloud(names(freq),freq,min.freq = 70,scale=c(3,0.5),
          colors = brewer.pal(6,"Dark2"))

在这里插入图片描述
生成条形图:
这里提供了两种方式

gg <- data.frame(freq[head(ord,10)])
colnames(gg) <-" Frequency"
x <- rownames(gg);x
y <- gg[,1]
library(ggplot2)
ggplot(gg)+geom_col(aes(x,y,fill=x))+
  labs(x="Words",y="Frenquency",title="Word Frenquency")+
  theme(plot.title = element_text(hjust = 0.5,size=15),
        legend.position = "none")
ggplot(gg,aes(x,y,fill=x))+geom_bar(stat="identity")

在这里插入图片描述
下面使用topicmodels包建立主题模型,这个包提供了LDA函数。问题在于建立多少个主题,看上去3个比较合适,当然也可以尝试其他的:

install.packages("topicmodels")#如果安装失败则按照下面的方法
#先安装pacman包
library(pacman)
p_install("topicmodels")
library(topicmodels)
lda <- LDA(dtm,k=3,method="Gibbs")
topics(lda)
terms(lda,25)

在这里插入图片描述
不难发现这些主题都是关于经济和商业的,可以由job,energy,reform和dificit这些词看出

本文含有隐藏内容,请 开通VIP 后查看