zoukankan      html  css  js  c++  java
  • R语言tm包文本挖掘的学习

    分词之后,便是创建文档-词条矩阵了。

    本文便是针对于此。正式学习tm(text mining)包

    数据读入

    在tm 中主要的管理文件的结构被称为语料库(Corpus),代表了一系列的文档集合。语料库是一个概要性的概念,在这里分为动态语料库(Volatile Corpus,作为R 对象保存在内存中)和静态语料库(Permanent Corpus,R 外部保存)。所对应的函数分别是 VCorpus() 和 PCorpus() 。此外,还有一个 Corpus() 的函数,跟Vcorpus或simpleCorpus的简便版,取决于参数

    我们可以看一下tm 中Corpus(或VCorpus)函数的用法,对于动态语料库:

     VCorpus(x, readerControl = list(reader = reader(x), language = "en")) 

    在tm 中静态语料库也是可以处理的,但需要使用filehash 包来支持:

    PCorpus(x,
         readerControl = list(reader = reader(x), language = "en"),
         dbControl = list(dbName = "", dbType = "DB1"))

    下面来具体介绍以下他们的参数:

      x  :说明资料来源(input location)的源对象(Source Object)。对于这些资料来源(即x),tm 包提供了  一些相关的函数,比如

    • DirSource:处理目录
    • VectorSource:由文档构成的向量
    • DataframeSource:数据框,就像CSV 文件

     readerControl :必须声明reader 和language 两个内容。reader是指从资料源创立的文本文件。tm 包提供了一系列的函数支持(比如,readPlain(),readGmane(), readRCV1(), readReut21578XMLasPlain(), readPDF(), readDOC() 等)。可以使用getReaders() 获得这些函数的列表。对于每一类源,都会有自己默认的reader。比如对DirSource 来说,默认读入输入文件并把内容解释为文本。第二个language 就比较简单了,即字符集,比如可能是UTF-8 字符集。

     dbControl :在使用静态语料库(Pcorpus)条件下,会有此参数。它用来声明R 内存对象外的资料来源(比如数据库)。dbType 控制了包filehash 支持的数据库类型。数据库支持可以有效的减少对内存的要求,但数据的访问会受到硬盘的读写能力限制。

    小实例:

    #1、读取包tm目录下的texts/txt目录下的文本文件
    txt <- system.file("texts", "txt", package = "tm")
    ovid <- Corpus(DirSource(txt),readerControl = list(language = "lat"))
    ovid
    #<<SimpleCorpus>>
    #Metadata:  corpus specific: 1, document level (indexed): 0
    #Content:  documents: 5
    
    #2、从字符向量创建语料库
    docs <- c("This is a text.", "This another one.")
    Corpus(VectorSource(docs))
    #<<SimpleCorpus>>
    #Metadata:  corpus specific: 1, document level (indexed): 0
    #Content:  documents: 2
    
    #3、读取路透社文档创建一个语料库(用于后续示例)
    reut21578 <- system.file("texts", "crude", package = "tm")
    reuters <- Corpus(DirSource(reut21578), readerControl = list(reader = readReut21578XML))
    reuters
    #<<VCorpus>>
    #Metadata:  corpus specific: 0, document level (indexed): 0
    #Content:  documents: 20

    数据输出

    数据输出,也就是保存语料库。可用writeCorpus()函数

    例如,上面实例1中保存: writeCorpus(ovid)   此时,在工作目录下会生成与语料库对应的多个纯文本文件

    语料库的提取

    对于print() 和summary() 函数依然有效,但源信息被隐藏(可以想象一下每个语料库包含了大量的文本,就像数据库一样)。meta() 函数会提供更多的元数据(meta data)信息,完整信息的提取需要使用inspect(),比如:

    对于单个文档的提取此处使用 [[ ,当然既可以通过位置也可以通过名称  ovid[["ovid_1.txt"] 

    此外,查看单个文档内容也可用 as.character(ovid[[1]]) 

    查看多个文档内容: lapply(ovid[1:2],as.character) 

    变换(transformation)

    一旦创建了语料库,后续文档修改则不可避免,比如填充、停止词去除。在tm 包里,这些函数都归到信息转化里面,其主要函数就是tm_map(),这个函数可以通过maps 方式将转化函数实施到每一个语料上。

    转化为纯文本:在reuters 这个语料库中保存的是XML 格式的文本,XML 格式文本没有分析的意义,我们只需要使用其中的文本内容。这个操作可以使用as.PlainTextDocument() 函数来实现:

     reuters <- tm_map(reuters, PlainTextDocument)

    注意,另外一种方式就是使用readReut21578XMLasPlain 读取方式,那么在第一步即为纯文本格式。

    去除多余空白 :  reuters <- tm_map(reuters, stripWhitespace) 

    小写变化:  reuters <- tm_map(reuters, tolower)   更广泛的字符操作可参考gsub

    停止词去除:  reuters <- tm_map(reuters, removeWords, stopwords("english")) 

    填充:  tm_map(reuters, stemDocument)  (需要Snowball 包(并行计算)支持)

    过滤

    过滤器可以移除不感兴趣的(或者感兴趣的)文档。tm提供了tm_filter函数,这个函数的原型为

    • tm_filter(x, FUN,...)
    • tm_index(x,FUN,...)

    其中的FUN函数出入为一片文档,输出为一个bool值。表示是否接受该文档。第二个版本tm_index只是返回满足条件的index,前者返回一个文集,下面是一个使用示例:

     还有一种方法: query <- "id == '237' & heading == 'INDONESIA SEEN AT CROSSROADS OVER ECONOMIC CHANGE'"   tm_filter(reuters, FUN = sFilter, query) 

    但是很遗憾,报错 Error in match.fun(FUN) : object 'sFilter' not found 

    各种百度谷歌无果,没有直接解决的办法。最后都是自定义函数匹配函数实现的。

     元数据管理

    元数据分为两个层次,一个是文集级别的元数据,一个是文档级别的元数据。获得元数据最简单的方式是调用meta()函数,除了meta() 函数外,DublinCore() 函数提供了一套介于Simple Dublin Core 元数据和tm 元数据之间的映射机制,用于获得或设置文档的元数据信息。

    修改文档级别的元数据:A.  DublinCore(crude[[1]], "Creator") <- "Ano Nymous" 

    B.  meta(crude[[1]], "author") <- "Jiang Hang" 

    修改文集级别的元数据:

    创建词条-文档关系矩阵

    创建词条-文档关系矩阵的核心思想就是通过把所有文档所用到的词提取出来,然后行(或列)代表文档,列(或行)代表词,若该文档中该词出现n次,则此处的矩阵元素为n,反之为0。从而构造出一个稀疏矩阵。

    在tm包中提供了两个函数来构造此矩阵,TermDocumentMatrix 和 DocumentTermMatrix,分别以词条文档为行列、文档词条为行列

     

    其他操作:

    • 查找一定频数范围的词。findFreqTerms() 函数, findFreqTerms(x, lowfreq = 0, highfreq = Inf) 找出出现次数高于lowfreq并低于highfreq的条目。例如,findFreqTerms(dtm, 5)找出出现5次以上的条目
    • 查找与某个词相关性高于一定范围的词。 findAssocs(x, terms, corlimit) ,其中tems,corlimit可以是一个向量。例如,findAssocs(tdm,"recent",0.5),找出与recent相关性大于0.5的词,返回的是一个列表。
    • 删减稀疏度大于指定数值的条目。 removeSparseTerms(x, sparse) ,sparse是指稀疏度,0为最大,1为最小。

    字典

    字典是字符串的集合,通常用一个字符串向量表示,可以在DocumentTermMatrix函数中指定一个 字典,这样生成的矩阵中,就只有字典中出现的词语,不在字典中的词语不会出现

     DocumentTermMatrix(reuters,list(dictionary = c("prices", "crude", "oil"))) 

    此外,标准的操作符  [, [<-, [[, [[<-, c(), lapply()  ,可以直接作用在语料库上

    本文参考:刘思喆《R语言环境下的文本挖掘》

  • 相关阅读:
    【English】20190522
    06_Intent和IntentFilter
    05_Content Provider
    04_ Broadcast Receiver
    03_Service的绑定
    02_启动和销毁Service
    01_Activity生命周期及传递数据
    Android对应版本号
    如何在word中插入代码
    项目经验总结
  • 原文地址:https://www.cnblogs.com/Hyacinth-Yuan/p/8253692.html
Copyright © 2011-2022 走看看