R语言学习
2015-12-16 10:24
239 查看
1文本挖掘概要
文本挖掘是从大量的文本数据中抽取隐含的,求和的,可能有用的信息。通过文本挖掘实现
•Associate:关联分析,根据同时出现的频率找出关联规则
•Cluster:将相似的文档(词条)进行聚类
•Categorize:将文本划分到预先定义的类别里
•文档自动摘要:利用计算机自动地从原始文档中提取全面准确地反映该文档中心内容的简单连贯描述性短文。
文本挖掘的运用主要有如下几方面
l智能信息检索
同义词,简称词,异形词,同音字、赘字移除
l网络内容安全
内容监控
内容过滤
l内容管理
自动分类
检测和追踪
l市场监测
口碑监测
竞争情报系统
市场分析
2英文文本挖掘实例
实现多个英文文档的聚类分析2.1文本预处理
2.1.1读取文本内容
#取得tm内部文件texts/crude/下的文件目录。>library("tm",lib.loc="d:/ProgramFiles/R/R-3.0.3/library")
>vignette("tm")#获取相关帮助文档的内容,pdf格式
reut<-system.file("texts","crude",package='tm')
#用Corpus命令读取文本并生成语料库文件由于要读取的是xml文件,所以需要xml包
reuters<-Corpus(DirSource(reut),readerControl=list(reader=readReut21578XML))
#DirSource指示的是文件夹路径,如果是单个向量要设为语料库则VectorSource(向量名)readerControl不用设置
查看前两个语料变量内容
另外可以从本地文件中读取用户txt文件
>inputtest<-read.csv(file.choose())
2.1.2文本清理
对于xml格式的文档用tm_map命令对语料库文件进行预处理,将其转为纯文本并去除多余空格,转换小写,去除常用词汇、合并异形同意词汇,如此才能得到类似txt文件的效果需要用到的包SnowballC
reuters<-tm_map(reuters,PlainTextDocument)#去除标签
reuters<-tm_map(reuters,stripWhitespace)#去多余空白
reuters<-tm_map(reuters,tolower)#转换小写
reuters<-tm_map(reuters,removeWords,stopwords("english"))
tm_map(reuters,stemDocument)
2.1.3查找含有特定语句的文档
例如找出文档编号为237而且包含句子INDONESIASEENATCROSSROADSOVERECONOMICCHANGE的文档。>query<-"id=='237'
&heading=='INDONESIASEENATCROSSROADSOVERECONOMICCHANGE'"
>tm_filter(reuters,FUN=sFilter,query)
找到
由于语料库已经将大小写转换以及将介词类删除所以对应的语句只是特有单词的组合。
2.1.4生成词频矩阵并查看内容
dtm<-DocumentTermMatrix(reuters)
查看某部分的词频内容个数,其中dtm行提示哪个文件,列表示词语。
>inspect(dtm[10:15,110:120])
Adocument-termmatrix(6documents,11terms)
Non-/sparseentries:6/60
Sparsity:91%
Maximaltermlength:9
Weighting:termfrequency(tf)
Terms
Docsactivity.addaddedadded.addressaddressedadherenceadheringadvantageadvisersagency
[1,]00000011002
[2,]00000000000
[3,]00000000001
[4,]00000001002
[5,]00000000000
[6,]00000000000
2.1.5查看含有特定词的文档
若要考察多个文档特定词汇的出现频率或以手工生成字典,并将其作为生成阵的参数
>inspect(tdm[c("price","texas"),c("127","144","191","194")])
Aterm-documentmatrix(2terms,4documents)
Non-/sparseentries:6/2
Sparsity:25%
Maximaltermlength:5
Weighting:termfrequency(tf)
Docs
Terms127144191194
price2122
texas1002
>inspect(DocumentTermMatrix(reuters,
+list(dictionary=c("prices","crude","oil"))))
Adocument-termmatrix(20documents,3terms)
Non-/sparseentries:41/19
Sparsity:32%
Maximaltermlength:6
Weighting:termfrequency(tf)
Terms
Docscrudeoilprices
127354
1440114
191320
194410
211020
236172
237030
2.1.6元数据操作(词元素)
2.1.6.1查看词条出现次数大于某个具体值的词
findFreqTerms(dtm,5)#查看出现频大于等于5的词2.1.6.2查看与某一词相关度大于0.8的词条
>findAssocs(dtm,'opec',0.8)opec
meeting0.88
15.80.85
oil0.85
emergency0.83
analysts0.82
buyers0.80
2.1.7处理词频矩阵
>dtm2<-removeSparseTerms(dtm,sparse=0.95)//parse值越少,最后保留的term数量就越少0.95是指如果某一词出现在文档的概率少于(1-0.95)则不再保留到词频矩阵。即删除权重少的元素。2.1.8转换为标准阵
temp=as.data.frame(inspect(dtm2))>temptoscale<-scale(temp)
2.2文本挖掘——聚类分析
>d<-dist(temptoscale,method="euclidean")>fit<-hclust(d,method="ward")
>plot(fit)
2.3分析结果
从聚类图可以看出,文档16和17是比较接近的。而3,4,1,19可以聚成一类,1,6,11,10,13也可分别聚为一类3中文文本挖掘实例
3.1前期准备
3.1.1Mmseg4j分词
使用中文分词法,由于词之间无有像英文一样的空隔,好在有Java已经解决了这样的问题,我们只需要在R-console里加载rJava与rmmseg4j两个工具包即可。如>mmseg4j("中国人民从此站起来了")
[1]中国人民从此站起来
但事实上其技术是好几代之前的了,目前很少有人还在使用,并且其精度不高,用户自定义词典在R测试并无效。
>teststring<-c('我要学习r语言,兴趣小组,学无止尽')
>mmseg4j(teststring)
[1]"我要学习r语言兴趣小组学无止尽"
尽管在D:\ProgramFiles\R\R-3.0.3\library\rmmseg4j\userDic中将自定义的词典r语言写入,但似乎并没有被识别到。
3.1.2Rwordseg介绍
所需要的中文分词包Rwordseg,rjava包Rwordseg是一个R环境下的中文分词工具,使用rJava调用Java分词工具Ansj。
Ansj也是一个开源的Java
中文分词工具,基于中科院的ictclas中文分词算法,采用隐马尔科夫模型(HiddenMarkovModel,HMM)。作者孙健重写了一个Java版本,并且全部开源,使得Ansi可用于人名识别、地名识别、组织机构名识别、多级词性标注、关键词提取、指纹提取等领域,支持行业词典、用户自定义词典。
3.1.2.1分词
segmentCN(strwords,analyzer=get("Analyzer",envir=.RwordsegEnv),
nature=FALSE,nosymbol=TRUE,
returnType=c("vector","tm"),isfast=FALSE,
outfile="",blocklines=1000)
nature用于设置是否输出词性,默认不用。
>segmentCN(teststring)
[1]"我""要""学习""r语言""兴趣""小组""学""无""止""尽"
加入用户自定义词典并进行测试
3.1.2.2自定义词典
>insertWords(c("我要"))>segmentCN(teststring)
[1]"我要""学习""r语言""兴趣""小组""学""无""止""尽"
3.1.2.3安装新的词典
installDict("E:/default.dic")3.1.2.4人名识别设置
>getOption("isNameRecognition")[1]FALSE
segment.options(isNameRecognition=TRUE)用于设置是否进行人名识别
segment.options(isNameRecognition=TRUE)
3.1.3读取网站内容
>library("XML",lib.loc="d:/ProgramFiles/R/R-3.0.3/library")>x<-htmlParse("http://cos.name/cn/")
>iconv(xmlValue(getNodeSet(x,"//a[@href]")[[1]]),'UTF-8','')#转换编码
[1]"COS论坛|统计之都"
tables=readHTMLTable(x)#读取内容
>tables
$`NULL`
NULL
$latest
帖子—发表新帖子<U+00BB>回复作者最后回复最近更新
1COS论坛说明(新手必读)-23…474849979谢益辉cassiusoat2周
3.1.4Tm中文常识
在tm中主要的管理文件的结构被称为语料库(Corpus),代表了一系列的文档集合。语料库是一个概要性的概念,在这里分为动态语料库(Volatile
Corpus,作为R
对象保存在内存中)和静态语料库(PermanentCorpus,R
外部保存)。在语料库构成中,x
必须有一个说明资料来源(inputlocation)的源对象(SourceObject)。我们可以看一下tm中Corpus(或VCorpus)函数的用法,对于动态语料库:
Corpus(x,
2readerControl=list(reader=x$DefaultReader,language="en"),
3...)
在tm
中静态语料库也是可以处理的,但需要使用filehash
包来支持:
1PCorpus(x,
2readerControl=list(reader=x$DefaultReader,language="en"),
3dbControl=list(dbName="",dbType="DB1"),
4...)
对于这些资料来源(即x),tm
包提供了一些相关的函数,比如
•DirSource:处理目录
•VectorSource:由文档构成的向量
•DataframeSource:数据框,就像CSV
文件
第二个参数是readerControl,这里必须声明reader
和language两个内容。第一个reader是指从资料源创立的文本文件。tm包提供了一系列的函数支持(比如,readPlain(),readGmane(),
readRCV1(),readReut21578XMLasPlain(),readPDF(),readDOC()等)。
3.2文件整理
将各个文档放入一个csv文件夹中,格式如下3.3读取文件
>mydata<-read.csv(file.choose(),header=T)3.4生成并处理语料库
>txt<-Corpus(VectorSource(mydata))>txt<-tm_map(txt,removeNumbers)#去除数字
>txt<-tm_map(txt,stripWhitespace)#去除多余空格
>txt<-tm_map(txt,removePunctuation)#去除标点符号
>txt<-tm_map(txt,removeWords,stopwords("english"))#将英文中的停词删掉:例如把that at 等英文介词去掉。
>txt<-tm_map(txt,PlainTextDocument)#去掉空文件
>inspect(txt[1])#查看内容
Acorpuswith1textdocument
Themetadataconsistsof2tag-valuepairsandadataframe
Availabletagsare:
create_datecreator
Availablevariablesinthedataframeare:
MetaID
$txt1
确定性趋势
3.5中文分词并重新生成语料库
txt<-segmentCN(as.character(txt))#将语料库中的中文时行分词txt<-Corpus(VectorSource(txt))
3.6导入中文停词表
将文件转换成csv文件导入中文停词表,并转换成向量格式cnword<-read.csv(file.choose(),header=F,stringsAsFactors=F)
cnword<-as.vector(cnword[1:dim(cnword)[1],])#需要为向量格式
3.7生成词频矩阵并处理稀疏词汇
dtm<-DocumentTermMatrix(txt,control=list(dictionary=cnword,removePunctuation=TRUE,stopwords=TRUE,wordLengths=c(1,Inf)))#Punctuation是否去掉标点符号默认falseremoveNumbers是否去掉数字默认false,#dictionary设置要统计的中文词语,如果不设置的话,默认会从所有的语料库里统计。#wordLengths设置如果词的长度大于X时舍去。
>dtm2=removeSparseTerms(dtm,sparse=0.9)
df_dtm2<-as.data.frame(inspect(dtm2))#将词频矩阵转换为数据框格式得到
Adocument-termmatrix(5documents,783terms)
Non-/sparseentries:890/3025
Sparsity:77%
Maximaltermlength:65
Weighting:termfrequency(tf)
3.8文本挖掘——聚类分析
>d<-dist(dtm2,method="euclidean")>fit<-hclust(d,method="ward")
>plot(fit)
3.9分析结果
事实上文件123是有关于时间序列实习笔记,其相似度最高,图中也显示了他们可以聚为一类,证明分析的可靠性。相关文章推荐
- 图像矫正----认识畸变(Distortion)
- eclipse构建及运行maven web项目
- 异常解决:util.NativeCodeLoader: Unable to load native-hadoop library for your platform
- 动态规划之0-1背包问题
- C#拓展方法
- SharePoint Permission Analyzer 权限分析仪
- ios集成语音朗读功能
- 基于JavaScript获取鼠标位置的各种方法
- 线程池的理解
- Webstorm的快捷键
- Linux的inode的理解
- 抽象概括能力
- QDataTime的一些使用概述
- android源码分析(ZZ)
- WIZnet通过启动在线培训活动:计算机网络TCP/IP协议而事实上,现在的方法
- 运维排查问题的方法和脚本
- 无需key的ext4显示百度地图
- mysql配置文件my-innodb-heavy-4G.cnf中文版解释
- 如何成为一个真正在路上的Linuxer
- javaScript将json字符串转对象