R语言-文本挖掘 主题模型 文本分类

####需要先安装几个R包,如果有这些包,可省略安装包的步骤。
#install.packages("Rwordseg")
#install.packages("tm");
#install.packages("wordcloud");
#install.packages("topicmodels")

例子中所用数据

数据来源于sougou实验室数据。

数据网址:http://download.labs.sogou.com/dl/sogoulabdown/SogouC.mini.20061102.tar.gz

文件结构

└─Sample

├─C000007 汽车

├─C000008 财经

├─C000010 IT

├─C000013 健康

├─C000014 体育

├─C000016 旅游

├─C000020 教育

├─C000022 招聘

├─C000023

└─C000024 军事

采用Python对数据进行预处理为train.csv文件,并把每个文件文本数据处理为1行。

预处理python脚本
<ignore_js_op> combineSample.zip (720 Bytes, 下载次数: 96)

所需数据
<ignore_js_op> train.zip (130.2 KB, 下载次数: 164) 
大家也可以用R直接将原始数据转变成train.csv中的数据

文章所需stopwords
<ignore_js_op> StopWords.zip (2.96 KB, 下载次数: 114)

1.     读取资料库

  1. csv <- read.csv("d://wb//train.csv",header=T, stringsAsFactors=F)
  2. mystopwords<- unlist (read.table("d://wb//StopWords.txt",stringsAsFactors=F))

复制代码

2.

数据预处理(中文分词、stopwords处理)

  1. library(tm);
  2. #移除数字
  3. removeNumbers = function(x) { ret = gsub("[0-90123456789]","",x) }
  4. sample.words <- lapply(csv$$$$text, removeNumbers)

复制代码

  1. #处理中文分词,此处用到Rwordseg包
  2. wordsegment<- function(x) {
  3. library(Rwordseg)
  4. segmentCN(x)
  5. }
  6. sample.words <- lapply(sample.words, wordsegment)

复制代码

  1. ###stopwords处理
  2. ###先处理中文分词,再处理stopwords,防止全局替换丢失信息
  3. removeStopWords = function(x,words) {
  4. ret = character(0)
  5. index <- 1
  6. it_max <- length(x)
  7. while (index <= it_max) {
  8. if (length(words[words==x[index]]) <1) ret <- c(ret,x[index])
  9. index <- index +1
  10. }
  11. ret
  12. }
  13. sample.words <- lapply(sample.words, removeStopWords, mystopwords)

复制代码

3.    wordcloud展示

  1. #构建语料库
  2. corpus = Corpus(VectorSource(sample.words))
  3. meta(corpus,"cluster") <- csv$$$$type
  4. unique_type <- unique(csv$$$$type)
  5. #建立文档-词条矩阵
  6. (sample.dtm <- DocumentTermMatrix(corpus, control = list(wordLengths = c(2, Inf))))

复制代码

  1. #install.packages("wordcloud"); ##需要wordcloud包的支持
  2. library(wordcloud);
  3. #不同文档wordcloud对比图
  4. sample.tdm <-  TermDocumentMatrix(corpus, control = list(wordLengths = c(2, Inf)));
  5. tdm_matrix <- as.matrix(sample.tdm);
  6. png(paste("d://wb//sample_comparison",".png", sep = ""), width = 1500, height = 1500 );
  7. comparison.cloud(tdm_matrix,colors=rainbow(ncol(tdm_matrix)));####由于颜色问题,稍作修改
  8. title(main = "sample comparision");
  9. dev.off();

复制代码

  1. #按分类汇总wordcloud对比图
  2. n <- nrow(csv)
  3. zz1 = 1:n
  4. cluster_matrix<-sapply(unique_type,function(type){apply(tdm_matrix[,zz1[csv$$$$type==type]],1,sum)})
  5. png(paste("d://wb//sample_ cluster_comparison",".png", sep = ""), width = 800, height = 800 )
  6. comparison.cloud(cluster_matrix,colors=brewer.pal(ncol(cluster_matrix),"Paired")) ##由于颜色分类过少,此处稍作修改
  7. title(main = "sample cluster comparision")
  8. dev.off()

复制代码

<ignore_js_op>

