文本挖掘 2
绪论
目前我们可以获取的大部分信息是以文本的形式存储在文本数据库中的,由来自各种数据源的大量文档组成,如新闻文档、研究论文、书籍、数字图书馆和web页面。由于电子形式的文本信息飞速增长,文本挖掘已经成为信息领域的研究热点。
要分析文本内容,最常见的分析方法是提取文本中的词语,并统计频率。频率能反映词语在文本中的重要性,一般越重要的词语,在文本中出现的次数就会越多。词语提取后,还可以做成词云,让词语的频率属性可视化,更加直观清晰。
文本挖掘是应用驱动的。它在商业智能、信息检索、生物信息处理等方面都有广泛的应用;例如,客户关系管理,自动邮件回复,垃圾邮件过滤,自动简历评审,搜索引擎等等。
1.文本挖掘的基本概念
1.1文本挖掘的介绍
文本挖掘一词出现于1998年第十届欧洲机器学习会议上。Kodratoff认为文本挖掘的目的是从文本集合中,试图在一定的理解水平上尽可能多地提取知识。
文本挖掘是一个从大量文本数据中提取以前未知的、有用的、可理解的、可操作的知识的过程。
文本数据包括:技术报告、文本集、新闻、电子邮件、网页、用户手册等。
1.2文本挖掘的定义
文本挖掘(TextMining)是一个从非结构化文本信息中获取用户感兴趣或者有用的模式的过程。其中被普遍认可的文本挖掘定义如下:
文本挖掘是指从大量的文本数据中抽取事先未知的、可理解的、最终可用的知识的过程,同时运用这些只是更好的组织信息以便将来参考。
文本特征指的是关于文本的元数据:
(1)描述性特征,例如文本的名称、日期、大小、类型等;
(2)语义性特征,例如文本的作者、机构、标题、内容等
1.3文本挖掘的任务
(1)短语提取:提取文本集中所有相关的短语 。
(2)概念提取(聚类):对这些短语之间的关系,建立一个该文本集中的主要概念。
(3)可视化显示和导航:从多个视角出发进行分析。
1.4文本挖掘的主要用途
文本挖掘的主要用途是从原来未经处理的文本中提取未知的知识,但是文本挖掘也是一项非常困难的工作,因为它必须处理那些本来就模糊而且非结构化的文本数据,所以他是一个多学科混杂的领域,涵盖了信息技术、文本分析、模式识别、统计学、数据可视化、数据库技术、机器学习以及数据挖掘等技术。文本挖掘是从数据挖掘发展而来,因此其定义与我们熟知的数据挖掘定一类似。但与传统的数据挖掘相比,文本挖掘有其独特之处,主要变现在:文档本身是非结构化的,无确定形式并且缺乏机器可理解的语义;而数据挖掘的对象以数据库中的结构化数据为主,并利用关系表等存储结构来发现知识。因此,有些数据挖掘技术并不适用于文本挖掘,即使可用,也需要建立在对文本集预处理的基础之上。
1.5文本挖掘与数据挖掘
文本挖掘的过程
文本知识发现主要由以下步骤组成:
2.1文本预处理
选取任务相关的文本并将其转化成文本挖掘工具可以处理的中间形式。
如果是网页文本,去掉html一些tag标记去除停用词(stopwords)、词根还原(stemming)(中文)分词、词性标注、短语识别、…
词频统计
1)TFi,j:特征i在文档j中出现次数,词频(TermFrequency)
2)DFi:所有文档集合中出现特征i的文档数目,文档频率(DocumentFrequency)
TFIDF型权重
TF:aij=TFij
TF*IDF:aij=TFij*log(N/DFi)
TFC:对上面进行归一化
LTC:降低TF的作用
基于熵概念的权重(Entropyweighting)称为termi的某种熵,如果term分布极度均匀:熵等于-1,只在一个文档中出现:熵等于0。
数据清洗:去掉不合适的噪声文档或文档内垃圾数据
文本表示:向量空间模型
降维技术
1)特征选择(FeatureSelection)
2)特征重构(Re-parameterisation,如LSI)
2.2文本挖掘
在完成文本预处理后,可以利用机器学习、数据挖掘以及模式识别等方法提取面向特定应用目标的只是或模式。
2.3模式评估与表示
模式评估与表示为最后一个环节,是利用已经定义好的评估指标对获取的知识或模式进行评价。如果评价结果符合要求,就存储该模式以备用户使用;否则返回到前面的某个环节重新调整和改进,然后再进行新一轮的发现。
如果把文本挖掘视为一个独立的过程,则上面三个步骤可以细化为下图表示:
文本挖掘的关键技术及文本分类
3.1模式评估与表示
文本转换为向量形式并经特征选择以后,便可以进行挖掘分析了。常用的文本分析技术有:文本结构分析、文本摘要、文本分类、文本聚类、文本关联分析、分布分析和趋势预测等。文本分类是其中一种很关键的挖掘任务也是在文本信息处理领域用得最多的一种技术。
文本分类系统的任务是:在给定的分类体系下,根据文本的内容自动地确定文本关联的类别。从数学角度来看,文本分类是一个映射的过程,她将未标明类别的文本映射到已有的类别中,该映射可以使一一映射,也可以是一对多映射,因为通常一篇文本可以同多个类别相关联。用数学公式表示如下:
f:A->B A为待分类文本集,B为分类体系中的类别集合
文本分类的映射规则是系统根据已经掌握的每类若干样本的数据信息,总结出分类的规律性而建立的判别公式和判别规则。然后再遇到心文本时,根据总结出的判别规则,确定文本相关的类别。
3.2文本分类步骤
首先,把一组预先聚类过或标注过类别的文本作为训练集;然后对训练集进行学习以便得出各类的分类模式。
常用的分类算法有:
相似度模型(K-NN)、概率模型(Bayes)、线性模型(SVM)、非线性模型(决策树、神经网络)、组合模型(随机森林)等。
3.3文本分类步骤
- 首先,获取训练文本集。
训练文本集由一组进过预处理的文本特征向量组成,每个训练文本(或称训练样本)有一个类别标号。
- 选择分类方法并训练分类模型。
文本分类方法有统计方法、机器学习方法和神经网络方法等等。在对待分类样本进行分类前,要根据所选择的分类方法,利用训练集进行训练并得出分类模型。
- 用训练好的分类模型对其他待分类文本进行分类。
- 根据分类结果评估分类模型。
下图是一个完整的文本分类过程:
文本挖掘的案例
4.1文本挖掘的实例代码
这是一个关于文本的挖掘的实例:
案例源码:
###1.读取资料库
setwd("F://R/R文本挖掘1")
csv<- read.csv("train.csv",header=T, stringsAsFactors=F)
mystopwords<-unlist (read.table("StopWords.txt",stringsAsFactors=F))
###2.数据预处理(中文分词、stopword处理)
#设置java环境变量
#Sys.setenv(JAVA_HOME='C://ProgramFiles/Java/jdk1.6.0_21/jre')
Sys.setenv(JAVA_HOME='C://Java/jdk1.8.0_60/jre')
library(tm)
#移除数字
removeNumbers= function(x) { ret = gsub("[0-90123456789]","",x)}
#中文分词,也可以考虑使用rmmseg4j、rsmartcn
#安装分词工具包
#install.packages("Rwordseg",repos= "http://R-Forge.R-project.org", type = "source")
library(Rwordseg)
#去除停止词,效果比较差,可以进一步完善
removeStopWords= function(x,words) {
ret= character(0)
index<- 1
it_max<- length(x)
while(index <= it_max) {
if(length(words[words==x[index]]) <1) ret <- c(ret,x[index])
index<- index +1
}
ret
}
sample.words<- lapply(csv$text, removeNumbers)
sample.words<- lapply(sample.words, segmentCN)
#先处理中文分词,再处理stopwords,防止全局替换丢失信息
sample.words<- lapply(sample.words, removeStopWords, mystopwords)
#构建语料库
corpus= Corpus(VectorSource(sample.words))
meta(corpus,"cluster")<- csv$type
unique_type<- unique(csv$type)
#建立文档-词条矩阵
(sample.dtm<- DocumentTermMatrix(corpus, control = list(wordLengths = c(2,Inf))))
###3.wordcloud展示
library(wordcloud)
#不同文档wordcloud对比图
sample.tdm<- TermDocumentMatrix(corpus, control = list(wordLengths = c(2,Inf)))
tdm_matrix<- as.matrix(sample.tdm)
png(paste("sample_comparison",".png",sep = ""), width = 1500, height = 1500 )
comparison.cloud(tdm_matrix)
title(main= "sample comparision")
dev.off()
#按分类汇总wordcloud对比图
n<- nrow(csv)
zz1= 1:n
cluster_matrix<-sapply(unique_type,function(type){apply(tdm_matrix[,zz1[csv$type==type]],1,sum)})
png(paste("sample_cluster_comparison",".png", sep = ""), width= 800, height = 800 )
comparison.cloud(cluster_matrix)
title(main= "sample cluster comparision")
dev.off()
#数据分布不均匀,culture、auto等数据很少。
#按各分类画wordcloud
sample.cloud<- function(cluster, maxwords = 100) {
words<- sample.words[which(csv$type==cluster)]
allwords<- unlist(words)
wordsfreq<- sort(table(allwords), decreasing = T)
wordsname<- names(wordsfreq)
png(paste("sample_",cluster, ".png", sep = ""), width = 600, height =600 )
wordcloud(wordsname,wordsfreq, scale = c(6, 1.5), min.freq = 2, max.words = maxwords,
colors= rainbow(100))
title(main= paste("cluster:", cluster))
dev.off()
}
lapply(unique_type,sample.cloud)#unique(csv$type)