玩玩文本挖掘-wordcloud、主题模型与文本分类

本文主要介绍文本挖掘的常见方法,主要包括词频分析及wordcloud展现、主题模型、文本分类、分类评价等。分类主要包括无监督分类(系统聚类、KMeans、string kernals),有监督分类(knn、SVM)。

一、文本挖掘概念

将数据挖掘的成果用于分析以自然语言描述的文本,这种方法被称为文本挖掘(Text Mining)或文本知识发现(Knowledge Discovery in Text)。

文本挖掘主要过程:特征抽取、特征选择、文本分类、文本聚类、模型评价。

主题模型(Topic Mode)介绍

主题模型是专门抽象一组文档所表达 “主题” 的统计技术。

最早的模型是 probabilistic latent semantic indexing (PLSI),后来 Latent Dirichlet allocation

(LDA,潜在狄利克雷分配模型) 模型成为了最常见的主题模型,它可以认为是 PLSI 的泛化形式。LDA 主题模型涉及到贝叶斯理论、Dirichlet 分布、多项分布、图模型、变分推断、EM 算法、Gibbs 抽样等知识。

---R中的中英文分词-----

有个分词的插件,叫snowball。直接在R的菜单栏上点击Packages-> install package(s),然后选择beijing,然后在列表里面找到snowball就可以了。

按完以后可以看到界面中的提示。

我们按照在Text Mining With (刘思喆)R中的例子测试一下是否安装成功。

> library(Snowball)> SnowballStemmer(c('functions', 'stemming', 'liked', 'doing'))
[1] "function" "stem"     "like"     "do"      > 

可以看到snowball已经可以帮我们提取词干了。

现在我们来试试tokenizer:

> library(RWeka)> NGramTokenizer('吃货 都是 热爱生活 的 好孩子')
 [1] "吃货 都是 热爱生活" "都是 热爱生活 的"   "热爱生活 的 好孩子"
 [4] "吃货 都是"          "都是 热爱生活"      "热爱生活 的"       
 [7] "的 好孩子"          "吃货"               "都是"            
 [10] "热爱生活"           "的"                 "好孩子"

如果我们不认为添加空格会是什么情况呢?

> NGramTokenizer('欢迎光临Elar的博客,今天是2013年9月4号')
character(0)

可以看到没有什么结果呢……

那如果想对普通的中文文本分词,可以使用一个叫Rwordseg的包。这个包是李健开发的中文分词工具。

在R中安装Rwordseg的指令为:

install.packages("Rwordseg", repos = "http://R-Forge.R-project.org")

安装好可见提示信息:

我们测试一下Rwordseg的分词功能:

> library(Rwordseg)
Loading required package: rJava# Version: 0.0-5> segmentCN('欢迎光临Elar的博客,今天是2013年9月4号,这里是中国陕西西安')
 [1] "欢迎"   "光临"   "elar"   "的"     "博客"   "今天"   "是"     "2013年"
 [9] "9月"    "4号"    "这里"   "是"     "中国"   "陕西"   "西安"  > 

现在中文分词也搞定了,我们来试试Text Mining吧。

安装tm包。

可以看到tm包还有mail和webmining插件,是不是用来挖掘邮件和网络内容的呢?以后探索。

先安装最基本的tm包,安装完成后的提示:

tm包中可以对动态语料库(语料库在内存中)和静态语料库(语料库在硬盘中)进行分析。静态语料库要用到一个叫filehash包的支持。

二、实例分析 0. 数据预处理

数据来源于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行。

1. 读取资料库

  1. setwd("d:\\Testing\\R\\w12")
  2. csv <- read.csv("train.csv",header=T, stringsAsFactors=F)
  3. mystopwords<- unlist (read.table("StopWords.txt",stringsAsFactors=F))

2. 数据预处理(中文分词、stopword处理)

  1. library(tm)
  2. #移除数字
  3. removeNumbers = function(x) { ret = gsub("[0-90123456789]","",x) }

3. wordcloud展示

  1. library(wordcloud)
  2. #不同文档wordcloud对比图
  3. sample.tdm <- TermDocumentMatrix(corpus, control = list(wordLengths = c(2, Inf)))
  4. tdm_matrix <- as.matrix(sample.tdm)
  5. png(paste("sample_comparison",".png", sep = ""), width = 1500, height = 1500 )
  6. comparison.cloud(tdm_matrix)
  7. title(main = "sample comparision")
  8. 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("sample_ cluster_comparison",".png", sep = ""), width = 800, height = 800 )
  6. comparison.cloud(cluster_matrix)
  7. title(main = "sample cluster comparision")
  8. dev.off()

可以看出数据分布不均匀,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("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)

#列出第一副和最后一幅图

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)
  1. sample.dtm <- sample.dtm[, term_tfidf >= 0.1]
  2. sample.dtm <- sample.dtm[row_sums(sample.dtm) > 0,]

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

  1. sapply(sample_TM, function(x) mean(apply(posterior(x)$topics,1, function(z) -sum(z*log(z)))))

数值越高说明主题分布更均匀

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

