LDA文档主题发现R

1.# 加载rJava、Rwordseg、tm、lda库

library(rJava);  
library(Rwordseg); 
library("lda", lib.loc="~/R/win-library/3.3")
library("tm", lib.loc="~/R/win-library/3.3")

2.# == 读入数据

lecture=read.csv("E:\\worldcup_test.txt",sep=",");  

1.用正则剔除URL

res=lecture[lecture!=" "];  
 res=gsub(pattern="http://t.cn/[A-Za-z0-9]+$+","",res);
res=gsub(pattern="[我|你|的|了|是]","",res);

2.jieba

library(jiebaR) #加载

3.加入词典,以及停用词,去除标点

cutter <- worker(bylines = T,user = "G:\\hhe\\15W.txt",stop_word = "G:\\hhe\\dtop.txt")

4.分词

comments_seg <- cutter["G:\\hhe\\8yue2.txt"]

5.读入分词后的文件

comments<- readLines("G:\\hhe\\8yue2.segment.2017-05-04_19_40_41.txt",encoding="UTF-8")

6.向量化

comments <- as.list(comments) #将向量转化为列表
doc.list <- strsplit(as.character(comments),split=" ") #将每行文本,按照空格分开,每行变成一个词向量,储存在列表里

7.创建一个词典,并给每个词取一个编号:

term.table <- table(unlist(doc.list)) 
#这里有两步,unlist用于统计每个词的词频;table把结果变成一个交叉表式的factor,原理类似python里的词典,key是词,value是词频.

8.排序

term.table <- sort(term.table, decreasing = TRUE) #按照词频降序排列

9.为了提高建模效果,我们可以将单字去掉,同时也可以把出现次数少于5次的词去掉。

del <- term.table < 5| nchar(names(term.table))<2   #把不符合要求的筛出来
term.table <- term.table[!del]   #去掉不符合要求的
vocab <- names(term.table)    #创建词库

10.把文本的格式整理成lda包建模需要的格式

get.terms <- function(x) {
  index <- match(x, vocab)  # 获取词的ID
  index <- index[!is.na(index)]  #去掉没有查到的,也就是去掉了的词
  rbind(as.integer(index - 1), as.integer(rep(1, length(index))))   #生成矩阵结构
}
documents <- lapply(doc.list, get.terms)

11.参数设定
这些为LDA建模需要先设置的几个参数,关于alpha、eta的设置和作用,引用梁斌penny的一段话:

其中α,大家可以调大调小了试试看,调大了的结果是每个文档接近同一个topic,即让p(wi|topici)发挥的作用小,这样p(di|topici)发挥的作用就大。其中的β,调大的结果是让p(di|topici)发挥的作用变下,而让p(wi|topici)发挥的作用变大,体现在每个topic更集中在几个词汇上面,或者而每个词汇都尽可能的百分百概率转移到一个topic上。

接下来是主题建模的过程,以文本量大小和迭代次数多少,用时会不同,多则几十分钟,少则一两分钟。

K <- 10   #主题数
G <- 5000    #迭代次数
alpha <- 0.10   
eta <- 0.02

12.开始建模,以文本量大小和迭代次数多少,用时会不同

 library(lda)
 set.seed(357) 
fit <- lda.collapsed.gibbs.sampler(documents = documents, K = K, vocab = vocab, num.iterations = G, alpha = alpha, eta = eta, initial = NULL, burnin = 0, compute.log.likelihood = TRUE)
13.可视化参数
theta <- t(apply(fit$document_sums + alpha, 2, function(x) x/sum(x))) #文档—主题分布矩阵

phi <- t(apply(t(fit$topics) + eta, 2, function(x) x/sum(x))) #主题-词语分布矩阵

term.frequency <- as.integer(term.table) #词频

doc.length <- sapply(documents, function(x) sum(x[2, ])) #每篇文章的长度,即有多少个词

14.可视化

library(LDAvis)

json <- createJSON(phi = phi, theta = theta,

doc.length = doc.length, vocab = vocab,

term.frequency = term.frequency)#json为作图需要数据,下面用servis生产html文件,通过out.dir设置保存位置

serVis(json, out.dir = './vis', open.browser = FALSE)

15为了解决乱码的问题,我们需要将其中的lda.json文件的编码改成UTF8格式,你可以手动改,也可以用R来自动改。

writeLines(iconv(readLines("./vis/lda.json"), from = "GBK", to = "UTF8"),

file("./vis/lda.json", encoding="UTF-8"))
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在 R 中进行 LDA 主题分析,可以使用 `topicmodels` 包。下面是一个简单的步骤: 1. 准备数据:将需要分析的文本数据以某种方式导入到 R 语言环境中,如将文本数据存储在 CSV 文件中,然后使用 `read.csv` 函数进行读取。 2. 构建文档-词矩阵:使用 `tm` 包中的 `DocumentTermMatrix` 函数将文本数据转换成文档-词矩阵。这个函数将文档表示为行,单词表示为列,矩阵中的每个元素表示该单词在该文档中出现的次数。 3. 运行 LDA 模型:使用 `topicmodels` 包中的 `LDA` 函数运行 LDA 模型。可以设置 LDA 模型的参数,如主题数、迭代次数、超参数等。 4. 分析结果:使用 `topicmodels` 包中的 `terms` 和 `topics` 函数来查看 LDA 模型得到的主题中的单词和文档主题分布。 下面是一个简单的 R 代码示例: ```r # 导入文本数据 data <- read.csv("data.csv", header=TRUE, stringsAsFactors=FALSE) # 构建文档-词矩阵 library(tm) corpus <- Corpus(VectorSource(data$text)) dtm <- DocumentTermMatrix(corpus) # 运行 LDA 模型 library(topicmodels) lda <- LDA(dtm, k = 10, method = "Gibbs", control = list(seed = 1234)) # 查看主题中的单词 terms(lda) # 查看文档主题分布 topics(lda) ``` 上述代码中,假设需要分析的文本数据存储在名为 `data.csv` 的 CSV 文件中,文件包含一个名为 `text` 的文本列。代码中使用 `LDA` 函数运行 LDA 模型,设置主题数为 10,使用 Gibbs 采样方法,并设置随机数种子为 1234。最后使用 `terms` 和 `topics` 函数查看 LDA 模型得到的主题中的单词和文档主题分布。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值