R語言tm包文本挖掘的學習

分詞以後,即是建立文檔-詞條矩陣了。數據庫

本文即是針對於此。正式學習tm(text mining)包app

數據讀入

在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")) spa

在tm 中靜態語料庫也是能夠處理的,但須要使用filehash 包來支持:3d

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

下面來具體介紹如下他們的參數:code

  x  :說明資料來源(input location)的源對象(Source Object)。對於這些資料來源(即x),tm 包提供了  一些相關的函數,好比orm

  • 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 支持的數據庫類型。數據庫支持能夠有效的減小對內存的要求,但數據的訪問會受到硬盤的讀寫能力限制。blog

小實例:

#一、讀取包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

#二、從字符向量建立語料庫
docs <- c("This is a text.", "This another one.")
Corpus(VectorSource(docs))
#<<SimpleCorpus>>
#Metadata:  corpus specific: 1, document level (indexed): 0
#Content:  documents: 2

#三、讀取路透社文檔建立一個語料庫(用於後續示例)
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語言環境下的文本挖掘》

相關文章
相關標籤/搜索