分詞以後,即是建立文檔-詞條矩陣了。數據庫
本文即是針對於此。正式學習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
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)
一旦建立了語料庫,後續文檔修改則不可避免,好比填充、中止詞去除。在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函數,這個函數的原型爲
其中的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,分別以詞條文檔爲行列、文檔詞條爲行列
其餘操做:
字典是字符串的集合,一般用一個字符串向量表示,能夠在DocumentTermMatrix
函數中指定一個 字典,這樣生成的矩陣中,就只有字典中出現的詞語,不在字典中的詞語不會出現
DocumentTermMatrix(reuters,list(dictionary = c("prices", "crude", "oil")))
此外,標準的操做符 [, [<-, [[, [[<-, c(), lapply() ,能夠直接做用在語料庫上
本文參考:劉思喆《R語言環境下的文本挖掘》