Rを通じて統計学を学ぶ備忘録ブログ

SPSSからRに移行したい私のような人向けのR解説ブログ兼学習用備忘録。

テキストマイニングはじめました~その10~

今回はwordcloud関数の使い方をみていきます。wordcloud関数の説明は以下のページでもされているのですが、テキストマイニング初心者の私では、想像力が足りないため、出力された結果がどのような過程で出力されているのかわかりませんでした・・・

なので、いろいろと実験しながらwordcloud関数を理解していきます。目標は、以下の通りです。fontはMcKloudです。wordcloudのcloudは、たぶん「かたまり」を意味しているものかと思いますが、「雲」という意味もありますので、それつながりで雲みたいなフォントMcKloudを使います。ちょっと雲の感じがですぎて視認性は悪いですが・・・

wordcloud関数の使い方と出力までの過程を理解する

f:id:teruaki-sugiura:20160618154649p:plain

まずはwordcloudから見ていきます。他のcommonality.cloudやtextplotなどでも、wordcloudの引数を参照する必要があるので、まずはこれの主要な引数を見てみます。wordcloudのヘルプで見てみると以下のようになっています。和訳が間違っていたらすみません・・・

f:id:teruaki-sugiura:20160618152616p:plain

Plot a word cloud(言葉のかたまりをプロットする)

f:id:teruaki-sugiura:20160618152625p:plain

wordcloud(words, freq, scale = c(4,.5), min.freq = 3, max.words = Inf, random.order = TRUE, random.color = FALSE, rot.per = .1, colors = "black", ordered.colors = FALSE, use.r.layout = FALSE, fixed.asp = TRUE,...)

f:id:teruaki-sugiura:20160618152725p:plain

words:the words(言葉) freq:their frequencies(言葉の頻度) scale:A vector of length 2 indicating the range of the size of the words.(言葉の大きさと文字の間隔を指示する長さが2のベクトル) min.freq:words with frequency below min.freq will not be plotted(min.freq以下の頻度の言葉はプロットされない) max.words:Maximum number of words to be plotted. least frequent terms dropped(プロットされる最大の言葉の数。もっとも頻度が少ない言葉は落とされる) random.order:plot words in random order. If false, they will be plotted in decreasing frequency(ランダムに言葉をプロットする。FALSEなら、decreasing frequency(降順?)でプロット) random.color:choose colors randomly from the colors. If false, the color is chosen based on the frequency(「colors」からランダムに色を選ぶ。FALSEなら、頻度が高い順に色付けする) rot.per:proportion words with 90 degree rotation(90度の回転で言葉の割合をしめす) colors:color words from least to most frequent(少ない頻度順に色付けする) ordered.colors:if true, then colors are assigned to words in order(もしTRUEなら、言葉の並び順に色が割りつけられる)

f:id:teruaki-sugiura:20160618170056p:plain

x <- 1:20
d <- data.frame(list1 = seq(5,100,5), list2 = mapply(function(x){return(x^2)}, x), row.names = paste("word", 1:20, sep = ""))

f:id:teruaki-sugiura:20160618170139p:plain

今回使用するデータはこんな感じです。文書間で比較すると、list2の方が頻度が高く、言葉ごとに比較すると、wordの数字が大きくなればなるほど頻度が高くなるようにデータフレームを作為的に作成しました。このデータフレームを使って、wordcloudを理解していきます。

