特定の品詞の共起語だけをワードクラウドに描画する

 拙著『Rによるやさしいテキストマイニング』の読者の方から、以下のような質問を頂きました。

 最初に「RMeCabパッケージのcollocate関数で品詞を指定することができるか?」を確認したのですが、どうやらできないようです。*1 仕方がないので、とりあえず、以下のように、RMeCabText関数の出力として得られる品詞の情報を使ってみました。恐らくもっと洗練されたやり方があると思いますが、何かのご参考までに。*2 なお、「形容詞の共起語」だけを集計したいというご質問でしたが、以下では「名詞の共起語」を集計しています(原理的にはまったく同じです)。

# パッケージの読み込み
library(RMeCab)
library(stringr)
library(wordcloud)

# 単語と品詞の情報を抽出
# 以下の例では、『Rによるやさしいテキストマイニング』の付属データであるAbe.txtを使用
RMeCabText.result <- RMeCabText(file.choose()) # Abe.txtを指定
word <- unlist(sapply(RMeCabText.result, "[[", 1)) # 単語の情報を抽出
pos <- unlist(sapply(RMeCabText.result, "[[", 2)) # 品詞の情報を抽出
word.vector <- paste(word, pos, sep = "_") # 単語の情報と品詞の情報を結合し、「単語_品詞」のベクトルを作成

# 検索語とスパンを指定
search.word <- "^国民_名詞$" # 検索語を指定する際に「単語_品詞」という形式で指定
span <- 5 # スパンの指定(ここでは、左右5語まで)
span <- (-span : span)

# 共起語の集計
positions.of.matches <- grep(search.word, word.vector, perl = TRUE)
results <- NULL
for(i in 1 : length(span)) {
  collocate.positions <- positions.of.matches + span[i]
  collocates <- word.vector[collocate.positions]
  results <- append(results, collocates)
}
results <- str_replace_all(string = results, pattern = search.word, replacement = "")
not.blank <- which(results != "")
results <- results[not.blank]

# 特定の品詞の共起語だけを抽出
positions.of.matches.2 <- grep("_名詞", results, perl = TRUE) # ここでは名詞
results.2 <- results[positions.of.matches.2]
results.3 <- str_replace_all(string = results.2, pattern = "_名詞", replacement = "") # 品詞の情報(ここでは、"_名詞"の部分)を削除

# ワードクラウドを描画
wordcloud(results.3, min.freq = 1, colors = brewer.pal(8, "Dark2"))

 上記のコードを実行すると、以下のような図ができます。繰り返しになりますが、もっと洗練されたやり方があるかも知れません。

f:id:langstat:20170509100027p:plain

 Rとテキストマイニングに関する詳しい解説は、以下の本などを参照してください。

Rによるやさしいテキストマイニング

Rによるやさしいテキストマイニング

 なお、今回はたまたまお答えできる内容の質問でしたが、必ずしも読者の方の質問全てに対応できるとは限りません。内容的、タイミング的に難しい場合も多々あるかと存じます。どうかご了承くださいませ。

*1:ヘルプにある引数etcの使い方がよく分かりませんでしたが。。。

*2:以下のコードの説明はあまり細かくないので、適宜作成したオブジェクトの中身を確認しながら進めてください。