文本挖掘

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

一、文本挖掘概念 
   将数据挖掘的成果用于分析以自然语言描述的文本,这种方法被称为文本挖掘(Text Mining)或文本知识发现(Knowledge Discovery in Text)
文本挖掘主要过程:特征抽取、特征选择、文本分类、文本聚类、模型评价。
    主题模型(Topic Mode)介绍
    主题模型是专门抽象一组文档所表达 “主题” 的统计技术。
    最早的模型是 probabilistic latent semantic indexing (PLSI),后来 Latent Dirichlet allocation
(LDA,潜在狄利克雷分配模型模型成为了最常见的主题模型,它可以认为是 PLSI 的泛化形式。LDA 主题模型涉及到贝叶斯理论、Dirichlet 分布、多项分布、图模型、变分推断、EM 算法、Gibbs 抽样等知识。

二、实例分析
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) }
复制代码
  1. #对词进行处理
复制代码

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结构,传统数据挖掘方法都可以使用,如决策数、神经网络等,对此不再细述。

总结
     本文介绍了文本挖掘常见的方法,因学习时间比较短,很多细节部分也没有展开描述,加之数据集选的不给力(样本少),计划下载些新闻进行分类预测暂且搁置。

另外对大数据量的文本的分析,可以考虑R结合Hadoop进行分布式分析。下回分解。


转自:http://f.dataguru.cn/thread-46051-1-1.html

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值