wordcloud(words = rownames(d), freq = d[,2],#d$list2でも同じ, scale = c(5, 2), min.freq = 0, max.words = 20, random.order = TRUE, rot.per = 0, random.color = TRUE, colors = brewer.pal(10, "Paired"))

f:id:teruaki-sugiura:20160618165311p:plainword20に近づくにつれて、各wordの大きさが徐々に変化しています。つまり、word20に近づくほどに頻度が高くなっているからですね。なのでwordcloudは文字の大きさをもって、その言葉の頻度を表してくれる便利な関数です。 f:id:teruaki-sugiura:20160618154656p:plaincommonality cloudです。ヘルプで見てみると以下のようになっています。wordcloudで説明したものは外してます。そして、和訳が間違っていたらすみません・・・ここでは、以下のように説明されています。

グループ間で共通して出現する単語を、グループ間で出現頻度の差が小さい順番に表示します。

f:id:teruaki-sugiura:20160618152616p:plain

Plot a cloud of words shared across documents(文書間で共有されている言葉のかたまりをプロットする)

f:id:teruaki-sugiura:20160618152625p:plain

commonality.cloud(term.matrix, comonality.measure = min, max.words = 300, ...)

f:id:teruaki-sugiura:20160618153034p:plain

term.matrix:A term frequency matrix whose rows represent words and whose columns represent documents.(言葉を行に持ち、文書を列に持つ(頻度の)文書行列) comonality.measure:A function taking a vector of frequencies for a single term, and returning a common frequency(共通性測定:単一タームに対して頻度のベクトルをとる関数で共通頻度を返す)

f:id:teruaki-sugiura:20160618170056p:plain

commonality.cloud(term.matrix = d, scale = c(4, 2), max.words = 10, random.order = TRUE, random.color = TRUE, colors = brewer.pal(10, "Paired"))

f:id:teruaki-sugiura:20160618171817p:plainmax.word=10に設定しているので、表示される言葉の数が10個に限定されています。また、文書間の差が小さい順に表示されるため、20~11までが表示されています。以下は文書間の差を示したものです。 f:id:teruaki-sugiura:20160618172039p:plain f:id:teruaki-sugiura:20160618154709p:plain

お次はtext plotです。ヘルプで見てみると以下のようになっています。wordcloudで説明したものは外してます。そして、和訳が間違っていたらすみません・・・簡単には、non-overlapping(重ならない)で、x,y軸にテキストをプロットする関数。

f:id:teruaki-sugiura:20160618152616p:plain

An x y plot of non-overlapping text(non-overlapping(重ならない)で、x,y軸にテキストをプロットする関数)

f:id:teruaki-sugiura:20160618153137p:plain

textplot(x, y, words, cex = 1, new = TRUE, show.lines = TRUE, ...)

f:id:teruaki-sugiura:20160618153034p:plain

x:x coordinates(x座標) y:y coordinates(y座標) words:the text to plot(プロットされる言葉) cex:font size(フォントサイズ) new:should a new plot be created(新しいプロットが作成される)

f:id:teruaki-sugiura:20160618170056p:plain

textplot(x = d[,1], y = d[,2], words = rownames(d), cex = 1.0, new = TRUE, xlab = "list1", ylab = "list2")

f:id:teruaki-sugiura:20160618165434p:plain これは簡単。各言葉がどの文書でどれくらいの頻度で出現したのかを示す散布図ですね。 f:id:teruaki-sugiura:20160618154737p:plain

最後はcomparison cloudです。ヘルプで見てみると以下のようになっています。wordcloudで説明したものは外してます。そして、和訳が間違っていたらすみません・・・ここでは、以下のように説明されています。

あるグループのみに出現する単語を最優先に、グループ毎の出現数が多くかつグループ間の出現頻度の差が小さい順に単語をグループカラーで表示します。

f:id:teruaki-sugiura:20160618152616p:plain

Plot a cloud comparing the frequencies of words across documents. (文書間で言葉の頻度を比較する塊をプロットする)

f:id:teruaki-sugiura:20160618153137p:plain

comparison.cloud(term.matrix, scale = c(4,.5), max.words = 300, random.order = FALSE, rot.per = .1, colors = brewer.pal(ncol(term.matrix),"Dark2"), use.r.layout = FALSE, title.size = 3, ...)

f:id:teruaki-sugiura:20160618153034p:plain

wordcloudとほとんど同じなので、省略。

f:id:teruaki-sugiura:20160618170056p:plain

comparison.cloud(term.matrix = d, scale = c(5, 2), max.words = 20, colors = c("#8FA2C9", "#F0C7C6"), random.order = TRUE)

f:id:teruaki-sugiura:20160618165451p:plain んんん、、、よくわからん結果になってしまいました。これは説明用のデータフレームがこの関数の説明には適していないだけで、本来は「あるグループのみに出現する単語を最優先に、グループ毎の出現数が多くかつグループ間の出現頻度の差が小さい順に単語をグループカラーで表示する」ものです。

以上でおしまい。

広告を非表示にする