トピックモデルを使ってラブライブの歌を解析する

MikuHatsune2013-05-11

LDAをいじってみたわけだが、これを使ってラブライブ(μ's)の歌を歌詞を解析してトピック分類してみる。
取得した歌詞33曲分を読み込んで、RMeCabで品詞分解する。
その後、LDAができるようにデータ加工する。

library(RMeCab)
wd <- "/lovelive_song/"
musics <- read.delim(paste(wd, "songlist.txt", sep=""), header=FALSE, fileEncoding="utf-8") # 曲名リスト

lyrics <- NULL
for(i in seq(33)){
	tmp <- read.csv(paste(wd, i, ".txt", sep=""), header=FALSE, fileEncoding="utf-8") # エンコーディングにはまって面倒だった
	lyric0 <- paste(unlist(c(tmp)), sep="", collapse="")
	rmc <- unlist(RMeCabC(lyric0))
	lyrics <- c(lyrics, paste(rmc, sep="", collapse=" ")) # 分かち書き
}
library(lda)
corpus <- lexicalize(lyrics)

ラブライブ!スクールアイドルフェスティバルだと、曲の属性はピュアスマイルクールに分かれているので、そんな感じに分かれるかなと期待しつつ、もうひとつくらいなんかクラスターできないかと思って4つに設定する。

K <- 4
result <- lda.collapsed.gibbs.sampler(corpus$documents, K, corpus$vocab, 25, 0.1, 0.1, compute.log.likelihood=TRUE)
top.words <- top.topic.words(result$topics, 5, by.score=TRUE)

topic.proportions <- t(result$document_sums) / colSums(result$document_sums)
topic.proportions[is.na(topic.proportions)] <-  1 / K
colnames(topic.proportions) <- apply(top.words, 2, paste, collapse="\n")
cols <- c(rainbow(11), rich.colors(11), topo.colors(11))
layout(t(c(rep(1, 3), 2)))
par(mar=c(5, 8, 2, 2))
barplot(topic.proportions, col=cols, beside=TRUE, horiz=TRUE, las=1, xlab="proportion", cex.names=2)
par(mar=c(5, 1, 2, 5))
plot(1, type="n", axes=FALSE, xlab="", ylab="")
legend("left", legend=musics[,1], bty="n", col=cols, pch=15, cex=1.8)

いやいやちょっと待て…((, ), ..., な, ー)はおかしいだろこれは…

 
他にも、! や ? が紛れ込むので、名詞・動詞・形容詞しか対象としないことにし、RMeCabCを実行した時、( や ) は名詞に含まれることからこれらも外すことにした。

lyrics <- NULL
word.part <- c("名詞", "動詞", "形容詞")
rm.word <- c("!", "?", "(", ")")
for(i in seq(33)){
	tmp <- read.csv(paste(wd, i, ".txt", sep=""), header=FALSE, fileEncoding="utf-8")
	lyric0 <- paste(unlist(c(tmp)), sep="", collapse="")
	rmc <- unlist(RMeCabC(lyric0, mypref=1))
	rmc <- rmc[mapply(function(x) x %in% word.part, names(rmc))]
	rmc <- rmc[mapply(function(x) !x %in% rm.word, rmc)]
	lyrics <- c(lyrics, paste(rmc, sep="", collapse=" ")) # 分かち書き
}
corpus <- lexicalize(lyrics)

set.seed(59)
K <- 4
result <- lda.collapsed.gibbs.sampler(corpus$documents, K, corpus$vocab, 25, 0.1, 0.1, compute.log.likelihood=TRUE)
top.words <- top.topic.words(result$topics, 5, by.score=TRUE)

topic.proportions <- t(result$document_sums) / colSums(result$document_sums)
topic.proportions[is.na(topic.proportions)] <-  1 / K
colnames(topic.proportions) <- apply(top.words, 2, paste, collapse="\n")
cols <- c(rainbow(11), rich.colors(11), topo.colors(11))
layout(t(c(rep(1, 3), 2)))
par(mar=c(5, 8, 2, 2))
barplot(topic.proportions, col=cols, beside=TRUE, horiz=TRUE, las=1, xlab="proportion", cex.names=2)
par(mar=c(5, 1, 2, 5))
plot(1, type="n", axes=FALSE, xlab="", ylab="")
legend("left", legend=musics[,1], bty="n", col=cols, pch=15, cex=1.8)

すると、みんな勇気だそうぜ的な歌(Wonderful Rush, 純愛レンズ)、心配ないさ的な歌(Darling!!, Oh, Love&Peace!)、恋してhappyな歌(恋のシグナルRin rin rin!, sweet&sweet holiday)、私とあなたで熱い歌になるっぽい。
じゃあスクフェスの歌分類とどうなの?と聞かれると…どうなんだろう。