zoukankan      html  css  js  c++  java
  • package(1):tm

        tm包是R语言中为文本挖掘提供综合性处理的package,进行操作前载入tm包,vignette命令可以让你得到相关的文档说明。使用默认安装的R平台是不带tm  package的,在安装的过程中,它会依赖于NLP’,‘BH’ ,‘slam’包,所以最简单的方式就是采用在线安装。 在tm 中主要的管理文件的结构被称为语料库(Corpus),代表了一系列的文档集合

    tm包安装


    • 在安装依赖的slam包时,出现如下异常,R版本3.2.5
      > install.packages("slam", type = "source")
      Installing package into ‘C:/Users/zhushy/Documents/R/win-library/3.2’
      (as ‘lib’ is unspecified)
      Warning in install.packages :
        package ‘slam’ is not available (for R version 3.2.5)
    •  通过如下方式解决:
    1. 参考:https://cran.r-project.org/web/packages/tm/index.html
    2. 参考:http://stackoverflow.com/questions/40419015/install-packagestm-dependency-slam-is-not-available
      library(devtools)
      install_url("https://cran.r-project.org/src/contrib/Archive/slam/slam_0.1-37.tar.gz")

    基本函数


    •  基本用法参考:http://blog.163.com/zzz216@yeah/blog/static/162554684201412892742116/
    • vignette("tm")   //会打开一个tm.pdf的英文文件,讲述tm   package的使用及相关函数
    •  VectorSource函数: 可以将字符向量创建为corpus,示例如下: 
      > library(tm)
      > library(NLP)
      > doc=c("halo halo !","this is second word!") 
      > corpus1=Corpus(VectorSource(doc))
      > corpus1
      <<SimpleCorpus>>
      Metadata:  corpus specific: 1, document level (indexed): 0
      Content:  documents: 2
    • system.file(): 在指定的package中找到每个文件的地址
      #找到tm包下texts/crude文件夹的位置,里面含有20个xml文档
      adress=system.file("texts","crude",package="tm") 
      reuters=Corpus(DirSource(adress),readerControl=list(reader=readReut21578XML))
    • DirSource():建立一个目录,除此之外还可以利用如下的函数导入不同形式的数据
    1. VectorSource:由文档构成的向量
    2. DataframeSource:数据框,就像 CSV 文件
    • readerControl=list(reader=,language=),ReadControl中有ReadDOC,readPDF,readPlain,readReut21578XML等不同的读入方式,可以使用getReaders()函数显示出所用的可能的方式,如下:
      > getReaders()
       [1] "readDOC"                 "readPDF"                 "readPlain"              
       [4] "readRCV1"                "readRCV1asPlain"         "readReut21578XML"       
       [7] "readReut21578XMLasPlain" "readTabular"             "readTagged"             
      [10] "readXML"
    • Corpus:会将此目录下的文件当做一个个的文档

    查看及写语料包


    • writeCorpus() :将生成的语料库保存成多个纯文本文件
      writeCorpus(corpus1,"E:\R\",c("a1.txt","a2.txt")) 
    • 结果如下图:(说明:原字符中下图中字符,有敏感词变禁止提交,so 上面的代码换成字母类)
    • 查看:inspectprintsummary
      > inspect(reuters)
      <<VCorpus>>
      Metadata:  corpus specific: 0, document level (indexed): 0
      Content:  documents: 20
      
      [[1]]
      <<XMLTextDocument>>
      Metadata:  16
      ........
      
      > print(reuters)
      <<VCorpus>>
      Metadata:  corpus specific: 0, document level (indexed): 0
      Content:  documents: 20
      
      > summary(reuters)
          Length Class           Mode
      127 2      XMLTextDocument list
      144 2      XMLTextDocument list
      191 2      XMLTextDocument list
      194 2      XMLTextDocument list
      .......

    transformation


    • 主要是tm_map函数,可以使用 getTransformations()函数查看所有的字符处理方式(好象不全)
      > getTransformations()
      [1] "removeNumbers"     "removePunctuation" "removeWords"       "stemDocument"      "stripWhitespace" 
    •  示例:

      #将reuters转换为纯文本,去除标签
      reuters=tm_map(reuters,PlainTextDocument) 
      # 所有字母转换成小写
      corpus_clean <- tm_map(reuters, tolower)
      # 去除text中的数字
      corpus_clean <- tm_map(reuters, removeNumbers)
       # 去除停用词,例如and,or,until...
      corpus_clean <- tm_map(reuters, removeWords, stopwords())
      # 去除标点符号
      corpus_clean <- tm_map(reuters, removePunctuation)
      # 去除多余的空格,使单词之间只保留一个空格
      corpus_clean <- tm_map(reuters, stripWhitespace)

    meta


    • 元数据是为了标记语料库的附加信息,最简单的使用范式就是调用meta()函数 .文档会被预先被定义一些属性,比如作者信息,但也可能是任意自定义的元数据标签。这些附加的元数据标签都是独立的附加在单个文档上。从语料库的视角上看,这些元数据标签被独立的存储在每个文档上。除了meta()函数外,DublinCore()函数提供了一套介于SimpleDublin Core元数据和tm元数据之间的映射机制,用于画的或设置文档的元数据信息
    • DublinCore:按照都柏林核心的国际标准显示
    • 示例:
      data("crude") 
      meta(crude[[1]])
      DublinCore(crude[[1]])
    •  可以对其进行相应的修改、添加

      > data("crude") 
      > meta(crude[[1]],tag="author")
      character(0)
      > meta(crude[[1]],tag="author") <- "ZZ"
      > meta(crude[[1]])
        author       : ZZ
        datetimestamp: 1987-02-26 17:00:56
        .......

    词条-文档关系矩阵


    • 在tm 包里,根据词条、文档分别作为行、列或反之,对应有TermDocumentMatrix DocumentTermMatrix 两类稀疏矩阵, 如下:
      > doc=c("This is Frist Word.","That is Second Word!") 
      > corpus1=Corpus(VectorSource(doc))
      > dtm <- DocumentTermMatrix(corpus1)
      > inspect(dtm)
      <<DocumentTermMatrix (documents: 2, terms: 5)>>
      Non-/sparse entries: 6/4
      Sparsity           : 40%
      Maximal term length: 6
      Weighting          : term frequency (tf)
      Sample             :
          Terms
      Docs frist second that this word
         1     1      0    0    1    1
         2     0      1    1    0    1
    •  字典是一个字符集合。经常用于在文本挖掘中展现相关的词条时。使用Dictionary() 函数实现,当将字典传递到DocumentTermMatrix() 以后,生成的矩阵会根据字典提取计算,而不是全部提取

      > d=c("word") 
      > inspect(DocumentTermMatrix(corpus1, list(dictionary = d)))
      <<DocumentTermMatrix (documents: 2, terms: 1)>>
      Non-/sparse entries: 2/0
      Sparsity           : 0%
      Maximal term length: 4
      Weighting          : term frequency (tf)
      Sample             :
          Terms
      Docs word
         1    1
         2    1
    •  实际上对于矩阵的操作R 有大量的函数(比如聚类、分类算法等)支持,但这个包还是提供了一些常用的函数支持。

    • 假如需要找出发生2 次及以上的条目,可以使用findFreqTerms() 函数:
      > findFreqTerms(dtm,2)
      [1] "word"
    •  找到相关性,比如对于opec,找到相关系数在0.8 以上的条目,使用findAssocs(),以上小节示例为例

    • 词条-文档关系矩阵一般都是非常庞大的数据集,因此这里提供了一种删减稀疏条目的方法removeSparseTerms,比如有些条目尽在很少的文档中出现。一般来说,这样做不会对矩阵的信息继承带来显著的影响。
    • 因为生成的term-document矩阵dtm是一个稀疏矩阵,再进行降维处理,之后转为标准数据框格式,以上节示例说明:
      #进行降维处理
      dtm2 <- removeSparseTerms(dtm, sparse=0.95) 
      #将term-document矩阵生成数据框
      data <- as.data.frame(inspect(dtm2))

    完整示例 


    library(tm)
    library(NLP)
    
    #找到tm包下texts/crude文件夹的位置,里面含有20个xml文档
    adress=system.file("texts","crude",package="tm") 
    reuters=Corpus(DirSource(adress),readerControl=list(reader=readReut21578XML))
    
    #将reuters转换为纯文本,去除标签
    reuters=tm_map(reuters,PlainTextDocument) 
    # 所有字母转换成小写
    corpus_clean <- tm_map(reuters, tolower)
    # 去除text中的数字
    corpus_clean <- tm_map(reuters, removeNumbers)
     # 去除停用词,例如and,or,until...
    corpus_clean <- tm_map(reuters, removeWords, ("english")) 
    # 去除标点符号
    corpus_clean <- tm_map(reuters, removePunctuation)
    # 去除多余的空格,使单词之间只保留一个空格
    corpus_clean <- tm_map(reuters, stripWhitespace)
    #将文档转为稀疏矩阵,
    dtm <- DocumentTermMatrix(reuters)
    #找出发生5次及以上的条目
    findFreqTerms(dtm, 5) 
    #找相关性,比如对于opec,找到相关系数在0.8 以上的条目
    findAssocs(dtm, "opec", 0.8)  
    #要考察多个文档中特有词汇的出现频率,可以手工生成字典,并将它作为生成矩阵的参数
    d <- Dictionary(c("prices", "crude", "oil")))
    inspect(DocumentTermMatrix(reuters, list(dictionary = d)))
    
    #进行降维处理
    dtm2 <- removeSparseTerms(dtm, sparse=0.95) 
    #将term-document矩阵生成数据框
    data <- as.data.frame(inspect(dtm2))   

     

  • 相关阅读:
    hdu 5695 Gym Class (拓扑排序)
    bzoj 2002[Hnoi2010]Bounce 弹飞绵羊(分治分块)
    Codeforces Round #355 (Div. 2) D. Vanya and Treasure 分治暴力
    二分图匈牙利模板
    2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 GSM Base Station Identification (点在多边形内模板)
    hdu 1007 Quoit Design (经典分治 求最近点对)
    2017 ACM-ICPC乌鲁木齐网络赛 B. Out-out-control cars(计算几何 直线相交)
    hdu 6146 Pokémon GO (计数)
    hdu 2732 Leapin' Lizards (最大流 拆点建图)
    hdu 1451 Area in Triangle(计算几何 三角形)
  • 原文地址:https://www.cnblogs.com/tgzhu/p/6680525.html
Copyright © 2011-2022 走看看