博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
R语言-文本挖掘 主题模型 文本分类
阅读量:6305 次
发布时间:2019-06-22

本文共 4525 字,大约阅读时间需要 15 分钟。

####需要先安装几个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>  (720 Bytes, 下载次数: 96) 
所需数据
<ignore_js_op>  (130.2 KB, 下载次数: 164) 
大家也可以用R直接将原始数据转变成train.csv中的数据
文章所需stopwords
<ignore_js_op>  (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.     
  11. SEED <- 2010
  12. sample_TM <-
  13. list(
  14. VEM = LDA(sample.dtm, k = k, control = list(seed = SEED)),
  15. VEM_fixed = LDA(sample.dtm, k = k,control = list(estimate.alpha = FALSE, seed = SEED)),
  16. Gibbs = LDA(sample.dtm, k = k, method = "Gibbs",control = list(seed = SEED, burnin = 1000,thin = 100, iter = 1000)),
  17. CTM = CTM(sample.dtm, k = k,control = list(seed = SEED,var = list(tol = 10^-4), em = list(tol = 10^-3)))
  18. )
复制代码

<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)))))
  3.    
复制代码

<ignore_js_op> 

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

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

转载于:https://www.cnblogs.com/Yiutto/articles/4967507.html

你可能感兴趣的文章
迅雷导致sql数据库无法启动
查看>>
docker深入2-使用自定义的网络来配置zookeeper集群
查看>>
在浏览器里查看Nginx和PHP-FPM的运行状态
查看>>
5----CentOS6.5源码搭建LAMP--基于module方式实现php(单台机器)
查看>>
Git/Gitlab 基本操作--抓取、提交、库的迁移/备份及回收/重命名
查看>>
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
查看>>
Data Auditing for MongoDB
查看>>
WinAPI: UnhookWindowsHookEx - 卸掉钩子
查看>>
我的友情链接
查看>>
Delphi 2010 新增功能之: 软键盘、触摸键盘(TTouchKeyboard)
查看>>
博客地址变更
查看>>
单点登录原理与简单实现(一)
查看>>
WinAPI: WinExec - 运行外部程序
查看>>
徐雷FrankXuLei受邀为中国南方电网集团《分布式高并发Web网站架构》课程
查看>>
一 、 Node+npm的安装
查看>>
【Java每日一题】20170220
查看>>
mysql基础(六)mysql事务
查看>>
Golang reflect反射使用(1)——读取结构体字段、执行其方法
查看>>
我的友情链接
查看>>
centos7系统基本操作命令
查看>>