可以看出数据分布不均匀,culture、auto等数据很少。

  1. #按各分类画wordcloud
  2. sample.cloud <- function(cluster, maxwords = 100) {
  3. words <- sample.words[which(csv$$$$type==cluster)]
  4. allwords <- unlist(words)
  5. wordsfreq <- sort(table(allwords), decreasing = T)
  6. wordsname <- names(wordsfreq)
  7. png(paste("d://wb//sample_", cluster, ".png", sep = ""), width = 600, height = 600 )
  8. wordcloud(wordsname, wordsfreq, scale = c(6, 1.5), min.freq = 2, max.words = maxwords, colors = rainbow(100))
  9. title(main = paste("cluster:", cluster))
  10. dev.off()
  11. }
  12. lapply(unique_type,sample.cloud)# unique(csv$$$$type)

复制代码

<ignore_js_op> 
<ignore_js_op>

4.    主题模型分析

  1. library(slam)
  2. summary(col_sums(sample.dtm))
  3. term_tfidf  <- tapply(sample.dtm$$$$v/row_sums( sample.dtm)[ sample.dtm$$$$i],   sample.dtm$$$$j,  mean)*
  4. log2(nDocs( sample.dtm)/col_sums( sample.dtm  >  0))
  5. summary(term_tfidf)
  6. sample.dtm  <-  sample.dtm[,  term_tfidf  >=  0.1]
  7. sample.dtm  <-  sample.dtm[row_sums(sample.dtm)  >  0,]
  8. library(topicmodels)
  9. k <- 30
  10. SEED <- 2010
  11. sample_TM <-
  12. list(
  13. VEM = LDA(sample.dtm, k = k, control = list(seed = SEED)),
  14. VEM_fixed = LDA(sample.dtm, k = k,control = list(estimate.alpha = FALSE, seed = SEED)),
  15. Gibbs = LDA(sample.dtm, k = k, method = "Gibbs",control = list(seed = SEED, burnin = 1000,thin = 100, iter = 1000)),
  16. CTM = CTM(sample.dtm, k = k,control = list(seed = SEED,var = list(tol = 10^-4), em = list(tol = 10^-3)))
  17. )

复制代码

<ignore_js_op>

  1. sapply(sample_TM[1:2], slot, "alpha")
  2. sapply(sample_TM, function(x) mean(apply(posterior(x)$$$$topics,1, function(z) - sum(z * log(z)))))

复制代码

<ignore_js_op>

α估计严重小于默认值,这表明Dirichlet分布数据集中于部分数据,文档包括部分主题。
数值越高说明主题分布更均匀

  1. #最可能的主题文档
  2. Topic <- topics(sample_TM[["VEM"]], 1)
  3. table(Topic)
  4. #每个Topic前5个Term
  5. Terms <- terms(sample_TM[["VEM"]], 5)
  6. Terms[,1:10]

复制代码

<ignore_js_op>

  1. ######### auto中每一篇文章中主题数目
  2. (topics_auto <-topics(sample_TM[["VEM"]])[ grep("auto", csv[[1]]) ])
  3. most_frequent_auto <- which.max(tabulate(topics_auto))
  4. ######### 与auto主题最相关的10个词语
  5. terms(sample_TM[["VEM"]], 10)[, most_frequent_auto]

复制代码

<ignore_js_op>

时间: 2024-08-06 11:53:16

R语言-文本挖掘 主题模型 文本分类的相关文章

R语言︱LDA主题模型——最优主题...

R语言︱LDA主题模型--最优主题...:https://blog.csdn.net/sinat_26917383/article/details/51547298#comments 原文地址:https://www.cnblogs.com/yijiaming/p/10148427.html

2015lopdev生态联盟开发者大会:股市中的R语言量化算法模型

前言 记得10年前还在上学的时候,总是参加IBM的大会,看着各种新技术从实验室创造,特别地神奇.今天我也有机会站在了IBM大会的讲台上,给大家分享我所研究的R语言技术,对我来说也是一件非常有纪念意义的事情. 感谢IBM主办方的邀请,也真心希望有机会与IBM建立合作机会. 目录 我的演讲主题:股市中的R语言量化算法模型 会议体验和照片分享 整体文章:http://blog.fens.me/meeting-lopdev-20150922/

