wordcloud2とは? "うっせぇわ"を描画するとは?
それが何か見せつけてやるゥ!
(Rでwordcloud2を用いて「うっせぇわ」を描画するまでの過程の紹介とwordcloud2のオプションをいじって遊ぶ記事です)
目次
- テキストの形態素解析
- 前処理
- wordcloud2で描画
- オプションで遊んでそれっぽくしてみる
- 終わりに - wordcloudとの付き合い方
1. テキストの形態素解析
まずAdoさん「うっせぇわ」の歌詞のテキストデータを準備し、それを形態素解析にかけて分かち書きを行います。Rで日本語の形態素解析ができるエンジンはMeCabやQuantedaに付属のもの(ICU/ユニコードによる標準ライブラリ)がありますが、今回はspaCyを用いてみます。
library(spacyr)
spacy_initialize(model = "ja_core_news_md")
歌詞テキストデータの読み込み1
library(readtext)
txt <- readtext("usseewa.txt")
いざ形態素解析
txt_conv <- spacy_parse(txt, lemma = FALSE)
結果こんな感じ、無事形態素ごとに分割できてます
>txt_conv[1:8 , 4:5]
token pos
1 正し ADJ
2 さ PART
3 と ADP
4 は ADP
5 愚か ADJ
6 さ NOUN
7 と ADP
8 は ADP
2. 前処理
**しかしここで問題が。**先ほどの形態素解析の結果を見ると、
>txt_conv[113:121 , 4:5]
token pos
113 うっせ VERB
114 ぇ SYM
115 うっ VERB
116 せ AUX
117 ぇ SYM
118 うっ VERB
119 せ AUX
120 ぇ SYM
121 わ PART
歌詞一番のパンチワードである**「うっせぇわ」が解体されている!**これは避けたい。ということで「うっせぇ」と「うっせぇわ」は一語として認識してもらいます。2
for(i in 1:length(txt_conv$token)){
if((txt_conv[i,4] == "うっ")&(txt_conv[i+1,4] == "せ")&(txt_conv[i+2,4] == "ぇ")&(txt_conv[i+3,4] == "わ")){
txt_conv[i,4] <- "うっせぇわ"
}else if((txt_conv[i,4] == "うっ")&(txt_conv[i+1,4] == "せ")&(txt_conv[i+2,4] == "ぇ")){
txt_conv[i,4] <- "うっせぇ"
}else if((txt_conv[i,4] == "うっせ")&(txt_conv[i+1,4] == "ぇ")&(txt_conv[i+2,4] == "わ")){
txt_conv[i,4] <- "うっせぇわ"
}else if((txt_conv[i,4] == "うっせ")&(txt_conv[i+1,4] == "ぇ")){
txt_conv[i,4] <- "うっせぇ"
}
}
これを通すとこんな感じ
>txt_conv[113:121 , 4:5]
token pos
113 うっせぇ VERB
114 ぇ SYM
115 うっせぇ VERB
116 せ AUX
117 ぇ SYM
118 うっせぇわ VERB
119 せ AUX
120 ぇ SYM
121 わ PART
「うっせぇ うっせぇ うっせぇわ」を無理やりつくることができました。ここから意味を持ちそうな品詞(ここでは"ADJ","NOUN","VERB","PRON","INTJ")以外は削除して分析します。(ですので上の結果で「うっせぇ」の「せ」「ぇ」などが重複してるのはここで削除されるので問題ないです。)
library(dplyr)
txt_conv_nv <- filter(txt_conv, pos == "ADJ"|pos == "NOUN"|pos == "VERB"|pos == "PRON"|pos == "INTJ")
出来上がったものをquantedaのdfm()
に渡していきます。ここでこれ以上の分解をされないためにwhat="sentence"
を指定します。(本来は一文ずつ分解するためのオプション)
library(quanteda)
dfm_usseewa <- dfm(txt_conv_nv$token, what = "sentence")
3. wordcloud2で描画
準備ができたのでwordcloud2で描画を行います。
library(wordcloud2)
f <- colSums(dfm_usseewa)
wordcloud2(data.frame(names(f), f))
「うっせぇ(わ)」が目にうっせぇわ!(これが言いたい)
ともかくできました。wordcloud2はデフォルトのまま実行してもある程度魅力的なものが描けます。いい感じ。
4. オプションで遊んでそれっぽくしてみる
公式サイトにわかりやすくオプションの効果と指定方法が書かれているのでいくつかやってみます。(これは今度別に記事を詳しく書きたい)
MVの雰囲気に合わせてワードクラウドを作ってみます。
wordcloud2(data.frame(names(f), f), backgroundColor = "black", #背景は黒
color=rep_len( c("azure","plum", "blueviolet", "red"), nrow(demoFreq) ), #MVイメージカラーを適当に
maxRotation = -2, minRotation = 2) #回転でカオスな感じを出したい
するとこんな感じ
語数がそもそも多くない上に「うっせぇ(わ)」と他の語の頻度に著しい差があるのでうまく機能しないオプションもありますが、なんというか…それっぽい!すごくそれっぽいわ!
5. 終わりに - wordcloudとの付き合い方
ここまで「うっせぇわ」を題材にwordcloud2で遊んでみたわけですが、筆者個人としてはワードクラウドという表現方法は分析に用いるより、アーティスティックに魅力的な見た目のデザインに昇華していくほうがいいんじゃないかと思います。
実際、Hearstら(2020)が行った実験3によれば、このような一般的なワードクラウドのデザインで配置された単語群から意味のあるトピックを考えるのは時間がかかるそうで、意味ごとにまとめられたワードクラウドを活用することも提案されています。なので、テキストを分析するにあたりワードクラウドを描画することは分析者(あるいは読者)がその文書全体を理解するのに役立つとはちょっといいがたいわけです。
なので今回、形態素解析で分割された「うっせぇ(わ)」をあえて一つの形態素として扱ったことも、一つの魅力的なデザインを作るという観点からすれば許されるべきではないかと思うのです(もちろん分析の種類によっては絶対にタブーです)。よって今後も面白そうなテーマがあればそれっぽいデザインを作るツールとしてワードクラウドを使っていこうかと思います。
お読みいただきありがとうございました。記事に誤りがございましたらご指摘いただければ幸いです。
-
現在日本の著作権法では歌詞をブログ等で公開することはJASRACから認可を得たサイト以外は禁止されているが、今回のような分析に用いることは本来のそのままの表現を用いなければ可能とされている(参考)。しかしながら昨今の歌詞ブログはコピペができないようになっており、さっと収集するのは苦労する。 ↩
-
spacyrの中にそのような指定するオプションがあるのかわからなかったので無理やり解決してしまいました。特定のワードを分かち書きせずに保存しておくオプションなどご存じの方は教えていただきたいです。 ↩
-
Hearst MA, Pedersen E, Patil L, Lee E, Laskowski P, Franconeri S. An Evaluation of Semantically Grouped Word Cloud Designs. IEEE Trans Vis Comput Graph. 2020 Sep;26(9):2748-2761. (url: https://pubmed.ncbi.nlm.nih.gov/30872231/ ) ↩