2014年9月20日 星期六

[R] tm package version 0.6 大解析(text mining文字探勘套件)

        有在玩text mining的同好,最近不知道有沒有碰過類似的問題,就是很多以前用tm套件的程式跑不出來或有問題(先前文章[R] TEXT MINING(文字探勘、文本分析練習)就有使用這個套件)。這是因為tm套件在今年的6/1號升級到了0.6版(http://cran.r-project.org/web/packages/tm/index.html)改變了包裝corpus的方式(http://cran.r-project.org/web/packages/tm/news.html)很多東西都必須rebuild才能正常運作(其實這也是我個人的血淚經驗).




先來做一個簡單的corpus:

text <- c("今天天氣很好1","今天天氣很好2")
d.corpus <- Corpus(VectorSource(text))
inspect(d.corpus)
'''
<<VCorpus (documents: 2, metadata (corpus/indexed): 0/0)>>
[[1]]
<<PlainTextDocument (metadata: 7)>>
今天天氣很好1
[[2]]
<<PlainTextDocument (metadata: 7)>>
今天天氣很好2
'''
view raw gistfile1.r hosted with ❤ by GitHub
用inspect可以看到這個corpus有兩個文件.
(熟悉tm套件的人應該有發現現在物件結構長得跟以前不太一樣,但是結構的事晚點再看,以下先來示範如果用以前的程式碼會發生什麼事情)

d.corpus <- tm_map(d.corpus, function(x) gsub("今天","昨天",x))
inspect(d.corpus)
<<VCorpus (documents: 2, metadata (corpus/indexed): 0/0)>>
[[1]]
[1] 昨天天氣很好1
[[2]]
[1] 昨天天氣很好2
view raw gistfile1.r hosted with ❤ by GitHub
這是一個很簡單的範例,將文件中的“今天”,代換成“昨天”,用inspect看還一切正常,接著我們要把文件轉換成文字矩陣:

tdm = as.matrix(TermDocumentMatrix(d.corpus))
'''
Error in UseMethod("meta", x) :
no applicable method for 'meta' applied to an object of class "character"
In addition: Warning message:
In mclapply(unname(content(x)), termFreq, control) :
all scheduled cores encountered errors in user code
'''
view raw gistfile1.r hosted with ❤ by GitHub
這時候會發現轉不過去(晴天霹靂!!!
原因在於0.6版的tm套件改變了包裝文件的方式...
我們先來看一下新的文件結構長什麼樣子:

> str(d.corpus)
List of 2
$ 1:List of 2
..$ content: chr "今天天氣很好1"
..$ meta :List of 7
.. ..$ author : chr(0)
.. ..$ datetimestamp: POSIXlt[1:1], format: "2014-09-19 16:12:28"
.. ..$ description : chr(0)
.. ..$ heading : chr(0)
.. ..$ id : chr "1"
.. ..$ language : chr "en"
.. ..$ origin : chr(0)
.. ..- attr(*, "class")= chr "TextDocumentMeta"
..- attr(*, "class")= chr [1:2] "PlainTextDocument" "TextDocument"
$ 2:List of 2
..$ content: chr "今天天氣很好2"
..$ meta :List of 7
.. ..$ author : chr(0)
.. ..$ datetimestamp: POSIXlt[1:1], format: "2014-09-19 16:12:28"
.. ..$ description : chr(0)
.. ..$ heading : chr(0)
.. ..$ id : chr "2"
.. ..$ language : chr "en"
.. ..$ origin : chr(0)
.. ..- attr(*, "class")= chr "TextDocumentMeta"
..- attr(*, "class")= chr [1:2] "PlainTextDocument" "TextDocument"
- attr(*, "class")= chr [1:2] "VCorpus" "Corpus"
view raw gistfile1.r hosted with ❤ by GitHub
怕了吧?看起來超複雜的XD
簡單來說就是現在包裝文件的方式變成像書本一樣,每個文件分別存放在一個獨立的textDocument的list裏面,美個textDucument又分別裝著content和meta檔,content裝著文件內容,meta裝著類似作者,標題,建立日期等一些關於文件說明的部分.

過去的tm_map功能能夠自動存取每個文件的內容,但是現在如果直接套用tm_map(如上面的範例)會強至將文件變成單純的chr,喪失文件屬性:

> str(d.corpus)
List of 2
Error in UseMethod("meta", x) :
no applicable method for 'meta' applied to an object of class "character"
view raw gistfile1.r hosted with ❤ by GitHub
如果現在要對文件內容作調整(無論是分詞還是替換單字),要引用新的function==> content()或是content_transformer():

> d.corpus <- Corpus(VectorSource(text))
> d.corpus <- tm_map(d.corpus, content_transformer(function(x) gsub("今天","昨天",x)))
> inspect(d.corpus)
<<VCorpus (documents: 2, metadata (corpus/indexed): 0/0)>>
[[1]]
<<PlainTextDocument (metadata: 7)>>
昨天天氣很好1
[[2]]
<<PlainTextDocument (metadata: 7)>>
昨天天氣很好2
> str(d.corpus)
List of 2
$ 1:List of 2
..$ content: chr "昨天天氣很好1"
..$ meta :List of 7
.. ..$ author : chr(0)
.. ..$ datetimestamp: POSIXlt[1:1], format: "2014-09-19 16:35:11"
.. ..$ description : chr(0)
.. ..$ heading : chr(0)
.. ..$ id : chr "1"
.. ..$ language : chr "en"
.. ..$ origin : chr(0)
.. ..- attr(*, "class")= chr "TextDocumentMeta"
..- attr(*, "class")= chr [1:2] "PlainTextDocument" "TextDocument"
$ 2:List of 2
..$ content: chr "昨天天氣很好2"
..$ meta :List of 7
.. ..$ author : chr(0)
.. ..$ datetimestamp: POSIXlt[1:1], format: "2014-09-19 16:35:11"
.. ..$ description : chr(0)
.. ..$ heading : chr(0)
.. ..$ id : chr "2"
.. ..$ language : chr "en"
.. ..$ origin : chr(0)
.. ..- attr(*, "class")= chr "TextDocumentMeta"
..- attr(*, "class")= chr [1:2] "PlainTextDocument" "TextDocument"
- attr(*, "class")= chr [1:2] "VCorpus" "Corpus"
view raw gistfile1.r hosted with ❤ by GitHub
這樣就可以在保有原本corpus屬性下調整內容,自然也可以順利轉成文字矩陣:

> tdm = as.matrix(TermDocumentMatrix(d.corpus))
> tdm
Docs
Terms 1 2
昨天天氣很好1 1 0
昨天天氣很好2 0 1
view raw gistfile1.r hosted with ❤ by GitHub
希望能幫助到有在玩text mining但是最近無法使用的朋友XD






2 則留言:

  1. 為了這個卡了半天, 直到看見這篇部落格,萬分感謝!!!

    回覆刪除