R语言 文本挖掘 tm包 使用

#清除内存空间 rm(list=ls()) #导入tm包 library(tm) library(SnowballC) #查看tm包的文档 #vignette("tm") ##1.Data Import 导入自带的路透社的20篇xml文档 #找到/texts/crude的目录,作为DirSource的输入,读取20篇xml文档 reut21578 <- system.file("texts", "crude", package = &quo

2015WOT移动互联网开发者大会:股市中的R语言量化算法模型

前言 大会历时两天,以"洞察移动互联网用户行为 分享移动应用研发实践"为主题,共设立"架构与设计"."平台与技术"."MDSA创新与创业"."移动游戏"."算法分析"."HTML5专场"."运维安全"."新浪微博技术"等八大技术专场,并垂直整合了技术和体验,深度服务于参会者与讲师.同时,在内容上也深度结合了目前移动互联网环境,通

R语言csv与txt文本读入区分(sep参数)

R语言csv与txt文本读入区分 R语言用来处理数据很方便,而处理数据的第一步是把数据读入内存空间,平时最常用的文本数据储存格式有两种: 一种是CSV(逗号分隔符文本)另一种是TXT(Tab分隔符或空格分隔符),有时候读这两种文件格式读入容易混淆. 1,我们读入数据的时候,一般写文件名有两种方式: (1)将储存数据的文件所在的目录设置为工作目录(setwd("file path")),读文件时只需要写文件名即可 1 setwd('C:/Data/mydata') 2 data <

R语言-文本挖掘

---恢复内容开始--- 案例1:对主席的新年致辞进行分词,绘制出词云 掌握jieba分词的用法 1.加载包 library(devtools) library(tm) library(jiebaR) library(jiebaRD) library(tmcn) library(NLP)library(wordcloud2) 2.导入数据 news <- readLines('E:\\Udacity\\Data Analysis High\\R\\R_Study\\高级课程代码\\数据集\\第一

机器学习基础——带你实战朴素贝叶斯模型文本分类

本文始发于个人公众号:TechFlow 上一篇文章当中我们介绍了朴素贝叶斯模型的基本原理. 朴素贝叶斯的核心本质是假设样本当中的变量服从某个分布,从而利用条件概率计算出样本属于某个类别的概率.一般来说一个样本往往会含有许多特征,这些特征之间很有可能是有相关性的.为了简化模型,朴素贝叶斯模型假设这些变量是独立的.这样我们就可以很简单地计算出样本的概率. 想要回顾其中细节的同学,可以点击链接回到之前的文章: 机器学习基础--让你一文学会朴素贝叶斯模型 在我们学习算法的过程中,如果只看模型的原理以及理

R语言与数据分析之三:分类算法2

上期与大家分享的传统分类算法都是建立在判别函数的基础上,通过判别函数值来确定目标样本所属的分类,这类算法有个最基本的假设:线性假设.今天继续和大家分享下比较现代的分类算法:决策树和神经网络.这两个算法都来源于人工智能和机器学习学科. 首先和小伙伴介绍下数据挖掘领域比较经典的Knn(nearest neighbor)算法(最近邻算法) 算法基本思想: Step1:计算出待测样本与学习集中所有点的距离(欧式距离或马氏距离),按距离大小排序,选择出距离最近的K个学习点: Step2:统计被筛选出来的K

R语言与数据分析之三:分类算法1

分类算法与我们的生活息息相关,也是目前数据挖掘中应用最为广泛的算法,如:已知系列的温度.湿度的序列和历史的是否下雨的统计,我们需要利用历史的数据作为学习集来判断明天是否下雨:又如银行信用卡诈骗判别. 分类问题都有一个学习集,根据学习集构造判别函数,最后根据判别函数计算我们所需要判别的个体属于哪一类的. 常见的分类模型与算法 传统方法 1.线性判别法:2.距离判别法:3.贝叶斯分类器: 现代方法: 1.决策树:2.支持向量机:3.神经网络: 线性判别法: 天气预报数据(x1,x2分别为温度和湿度,