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)、私とあなたで熱い歌になるっぽい。
じゃあスクフェスの歌分類とどうなの?と聞かれると…どうなんだろう。