noteのディレクターが、2018年のnoteをRMeCabを使ったワードクラウドで振り返る
こんにちは。noteディレクターのtamaです。この記事はR Advent Calendar 2018 20日目の記事です。
まえおき
僕は今年から統計学の勉強を初めて、少し前から統計分析によく使われる「R」を使いはじめました。プログラミングのキャリアはありませんが、去年はPythonを勉強したり、データベースから必要なデータを抜き出すSQLは日常的に書いていて、いちおうコードには抵抗のない人間です。
普段はnoteを利用してくださっているクリエイターの方々のサポートなどをしています。
今回は、同僚のススメで R Advent Calendar初参加です。
何をやっていくか
2018年ももう終わりですね。note は今年すごく成長しまして、たくさんの方々が投稿をしてくれました。noteのクリエイター、並びに読者のみなさま、今年もありがとうございました。
統計学を勉強している手前、なにかそれにまつわることをRで実現して書こうかともおもったのですが、あんまり公開できる情報が無いな…と。
そこで、2018年よく読まれた記事をワードクラウドで振り返るという企画を思いつきました。
参考図書はこちら
※ワードクラウドとは
文章中によく出てくる単語をその頻度=大きさで表して、表示する手法です。タグクラウドともいうらしい。
ではいってみます。
前準備
必要なライブラリを一通り読み込み、抽出した記事データを変数に代入します。
# 必要なライブラリを読み込む
library(RMeCab) # 形態素解析のため
library(dplyr) # データ整形のため
library(rvest) # htmlをテキストデータのみに整形するために使う
library(wordcloud) # wordcloudを作るために使う
library(readr) #データの取り込みによく使っている
# noteから抽出した記事を変数に代入してチェック
x <- read_csv("data/note_2018_100_tr.txt")
x %>% head()
いちおうデータは公開できず、再現性がなくてすみません。中身は2018年によく読まれたnoteの無料記事を100記事ほどベタで貼ったテキストデータです。
データをキレイにする
DBから直接データを拾っているので、タグなどが入っています。後々に邪魔になるので、正規表現で判別して除外(空白に置換)します。
# htmlタグの除外
x2 <- gsub("<(\"[^\"]*\"|'[^']*'|[^'\">])*>","",x) # HTMLタグの除外
x3 <- gsub("NA","",x2) # NAとなっている部分を除外
x4 <- gsub("\\s","",x3) # 空白文字を除外
x4 %>% head()
形態素解析をかける
キレイにしたデータをRMeCabにかけて形態素解析をします。形態素解析は日本語を品詞ごとに分別することを指します。記号も含めた語が抽出されるため、品詞は「名詞」と「形容詞」を指定します。
# 形態素解析のために、テキストデータを書き出し+パスを代入
writeLines(x4,"data/note_2018_100_tr.txt")
x5 <- "data/note_2018_100_tr.txt"
# 形態素解析を行う
note <- docDF(x5,type=1)
note %>% head()
# 記号などが含まれているため、単語を絞り、頻度列の名前を変える
note2 <- note %>% select(everything(),FREQ = note_2018_100_tr.txt) %>% filter(POS1 %in% c("名詞","形容詞"),POS2 %in% c("一般","自立"))
note2 %>% arrange(FREQ) %>% tail(100)
# 頻度が高すぎる一般的な単語を抜いてみる
note3 <- note2 %>% filter(TERM != "自分") %>% filter(TERM != "いい") %>% filter(TERM != "ない")
note3 %>% arrange(FREQ) %>% tail(100)
ワードクラウドを作る
必要な単語が準備できたので、ワードクラウドを作る準備をします。
なお、wordcloud関数はquartzFontsを参照しており、デフォルトでは日本語には対応していません。すごくエラーを吐かれました。オエッ。そのため、日本語のフォントを加えてます。今回こちらの記事を参考にさせていただき、ヒラギノを入れてみました。
# ワードクラウドを作る準備
# quartzFontsに日本語を加える
quartzFonts(hiragino = c("HiraginoSans-W0", "HiraginoSans-W5", "HiraginoSans-W0", "HiraginoSans-W5"))
wordcloud(note3$TERM ,note3$FREQ ,min.freq =30,scale = c(2,1),random.order=FALSE,family ="hiragino")
結果です。
うわあ見づらい…
色を入れてあげる
Rにはデフォルトのカラーパレットがあり、例えばcolor=rainbow(7)などで指定してあげると虹色の中からグラフに色をつけてくれます。なるべくnoteの色に近づけたく、カラーパレットを見ながら指定してみることにしました。
# 色を加える
display.brewer.all()
pal <- brewer.pal(9, "Greens")
pal <- pal[-(1:5)]
# 色付きワードクラウドを出す
wordcloud(note3$TERM ,note3$FREQ ,min.freq =30,scale = c(2,1),random.order=FALSE, colors=pal,family ="hiragino")
display.brewer.all()を叩くとカラーセット一覧が吐き出されます。ここからGreensを選択し、視認性の悪いうすすぎる色を消しました。
ワードクラウドの完成
note色にしたかったのですが、ちょっと濃い緑…
ワードクラウドを見て今年の振り返り
すべての記事を読み込ませたわけではないですが、今年を振り返るには良い図になったかなと思います。このワードクラウドを見ながらnoteチームで今年一年を振り返りながら、酒を飲みたい気分。。
ガンということばがありますが、これは幡野広志さんの記事ですね。
あえて詳しくは書きませんが、今年はじめにワタナベアニさんの記事で初めて幡野さんのことを知りました。そして幡野さん自身もその後noteをはじめてくださって、その後銀座の写真展にもお邪魔しました。
とても素敵な方です。まだご存じない方はぜひ記事をご覧ください。
最後に
改めてR、むちゃむちゃ楽しいです。現在noteではデータ分析にかなり力を入れていますが、僕も一端として頑張りたく、もっと勉強してみます。いまは、Shinyにとても興味があり、年末年始にかけて勉強して、また一つそれにまつわる記事を書きたいとおもっています。
それではR Advent Calendar 2018 のバトンをhanaoriさんにわたします。
enjoy!!