从结果来看,与原有手工10大分类“汽车、财经、IT、健康、体育、旅游、教育、招聘、文化、军事”对比,可以发现旅游、军事等主题还比较明显,但总的效果不是很理想(可以和“按分类汇总wordcloud对比图”对比一下)。 5. 文本分类-无监督分类,包括系统聚类、KMeans、string kernals。

  1. sample_matrix = as.matrix(sample.dtm)
  2. rownames(sample_matrix) <- csv$type
  • 系统聚类

可见和主题模型得出结论相同,数据分布过于集中。说明数据集可能还不够具有代表性。 l KMeans分类

  1. sample_KMeans <- kmeans(sample_matrix, k)
  2. library(clue)
  3. #计算最大共同分类率
  4. cl_agreement(sample_KMeans, as.cl_partition(csv$type), "diag")

分类效果比较差。

l string kernels

  1. library("kernlab")
  2. stringkern <- stringdot(type = "string")
  3. stringC1 <- specc(corpus, 10, kernel=stringkern)
  4. #查看统计效果
  5. table("String Kernel"=stringC1, cluster = csv$type )

可以看出travel、education分类准确,auto、it、health等分类效果差。

6.文本分类-有监督分类,包括knn、SVM

把数据随机抽取90%作为学习集,剩下10%作为测试集。实际应用中应该进行交叉检验,这里简单起见,只进行一次抽取。

  1. n <- nrow(csv)
  2. set.seed(100)
  3. zz1 <- 1:n
  4. zz2 <- rep(1:k,ceiling(n/k))[1:n] #k <- length(unique(csv$type))
  5. zz2 <- sample(zz2,n)
  6. train <- sample_matrix[zz2<10,]
  7. test <- sample_matrix[zz2==10,]
  8. trainC1 <- as.factor(rownames(train))

l Knn分类

  1. library(class)
  2. sample_knnCl <- knn(train, test, trainC1)
  3. trueC1 <- as.factor(rownames(test))
  4. #查看预测结果
  5. (nnTable <- table("1-NN" = sample_knnCl, sample = trueC1))
  1. sum(diag(nnTable))/nrow(test)

看样样本集少预测效果是不好。

l SVM分类

  1. rownames(train) <- NULL
  2. train <- as.data.frame(train)
  3. train$type <- trainC1
  4. sample_ksvm <- ksvm(type~., data=train)
  5. svmCl <- predict(sample_ksvm,test)
  6. (svmTable <-table(SVM=svmCl, sample=trueC1))
  1. sum(diag(svmTable))/nrow(test)

看上去svm方法效果比较好些。 7.其他分类 文本数据经过矩阵化转换后,变为普通的Matrix或data.frame结构,传统数据挖掘方法都可以使用,如决策数、神经网络等。

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2015-11-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

如何用Python和深度神经网络识别图像?

视觉 进化的作用,让人类对图像的处理非常高效。 这里,我给你展示一张照片。 如果我这样问你: 你能否分辨出图片中哪个是猫,哪个是狗? 你可能立即会觉得自己遭受到...

2929
来自专栏CVer

OpenCV实战:人脸关键点检测(FaceMark)

Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author: Amusi Dat...

7107
来自专栏机器学习、深度学习

视频插值--Video Frame Interpolation via Adaptive Separable Convolution

Video Frame Interpolation via Adaptive Separable Convolution ICCV2017 https:...

2059
来自专栏人工智能

安卓恶意软件检测:系统调用日志+机器学习算法

本文内容源自Sanya Chaba等人的学术论文《Malware Detection Approach for Android systems Using Sy...

2355
来自专栏AI研习社

手把手教你在浏览器中使用脸部识别软件包 face-api.js

我可以很激动地说,我们终于有可能在浏览器中运行人脸识别程序了!在这篇文章中,我会给大家介绍一个基于 TensorFlow.js 核心的 JavaScript 模...

801
来自专栏疯狂的小程序

微信跳一跳之深度实践

最近微信的跳一跳小程序火了一把,所以前天也更新了微信玩了几局,最多手动到200左右就不行了。

22510
来自专栏宏伦工作室

一次不成功的深度学习实践 - 微信跳一跳

1774
来自专栏量子位

Tensorflow官方语音识别入门教程 | 附Google新语音指令数据集

李林 编译整理 量子位 报道 | 公众号 QbitAI Google今天推出了一个语音指令数据集,其中包含30个词的65000条语音,wav格式,每条长度为一秒...

4498
来自专栏人工智能

从论文到测试:Facebook Detectron开源项目初探

机器之心专栏 作者:陈惠婵 从 RCNN 到 Faster RCNN,再到最近的 FPN 和获得 ICCV Best Paper 的 Mask RCNN,深度学...

28210
来自专栏贾志刚-OpenCV学堂

OpenCV基于残差网络实现人脸检测

OpenCV基于残差网络实现人脸检测 OpenCV3.3版本第一次把深度神经网络(DNN)模块引入到正式发布版本中,最新的OpenCV3.4中DNN模块发布了两...

3658

扫描关注云+社区