Tumble Grief #7

雑記です。イラストなどが掲載してあるページはこちら→http://shichichaos.tumblr.com/

R+Word2Vecでアーバンギャルドな歌詞分析

はじめに

こんにちは、shichiです。

今回はR言語で最近流行りのWord2Vecを用いて自然言語処理をしてみたいと思います。 題材としては私が大好きなセンシティヴで非常にアグレッシヴかつキュート&クールなアーティストであらせられる、アーバンギャルドの歌詞(71曲分)を解析していきたいと思います。

公式サイトは↓です。皆さん聴いてくださいね!

アーバンギャルド-URBANGARDE

R + Word2Vec

話したいことの80%はアーティストの布教をした段階で終了しましたが、R+Word2Vecについてお話したいと思います。

Word2Vecとは、単語をベクトルとして表現することができる素晴らしいものです。これができると何が嬉しいかというと、「お爺さん」-「男」+「女」=「お婆さん」のような計算ができるようになるのです。また単語間の距離などを計算することもでき、類似した意味をもつ語句等を抽出することもできるかもしれないのです!

さっそくRで使ってみる

まず最初に関連ライブラリを読み込みます。

インストールしていない方はインストールして下さい。特にmecabは面倒なのでggりながらがんばってください。

↓ありがたい解説をしてくださっている方がいます。

qiita.com

library(RMeCab)
library(tidyverse)
library(wordVectors)
library(tsne)
library(rvest)

↓歌詞の入ったテキストファイルを形態素解析し、モデルにぶち込んでくれる関数です。

w2v_urbangarde <- function(w2v_txt){
  w2v_txt %>% 
    RMeCabText() %>% 
    map(function(x) 
    ifelse((x[[2]] %in% c("名詞", "形容詞", "動詞")) && 
             (!x[[3]] %in% c("数", "非自立", "代名詞","接尾")) && 
             (x[[8]] != "*"), 
           x[[8]], "")
    ) %>% 
    paste(" ", collapse = "") %>% 
    as.character() %>%
    write(file = "urban.bin", append = TRUE)
  
  model <- "urban.bin" %>% 
 train_word2vec(
     vectors = 200, 
     window = 12,
     threads = 3
    )
  return(model)
}

↓歌詞を取ってきてくれる関数です。がんばって手打ちしようかと思いましたが諦めました。

愛情が足りないのかもしれません。改心します。

get_lyrics <- function(urban_urls_path){
  urban_lyric_urls <- urban_urls_path %>% 
    read_html() %>% 
    html_nodes("a") %>% 
    html_attr("href") %>% 
    paste0("http://j-lyric.net", .) %>% 
    .[grep("artist",.)] %>% 
    .[2:length(.)]
  for(i in 1:length(urban_lyric_urls)){
    lyrics <- read_html(urban_lyric_urls[i]) %>% 
      html_nodes(xpath = '//*[@id="Lyric"]') %>% 
      html_text()
    urban_lyrics <- paste0(urban_lyrics, "" ,lyrics)
    print(lyrics)
    Sys.sleep(1)
  }
  return(urban_lyrics)
}

↓main

w2v_txt <- get_lyrics(urban_urls_path)
write.table(w2v_txt,"urbangarde.txt",col.names = F,row.names = F)
model <- w2v_urbangarde("urbangarde.txt")
model %>% plot()

結果

下図がR+word2vecでアーバンギャルドの歌詞(71曲分)を解析し、言語意味空間をプロットしたものです。次元の圧縮はtsneパッケージで行いました。天使と悪魔が同一座標にいたりしてエモいですね。 f:id:pandorina463:20171225002624p:plain

試しに演算をしてみましょう。以下が構築したモデルで少女+恋の計算をした結果となります。

f:id:pandorina463:20171225002543j:plain

少女 + 恋 = 死。 うん。良い。

おわりに

KEKKON SHIKIは4月です。血を這ってでも行きます。

それでは良いお年を。

urbangarde.net

参考記事

R で日本語テキストに word2vec - Qiita