2012/10/23

自分のための「RでWordcloud」

文化科学という分野では、扱う情報がとにかく多彩。
何か、一つの分析が出来る程度では、何も見えてこない。
多角的に物事を観察するには、あらゆる手段を考える必要がある。

空間データ時間データ数値テキスト音声動画画像...とにかく全て。
私自身、これらのデータの扱いに関するプロフェッショナルには程遠い。
現在は、まだまだ、修行中の身である。だから、論文に書くまでの技術の話はブログに。

ここに書いてある程度の話は、どこかに書いてあること。
いちいち、論文に書く必要もあるまい。アイデアをドロボーとか、
そのようなことは、気にせず、書いてしまうことにする。

ということで、少し前から気になっていたテキストマイニング。
入門者であるので、とりあえず、見た目で面白そうなことから手を付ける。
見たことがある人も多いであろう「Wordcloud」というもの。

R では、wordcloudというパッケージがあって、
tmパッケージと組み合わすことで、比較的簡単にWordcloud が作れる。
ただし、Mac版のRの場合、色々と設定が厄介そうだったので、Ubuntuで作成。

なお、「Rmpi」と「Rcpp」というパッケージのインストールで苦戦。
少々、セコイ方法かもしれないが、Ubuntu のソフトウェア管理ソフト、
Synaptic で検索して、関節的にパッケージをインストールした。

覚書のようなものなので、意味が解らない人もいるかもしれないが、
表題にもあるように「自分のため」なので、説明の改善しないかもしれない。
ダメ元でも!という人は、下のコメントで質問を。

今回は、Wikipedia の記事を使って、色々と実験してみる。
データは一応、以下の所に置いておく。
Wikipedia の年ごとの出来事記事をいくつか抜粋。

今回は、テキストファイルなので、各自でダウンロードして実行。
1800.txt1918.txt1995.txt、の3つのファイル。
ダウロード先のディレクトリは、"/path/to/downloads" としておく。

以下が実行コード。

par(mfrow=c(1,3))

txt1 <- scan('/path/to/downloads/1800.txt', what="character")
cis.wordcloud(txt1, "Wordcloud for historical\n events in 1800", cex.main=1.5, col="green")

txt2 <- scan('/path/to/downloads/1918.txt', what="character")
cis.wordcloud(txt2, "Wordcloud for historical\n events in 1918", cex.main=1.5, col="red")

txt3 <- scan('/path/to/downloads/1995.txt', what="character")
cis.wordcloud(txt3, "Wordcloud for historical\n events in 1995", cex.main=1.5, col="blue")

っで、以下がそのソースコード

cis.wordcloud <- function(txt, main="Wordcloud for the text", col=1, cex.main=2.0){
# Load required packages.
require(wordcloud)
require(tm)

# Create a corpra from the text file.
corp <- Corpus(VectorSource(paste(txt, collapse=" ")))
corp <- tm_map(corp, removePunctuation)
corp <- tm_map(corp, removePunctuation)par(mfrow=c(1,3))

txt1 <- scan('/home/yufujimoto/Desktop/1800.txt', what="character")
cis.wordcloud(txt1, "Wordcloud for historical\n events in 1800", cex.main=1.5, col="green")

txt2 <- scan('/home/yufujimoto/Desktop/1918.txt', what="character")
cis.wordcloud(txt2, "Wordcloud for historical\n events in 1918", cex.main=1.5, col="red")

txt3 <- scan('/home/yufujimoto/Desktop/1995.txt', what="character")
cis.wordcloud(txt3, "Wordcloud for historical\n events in 1995", cex.main=1.5, col="blue")
corp <- tm_map(corp, tolower)
corp <- tm_map(corp, removeNumbers)
corp <- tm_map(corp, function(x)removeWords(x,stopwords()))

# Create a dataframe to build a word cloud.
term.matrix <- TermDocumentMatrix(corp)
term.matrix <- as.matrix(term.matrix)
term.vector <- sort(rowSums(term.matrix), decreasing=TRUE)
term.data <- data.frame(word=names(term.vector), freq=term.vector)

# Draw a word cloud
wordcloud(term.data$word, term.data$freq, col=col)
mtext(main, side=3, cex=cex.main)
}

0 件のコメント:

コメントを投稿