还行 慢慢 **惯 功能 便捷
手机 网上 价格 实惠
收到 货 满意 喜欢 值得 购买
但是,由于LDA主题模型不是对文本进行运算,在做主题建模前,还需将文本转化为向量,用数字来代替文本,从而方便运算。
comments_segged<- readLines("./Mobilecomments.segment.2015-12-17_13_57_30.txt",encoding="UTF-8")
comments <- as.list(comments_segged)
doc.list <- strsplit(as.character(comments),split=" ")
接下来,就像在python下gensim包里的操作一样,我们需要创建一个词典,并给每个词取一个编号:
term.table <- table(unlist(doc.list)) #这里有两步,unlist用于统计每个词的词频;table把结果变成一个交叉表式的factor,原理类似python里的词典,key是词,value是词频
term.table <- sort(term.table, decreasing = TRUE) #按照词频降序排列
在前面,我们用stop_words去掉了数字、标点符号、虚词等,由于现代汉语里用单字表示一个词语的词已经很少了,这里为了提高建模效果,我们可以将单字去掉,同时也可以把出现次数少于5次的词去掉。
del <- term.table < 5| nchar(names(term.table))<2 #把不符合要求的筛出来
term.table <- term.table[!del] #去掉不符合要求的
vocab <- names(term.table) #创建词库
接下来,我们要把文本的格式整理成lda包建模需要的格式。lda包对格式有具体要求:
[,1] [,2] [,3]
[1,] 8 261 46
[2,] 1 1 1
这是一个文档,第一行是词的ID,第二行是词在文档里出现的频次。为了能生成这样的结构,这里我参考了LDAvis作者的代码:
get.terms <- function(x) {
index <- match(x, vocab)
index <- index[!is.na(index)]
rbind(as.integer(index - 1), as.integer(rep(1, length(index))))
documents <- lapply(doc.list, get.terms)
至此,我们就准备好了做LDA建模需要用的数据了。
LDA主题建模
这部分没啥好说的,直接上代码:
K <- 5 #主题数
G <- 5000 #迭代次数
alpha <- 0.10
eta <- 0.02
这些为LDA建模需要先设置的几个参数,关于alpha、eta的设置和作用,引用梁斌penny的一段话:
其中α,大家可以调大调小了试试看,调大了的结果是每个文档接近同一个topic,即让p(wi|topici)发挥的作用小,这样p(di|topici)发挥的作用就大。其中的β,调大的结果是让p(di|topici)发挥的作用变下,而让p(wi|topici)发挥的作用变大,体现在每个topic更集中在几个词汇上面,或者而每个词汇都尽可能的百分百概率转移到一个topic上。
接下来是主题建模的过程,以文本量大小和迭代次数多少,用时会不同,多则几十分钟,少则一两分钟。
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)
LDAvis可视化
用LDAvis做可视化也很简单,只要把相应的参数准备好:
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, ])) #每篇文章的长度,即有多少个词
调用LDAvis:
library(LDAvis)
json <- createJSON(phi = phi, theta = theta,
doc.length = doc.length, vocab = vocab,
term.frequency = term.frequency)
serVis(json, out.dir = './vis', open.browser = FALSE)
至此,一个基于网页的可交互的主题模型可视化分析展示就做出来了,servis会在指定的路径下生成文件夹vis,里面包含:
这里还会出现一个问题,由于我们做的是中文的主题建模,而这个工具本身在英文环境下创建的,所以没有考虑中文显示的问题。做完上面的步骤后,打开网页,会出现乱码的问题。为了解决乱码的问题,我们需要将其中的lda.json文件的编码改成UTF8格式,你可以手动改,也可以用R来自动改。
writeLines(iconv(readLines("./vis/lda.json"), from = "GBK", to = "UTF8"),
file("./vis/lda.json", encoding="UTF-8"))
转自:https://www.wenji8.com/p/130m9XC.html
LDA主题模型在2002年被David M. Blei、Andrew Y. Ng(是的,就是吴恩达老师)和Michael I. Jordan三位第一次提出,近几年随着社会化媒体的兴起,文本数据成为越来越重要的分析资料;海量的文本数据对社会科学研究者的分析能力提出了新的要求,于是LDA主题模型(Topic Model)作为一种能够从大量文本中提取出主题的概率模型,被越来越多的运用到主题发现、文档标记...
future.apply包提供了一系列的函数,与R的apply家族函数类似,包括future_map()、future_apply()、future_lapply()、future_sapply()等。这些函数允许用户在数据集的每个元素上应用自定义的函数,并通过将计算任务分发到多个处理器来实现并行计算。
如果您对apply系列函数有一定了解,那对于future.apply包的掌握就很容易;只要理解并行计算与串行计算的区别就行。
能阻止你的追梦,只有你自己能放弃你的梦想。
--2023-7-6 筑基篇
爬虫获取的源数据,通过pre_data.py对数据进行预处理。在经过lda_model.py提取评论特征名词,对于每一条评论相关特征名词相前后的情感副词、情感词进行加权得分,建立一个以特征名词为列向量的DataFrame评论得分数据。最后通过PCA、皮尔逊等提取特征数据进行建模,对基本数据模型有LRMode、SVM、Xgboost进行建模训练,预测销量排名。
数据预处理
每条评论可能由多个句子组成,没一句话所谈到的内容或者产品特征均不相同。如果以每条评论为单位来进行产品特征评论语句来分类容易产生混淆。与英文分词不同,中文词与词之间不能够严格的按照空格来区分,所以中文的分词工作需要利用某些方法来进行。本次分句使用python包jieba进行切词。
分词与词性标注
无论是产品的特征词还是情感观点词都需要通过分词从连续的句子中分离出来,而这些往往都是名词和形容词,所以分词之后对词性标注有利于我们识别这些词,这为之后的文本处理工作奠定了数据基础。
去除停用词
文本中一些介词、量词、助词、标点符号等文本要就无意义的词,需要剔除,所以我们还需要对这些评论语料进行停用词过滤和标点符
原文链接:http://tecdat.cn/?p=3897相关视频:文本挖掘:主题模型(LDA)及R语言实现分析游记数据文本挖掘:主题模型(LDA)及R语言实现分析游记数据时长12:59文本分析:主题建模library(tidyverse)
theme\_set(theme\_bw())目标定义主题建模解释Latent Dirichlet以及此过程的工作原理演示如何使用LDA从一组已知主题中找到...
LDA(Latent Dirichlet Allocation)是一种主题模型,它可以对文本进行建模,从而发现文本隐藏的主题结构。在LDA模型中,每个文档都可以由多个主题组合而成,每个主题也可以由多个单词组成。LDA模型的可视化可以帮助我们更好地理解文本数据中的主题结构。
有多种方法可以对LDA模型进行可视化,其中一种常用的方法是使用pyLDAvis库。pyLDAvis库可以生成一个交互式的可视化界面,其中包括主题的分布情况、单词的分布情况、主题之间的相似性等信息,使得用户可以更加直观地理解模型的结果。
下面是使用pyLDAvis库对LDA模型进行可视化的示例代码:
``` python
import pyLDAvis.gensim
import gensim
# 导入LDA模型和语料库
lda_model = gensim.models.ldamodel.LdaModel.load('lda_model.model')
corpus = gensim.corpora.MmCorpus('corpus.mm')
# 对模型进行可视化
vis_data = pyLDAvis.gensim.prepare(lda_model, corpus, dictionary=lda_model.id2word)
pyLDAvis.display(vis_data)
这段代码中,我们首先导入了pyLDAvis和gensim库,然后加载了LDA模型和语料库。最后,调用pyLDAvis.gensim.prepare()函数对模型进行可视化,并使用pyLDAvis.display()函数将结果显示在交互式界面中。
需要注意的是,可视化结果只是对模型的一种解释,不一定反映了数据的真实情况。因此,在使用可视化工具时需要慎重分析结果,同时结合其他方法进行验证。