ごゆるり日和

元気でヤンチャな子を推してるDSの備忘録など

Rの依存パッケージを一括で取得したい

初めに

この記事はRのアドベントカレンダーの17日目となります.

qiita.com

追記

自分の調査不足で記事が存在しておりました!!!

kyyonko.hatenablog.com 使いやすいし,ダウンロードまでしてくれるのでこちらを参考にしてください.

4月のお話(注意:事実とは異なる部分が含まれてます)

???「入社おめでとうございます.弊社はセキュリティーが厳しいので外部ネットワークに接続されてません.ですので,PythonやRのパッケージは申請してOKが出たらローカルの環境に入れることができます.」

私(...?!学生の頃より厳しい...?!)

起きたこと

私「glmnet 動かしたいからお伺いをたてるぞ」 私「その前に,一応document読んどくか」 私「ふむふむ,これ,glmnet以外にいくつかパッケージ必要じゃね?」 私「しかも,そのパッケージにまた必要なパッケージあるやん」 私「まあ,そんなに個数ないから目で調べてやるか」 私「あれ?調べて,お伺いをたてたら一日たったぞ???」 次の日 ???「ローカルにパッケージ入れていいよー」 私「これで動かせるぜ」 コンソール「install.package」 私「いい感じに動いたな」

翌月...

私「よーし,Rstan動かしたいからまたお伺いたてるぞ」 私「今回は前回より多いな」 私「まーいけるやろ」 私「また依存関係調べてたら一日が過ぎてしまった.」 次の日 ???「ローカルにパッケージ入れていいよー」 私「これで動かせるぜ」 コンソール「install.package」 R「足りないから動かないよ」 私「...うそん」

(注意:事実とは異なる部分が含まれてます)

やったこと

このような悲劇を二度と起こさないためにも, 一つのパッケージが依存しているパッケージを見つけ出したい!!

Rの関数に依存パッケージを表示してくれる関数tools::package_dependencies()があります. 今回はtidyverseを例にします.

> tools::package_dependencies("tidyverse")
$tidyverse
 [1] "broom"         "cli"           "crayon"        "dbplyr"       
 [5] "dplyr"         "dtplyr"        "forcats"       "googledrive"  
 [9] "googlesheets4" "ggplot2"       "haven"         "hms"          
[13] "httr"          "jsonlite"      "lubridate"     "magrittr"     
[17] "modelr"        "pillar"        "purrr"         "readr"        
[21] "readxl"        "reprex"        "rlang"         "rstudioapi"   
[25] "rvest"         "stringr"       "tibble"        "tidyr"        
[29] "xml2"      

これらがtidyverseをインポートするときに必要となるパッケージとなります. さらに,これらが依存するパッケージを知りたいので次のような処理を行います.

> dependent_package <- tools::package_dependencies("tidyverse")[[1]]
> i <- 0
> while( i <= length(dependent_package) ){
  i = i + 1
  pack <- dependent_package[i]
  dependent_package <- unique(c(dependent_package, 
                         tools::package_dependencies(pack)[[1]]))
}
> 
> dependent_package
  [1] "broom"         "cli"           "crayon"        "dbplyr"       
  [5] "dplyr"         "dtplyr"        "forcats"       "googledrive"  
  [9] "googlesheets4" "ggplot2"       "haven"         "hms"          
 [13] "httr"          "jsonlite"      "lubridate"     "magrittr"     
 [17] "modelr"        "pillar"        "purrr"         "readr"        
 [21] "readxl"        "reprex"        "rlang"         "rstudioapi"   
 [25] "rvest"         "stringr"       "tibble"        "tidyr"        
 [29] "xml2"          "backports"     "ellipsis"      "generics"     
 [33] "glue"          "methods"       "utils"         "grDevices"    
 [37] "assertthat"    "blob"          "DBI"           "lifecycle"    
 [41] "R6"            "tidyselect"    "vctrs"         "withr"        
 [45] "data.table"    "gargle"        "uuid"          "cellranger"   
 [49] "curl"          "ids"           "rematch2"      "digest"       
 [53] "grid"          "gtable"        "isoband"       "MASS"         
 [57] "mgcv"          "scales"        "stats"         "cpp11"        
 [61] "pkgconfig"     "mime"          "openssl"       "fansi"        
 [65] "utf8"          "clipr"         "vroom"         "tzdb"         
 [69] "Rcpp"          "progress"      "callr"         "fs"           
 [73] "knitr"         "rmarkdown"     "selectr"       "stringi"      
 [77] "tools"         "graphics"      "rappdirs"      "rematch"      
 [81] "nlme"          "Matrix"        "splines"       "farver"       
 [85] "labeling"      "munsell"       "RColorBrewer"  "viridisLite"  
 [89] "askpass"       "bit64"         "prettyunits"   "processx"     
 [93] "evaluate"      "highr"         "yaml"          "xfun"         
 [97] "htmltools"     "tinytex"       "jquerylib"     "lattice"      
[101] "colorspace"    "sys"           "bit"           "ps"           
[105] "base64enc"     "fastmap"      

(注意:ちょっと時間かかります.)

いい感じに依存パッケージを抽出できました! これで,いらない仕事をやらなくて済みます!

まとめ

いつか使う誰かのために...

これ(ベクトル)をこう(マトリックスに)したい

はじめに

これをこうしたい.
こういう変換をなんというかわからない. 時系列データで自己回帰モデルなどのベクトルからマトリックスデータを作成したい. 具体的には下図のようなベクトルから下図のようなマトリックスを作成したい.

ベクトル
これ
マトリックス
こう

愚直な方法

R言語の設定を行う.

y  <- 1:20
nrows <- 8
ncols <- 13

for文を使って愚直にデータを穴埋めする方法はすぐに思いつく.

data <- matrix(0, nrow = nrows, ncol =ncols)
for(i in 1:nrows){
  data[i,] <- y[(1:ncols)+(i-1)]
}

これで一応は目的のマトリックスは得られるが, かっこよくない
for文を使っているのが原因だろうか...

apply系を使用

Rの代表的(?)な関数にapplyがある. 詳しくは Rプログラム (TAKENAKA's Web Page) を参照されたい. やりたい処理が図で示されているので, apply系の中でどれを使えばいいか一目でわかる.

今回はsapplyを用いて目的のマトリックスを作成する.

data <- sapply(1:ncols, function(l) matrix( y[1:nrows+(l-1) ] ))

これで目的のマトリックスを作成できる. for文が無いだけでかっこよくかけてますね(?).

比較してみる

実行時間に違いがあるのか簡単にテストしてみます. テスト方法としては2000回実行したときの実行時間を比較します.

start_time <- Sys.time()
for(k in 1:2000){
 # 処理
}
end_time <- Sys.time()
end_time-start_time

結果

手法 計測時間
apply 0.285207 secs
for文 0.04589605 secs

おかしいな...

for文の方が速いぞ?

for文が遅いってのは昔の話なのか...

まとめ

簡単な処理すぎてfor文の方が早くなったのかな? for文の方が可読性も高いのは気のせいだろうか?

ツッコミどころ満載なことを書いてしまったので,誰か修正をよろしくお願いします(他力本願).

特に,目的のマトリックスの名前ベクトルからマトリックスへの変換の名前を教えていただけると 嬉しくて夜も眠れます.

lubridateで1か月後を計算するには?

近況

めでたく大学院を修了しました. 現在,就職先でもRを使えるというありがたい環境で働かせていただいてます. 扱ってるデータに日付が含まれているのですが,その際にlubridateを重宝しています.

詳しいことはいろんな文献に載っているので本記事では業務中に役立ったことを備忘録として残します.

翌月の参照

まずは,ともあれlibraryの読み込みですね.

library(lubridate)
date <- lubridate::today()
#"2021-05-10"

ここで date + 1とすると翌日になります.

date + 1 
#"2021-05-11"

翌月にするためには次のようにします.

date + months(1) 
#"2021-06-10"

これがわからなかった...

months()のほかにもyears(), weeks()などがあり,これらをまとめてperiodと呼ばれています.

months(1) 
#"1m 0d 0H 0M 0S"
period(12,"month")
#"12m 0d 0H 0M 0S"
years(3)
#"3y 0m 0d 0H 0M 0S"
period(12,"year")
#12y 0m 0d 0H 0M 0S"
weeks(12)
#"84d 0H 0M 0S"

もっとはやく知りたかったですね.

やりたくなるよね閏年

こうなったらやりたくなるのは閏年の処理ですね.

leap_year <- ymd(20200229)
#"2020-02-29"
leap_year + years(1)
#NA
leap_year + years(2)
#NA
leap_year + years(3)
#NA
leap_year + years(4)
#"2024-02-29"

ちゃんとしてますね(某Dr.STONEの氷月)

話はちょっと飛びまして閏年にはルールがあります. みなさんがご存じの通り西暦を4で割り切れるときには閏年になります. しかし,4で割り切れかつ,100で割り切れかつ,400で割り切れないときは閏年にはなりません. 難しいですね. 下記に閏年の決定フローをはっつけときます.

f:id:Kodachan:20210510221041j:plain
閏年フロー

では,どうなっているでしょうか...

leap_test <- ymd(21000228)
#"2100-02-28"
leap_test + days(1)
#"2100-03-01"

見事"2100-02-29"は飛ばされましたね👏

まとめ

いかがでしたか?(これで締めてみたかった) みなさんもよいtidyverseでR lifeを🍀

何気に初めてのRの記事でした.

WordPressのプラグイン”Really Simple CSV Importer” でエラーが起きた

WordPressにReally Simple CSV Importerというプラグインがあります. このプラグインCSVファイルをインポートすることでWordPerssの記事を簡単に投稿できます. すごい時代ですね. 詳しい使い方は次の記事を参考にしてください.

notnil-creative.com

takumisenka.com

こんなに便利なプラグインですが,使っていると次のようなエラーが出てしまいました.

データベースに投稿を追加できませんでした。
WP_Postオブジェクトがセットされていません。

これは文字コードが原因です.

MacExcelはデフォルトがShift-JISになっており,それに気づかないままCSVの編集作業をすると保存形式もShift-JISになってしまいます.

人類は早くUTF-8以外の文字コードを捨てるべきですね(過激派).

まあ,日常生活を送ってる上でShift-JISかUTF-8かなんて気にしないんでどうでもいいけど,こういう時に足を引っ張ってくるので人類はry

では,どうやってShift-JISかUTF-8かを見抜くかですが,Terminalで次のコマンドを実行することで確認することができます.

nkf --guess {ファイルのパス}

これでUTF-8と出てきたら文字コードには問題ありません.素直にCSVファイルをインポートしてください.(問題が起きないとは言ってない)

一方,Shift-JISと出てきたら,次のコマンド実行することで変更することができます.

nkf --s --overwrite {ファイルのパス}

このコマンドを実行後もう一度"nkf --guess {ファイルのパス}"を実行するとUTF-8とできます.これでCSVをインポートすることができます.(問題がry)

細かい内容ですがつまりにつまりまくったので書き起こして見ました.

誰かのお役に立てれば幸いです.

擬似聖地巡礼~君は放課後インソムニア~

君は放課後インソムニア

君は放課後インソムニアという漫画をご存知ですか?

www.shogakukan.co.jp

あの秘密結社ホクソエムさんもツイートしていたこの画像の元の漫画です.

お話の内容は

不眠で悩む男子高校生・中見丸太は同じ悩みを抱える曲伊咲と出会い放課後に学校の今は物置になっている天文台で束の間の眠りと,秘密を共有するよう不思議な関係が始まるー

漫画1巻裏より引用

で,私の感想は,こんな青春送りたかったと思わせてくれる素晴らしい作品です.

この作品中に登場する高校は実際に存在する学校です. 高校名は七尾高校で,実はこの七尾高校が私の母校なのです!(Youtuberの某むらいさんの母校でもあります.)

本編で, 主人公たちが通っている高校の名前は九曜高校となっています.これは七曜と九尾を入れ替えてできたのではないのかなと勝手に想像しています. また,主人公の周りの学生や先生たちは実際に石川県の地名が使われてます.(穴水,羽咋,野々(市)など)

擬似聖地巡礼

ではここからは擬似聖地巡礼としまして2010年前半に撮った写真をみてみましょう!

(角度とか細かいことは気にしないでね >< )

(なお,著作権なにもわからないマンなので原作のスクショや写真はありません.ココロの目で補うなり,実際に原作を買って補うなりしてください.)

(また,肖像権についてもなにもわからないマンなので人が写っていない写真を選んでます.ですので枚数は少なめです.)

f:id:Kodachan:20200823214644j:plainf:id:Kodachan:20200823214850j:plainf:id:Kodachan:20200823214917j:plainf:id:Kodachan:20200823214923j:plain
学校正面からの写真.天体観測室があるのが分かりますね

f:id:Kodachan:20200823214819j:plain
ちょっと遠目から撮った学校全体の写真.

f:id:Kodachan:20200823214747j:plain
学校内部の天体観測室の案内板.実際に入ったことはない.

f:id:Kodachan:20200823214948j:plain
中庭みたいなところ.漫画1巻14ページの”朝がきて絶望する”というコマのシーン参照

次のリンクで見ることができます. 「君は放課後インソムニア 1」|ビッグ コミックス|小学館

f:id:Kodachan:20200823214859j:plain
食祭市場.3巻で出てきます.

f:id:Kodachan:20200823214936j:plain
体育館.漫画4巻20ページの終業式に出てきます.

これから出てきて欲しいシーン

ここからは私が写真を撮った中でこれから漫画に出てきて欲しいシーンの写真を載せます.

f:id:Kodachan:20200823215000j:plain
中庭的なところの屋根.

f:id:Kodachan:20200823215011j:plain
七尾美術館にあるオブジェ.

f:id:Kodachan:20200823214839j:plain
学校の敷地内にある鐘.

f:id:Kodachan:20200823214730j:plain
廊下にある時計.

七尾高校卒業した人の感想.

とにかく学校がしっかり描かれているのが驚きました.絵を見たときに「あー,そういう構図で校舎を書くのか〜,憎いね」と何度も思わされました笑.本当に忠実に描かれているので丁寧に取材を行ったのだとオジロマコト先生には感服します.また,学校の行事もそれなりに再現されており,2巻のエプロンを作成する授業などは1年生の家庭科の授業で実際に作りました.

最後に

では,最後に言いたいことをば 屋上は入れません!プールはありません!!臨海学校もありません!!!

これからのお話の展開も楽しみですね

追伸 コロナ禍ではありますが現在このようなイベントが開催されているようです. www.nanao-lv.com

Mac OS を初期状態から自分仕様にする

追記

brew cask install がbrew install --caskになったことにより,コードを書き直しました.

きっかけ

突然ですが,Mac の環境ってぶっ壊しがちですよね?

Mac の環境をぶっ壊してクリーンインストールすると,Mac の設定を初めからいちいち設定しないといけないのは面倒くさいですよね? 私も毎回ググったりほかのMac の設定を参考にしたりと煩わしいことが多いです. そんな煩わしさから解放されるためにこの記事を見るだけでMac を自分仕様にできることを目指して書いていきます.

注意

この記事は私が私のために書く記事ですので他の人には参考にならない点も多々あるとは思います.また,ところどころ説明を飛ばしてしまうかもしれません.ご了承ください.

前提として

初めに前提としてMac の初期設定はおこなっているものとします.つまり,ユーザー名やらWi-Fiやらの設定を終わらせてデスクトップが表示されていることを前提とします. また,今回はmacOS Catalina Ver.10.15.1 のラップトップで設定を行っていきます.

f:id:Kodachan:20191212050915p:plain
初期状態

設定はっじめるよー

ここからが設定の開始です.これから大まかに分けて3つの設定を行って行きます.1つ目はシステム環境設定系,2つ目はインストール系,3つ目はそれぞれのアプリの設定などです.

システム環境設定系

自分で設定を変更した部分だけを記載します.つまり,書かれていないところはそのまま初期設定ということを意味しています.

f:id:Kodachan:20191212051007p:plain
システム環境設定

デスクトップとスクリーンセーバー
  • ピクチャを変更で5分ごとにする
  • ランダムな順序にチェックを入れる
  • スクリーンセーバをクラシックにする
  • スクリーンセーバのソースを風景にする
  • スライドの順序をシャッフルにする
Dock
  • 拡大にチェックを入れて以下くらいに調整する
    f:id:Kodachan:20191212051120p:plain
    このくらいにする
  • 起動中のアプリのチェックを外す
  • Dockを自動的に表示/非表示にチェックを入れる
  • 最近使ったアプリのチェックを外す
Mission Control
  • ホットコーナーの右下にMission Control を割り当てる
  • ホットコーナーの左下にディスプレイをスリープを割り当てる
Siri
  • 無効にする
言語と地域
  • 時刻の書式を24時間表示にする
インターネットアカウント
  • Google のアカウントを設定する
セキュリティとプライバシー
サウンド
  • メニューバーに音量を表示にチェックする
  • 消音にする
キーボード
  • キーのリピートを速いにする
  • リピート入力認識までの時間を短いから一個長くする
    f:id:Kodachan:20191212051222p:plain
    謎のこだわり
  • 修飾キーでCaps Lock をCommand に変える
  • 入力ソースで句読点の種類を「.」と「,」にする
  • 入力ソースで"¥"をバックスラッシュにする
  • 入力ソースで数字を全角入力からチェックを外す
トラックパッド
  • 調べる&データ検出のチェックを外す
  • 副ボタンのクリックを右下隅に変更する
  • タップでクリックにチェックを入れる
  • 軌跡の速さを速いにする
    f:id:Kodachan:20191212051502p:plain
    画面の解像度が高いときは速いにすると良い
  • アプリケーションExpose にチェックを入れる
  • デスクトップを表示のチェックを外す
ディスプレイ
  • スペースを拡大する
省エネルギー
  • バッテリー状態のスリープ時間を15分程度にする
  • 電源アダプタをつけたときのスリープ時間を長くする
  • 可能な場合はハードディスクをスリープさせるのチェックを外す
日時と時刻
  • 時計で日付を表示にチェックを入れる

インストール系

ここからは自分がいつも入れてるアプリをインストールの方法とともに紹介します.

brew

まずはHomebrew (以下brew) をインストールします.brew とはMac のパッケージマネージャーで,パッケージをインストールしたりアンインストールしたり出来るシステムのことです.くわしくはこちらを参照してください.それでは,brewのインストール手順について

  1. ターミナルを開く
  2. brew をインストールする前にXcodeをインストールします
     xcode-select --install 
  3. 次のコマンドを打ち込んで実行する
      /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    これでbrew のインストールは完了です. ここからはbrew install hogebrew install --cask hoge をパッケージをインストールしていきます.
R と RStudio

とりあえず,brew で一番最初にインストールするものといえばRとRStudioですね(偏見).これが入ってないとMac はただの下敷きですね(過激).ということでR とRStudio をインストールしていきます.

  1. ターミナルを開いて次のコマンドを実行してRをインストールする.
    brew install r 
  2. RStudioをインストールするために次のコマンドを実行する.
    brew install --cask  rstudio 
    なにもミスがなければLaunchoadにRstudioが追加されており,Rstudioを実行することができます.
python

R を入れたついでにpython も入れておきましょう.

brew install python3

Google Chrome

brewGoogle Chrome をインストールするには次のコマンドを実行します.

brew install --cask google-chrome 
これでSafari ともお別れすることができますね!

Evernote

言わずとしれたメモ帳的なアプリですね.

brew install --cask evernote 

slack

こちらも言わずとしれてチャットツールですね.

brew install --cask slack

skim

pdfのビューワーアプリです.Adobe Acrobat よりも軽量で使い勝手もよいです.

brew install --cask skim

shiftit

Mac のウィンドウを分割したりするときに便利なアプリです.

brew install --cask shiftit

iterm2

Mac のターミナルアプリです.デフォルトのターミナルよりも細かい設定ができます.

brew install --cask iterm2
2020年4月14日 コードのミスを修正しました

visual-studio-code

テキストエディターですね.

brew install --cask visual-studio-code
2020年1月6日 コードのミスを修正しました

sublime-text

こちらもテキストエディターですね.

brew install --cask sublime-text

vlc

こちらは有名なメディアプレイヤですね

brew install --cask vlc

これでインストール関係は終わりです.次はインストールしたものを設定していきます.

アプリの設定

先程インストールしたものを自分仕様に変更していきます.アプリを立ち上げたり,立ち上げてログインするだけのものは省きます.

Google Chrome

Google Chrome を初めて立ち上げたときにGoogle Chromeを既定のブラウザにするかどうか聞かれます.その際に,既定のブラウザに設定するにチェックを入れます.

f:id:Kodachan:20191212051334p:plain
障害レポートはどちらでも
その後,Chrome が立ち上がったらGoogle アカウントでログインします.

shiftit

立ち上げるとアクセシビリティサービスの許可が必要だという旨のメッセージが出てくるので指示にしたがってチェックを入れます.

f:id:Kodachan:20191212051430p:plain
この図の通りに設定してください

立ち上がったら環境設定を開きショートカットキーの割り当てを変更します. 変更後は図のようになります.

f:id:Kodachan:20191212051622p:plain
変更したキーバインド

iterm2

文字の色やら背景の色,ハイライトの色などなど細かくすべてを設定できますが,また別の機会に書きたいと思います.

Dockの設定

いらないものは消して必要なものはDock に追加します.ここはいつもお気持ちでやります.

まとめ

まだまだ設定することありそうな気がするが,とりあえずここまでやれば自分のいつもの環境にすることができます.(学校とかだとproxyの設定などがありより一層めんどくさいけど,今回は無くて楽) 誰かの参考になれば幸いです.(とりあえず,未来の自分の参考にはなる)

Word2Vecを使ってBUMP OF CHICKENの歌詞を分析してみた

 

きっかけ

2019年11月3日,東京ドームにて BUMP OF CHICKEN(以下BUMPと表記) のライブに参戦してきました.

 

f:id:Kodachan:20191208025424j:plain

ライブ後に写真OK時間があるのは嬉しい

f:id:Kodachan:20191208025610j:plain

ライブ後に写真OK時間があるのは嬉しい

ライブの余韻に浸っているとき,ふとある記事のことを思い出しました.この記事を見たとき「めっちゃ簡単に自然言語処理できるやん」と衝撃が走り,「BUMPの歌詞でも簡単にコーパスを作れるだろ」という何とも安直な理由で分析を始めました.

 

注意

自然言語処理についてほぼ何も知らない状態で分析を行ったので所々間違っている可能性があります.また,数式的な話は一切しません(できません).理論的な話を知りたい方はツヨツヨな先人がたくさんいらっしゃるのでそちらの方々の記事,資料を参考にしてください.

また,普段Rを使用しているのでpythonのコードも間違いがあるかも知れません.ご了承ください. 

準備

データ収集

分析するためにはデータが必要ですね.ということでBUMPの歌詞データを準備します.ここでは明示的なやり方は割愛させていただきますが,下のQiitaの記事が参考になると思います.ちなみに,私は全て手動で集めました.

qiita.com

データクレンジング

今回,入手できた歌詞データは合計125曲でした.

しかし,このままでは少々問題があるので数曲の歌詞データを取り除き最終的に121曲のデータを使用していきます.以下に問題があると判断してデータから除外したり修正したりした曲名と理由を述べますが,特に重要ではないので読み飛ばしてもらっても構いません.しかし,自分的にはここが一番面白かったりします.

ハイブリッドレインボウ

この曲はthe pillowsがSYNCHRONIZED ROCKERSというアルバムを制作する際にカバーのオファーを出したそうです*1そのため,純粋なBUMP OF CHICKENの曲ではないと判断して除外することにしました.

Ever lasting lie

この曲はオリジナル*2とアコースティックバージョン*3の2つが存在しています.歌詞は全く同じなので一方を除外することにしました.(複数のバージョンが存在する曲は他にもあるが,この曲だけが2つ掲載されているのは謎...)(例:ガラスのブルースはオリジナル*4と28yearsバージョン*5Smileは弾き語り*6とバンドバージョン*7

OpeningとEnding

この2曲はプレゼントという曲の一部*8なので除外しました.

 

voyagerとflyby

この2曲は歌詞がカタカナで表記されているのでひらがなにする処理を施しました.

 

 

実際に動かしてみた

pythonのコードは次のQiitaの記事をほとんどコピペ参考にしました.

qiita.com

 まずはライブラリのインポートです.

import re
from janome.tokenizer import Tokenizer
from gensim.models import word2vec

次にワードを抽出する関数を定義します.

def extract_words(text):
    tokens = t.tokenize(text)
    return [token.base_form for token in tokens
        if token.part_of_speech.split(',')[0] in['名詞','動詞']]

ここでBUMPの歌詞データを読み込みます.

with open("./BUMPLyrics.txt", encoding='utf-8') as file:
    text = file.read()

これで準備は終わりです.では,実際にモデルを作っていきます.

sentences = text.split('。')
t = Tokenizer()
word_list = [extract_words(sentence) for sentence in sentences]

model = word2vec.Word2Vec(word_list, size=100,min_count=5,window=5,iter=100)

はい.これだけでモデルの出来上がりです!めっちゃ簡単ですね!

では,単語がどれだけあるかをみてみます.下のコードを実行すると単語とその数が歌詞の中でどれだけ出てきてるかがわかります.

w2c = dict()
for item in model.wv.vocab:
    w2c[item]=model.wv.vocab[item].count
w2c

今回は単語数が上位10個を表示してみます.

f:id:Kodachan:20191208050810p:plain

いきなりのExcelプロット

おおっ!何となくできてそうですね〜

ちなみに下のコードで具体的な単語数をさくっと調べることができます.

vocab_obj = model.wv.vocab["君"]
vocab_obj.count

では,Word2Vec恒例の類似語をみてみましょう.まずは,”君”の類似語をみてみます.

ret = model.wv.most_similar(positive=["君"] ) 
for item in ret:
    print(item[0], item[1])

結果:

僕 0.6448466777801514

出会える 0.46511760354042053

だす 0.41381388902664185

増える 0.4025307297706604

おかげ 0.3966715931892395

宝石 0.39443904161453247

今夜 0.3940380811691284

越える 0.3933907151222229

いた事 0.3921634554862976

一緒 0.3907034397125244

おおお!!!!できてる!!!!
”君”と”僕”が類似語っていかにもBUMPっぽいですよね!
”出会える”も”君と出会える”って解釈すればBUMPっぽいですよね!

他にもBUMPっぽい言葉と言えば”ガラス”や”猫”,”声”などがありますね!やってみましょう!!!と言いたいところですが,長くなってきたんでエモそうな結果だけを載せます.

"ガラス”の結果:

眼 0.7653242349624634

玉 0.7509319186210632

猫 0.7420406341552734

"猫”の結果:

黒 0.7920424938201904

眼 0.7430715560913086

ガラス 0.742040753364563

"声”の結果:

耳 0.6141402721405029

塞ぐ 0.6018502116203308

聴く 0.5937756896018982

エモみの塊ですね!!

エモそうなものだけ載せてるからそりゃエモみの塊になりますよね笑

大体この曲のことかなってのがよくわかりますね!Kとかガラスのブルースとかプレゼントとか.

 

次に動詞についてみてみます.BUMPっぽい動詞と言ったら”泣く”や”繋ぐ”,”走る”などが思いついたのでこれらの類似語を載せます.

"泣く”の結果:

怒る 0.7565212249755859

近く 0.5425382852554321

困る 0.4250868558883667

"繋ぐ”の結果:

紐 0.5604400634765625

離す 0.5582458972930908

離れる 0.5504225492477417

"走る”の結果:

急ぐ 0.6995325088500977

名 0.6664260625839233

手紙 0.5832282304763794

 

こちらもエモみが溢れてますね!泣くと怒るの類似度が高かったり,繋ぐと離す,離れるの類似度が高いあたりはBUMPっぽいですよね!

 

次にこれもWord2Vec恒例の足し算,引き算をやってみます.まずは”君”+”出会える”=”僕”+”?”を考えます.

ret = model.wv.most_similar(positive=["君","出会える"],negative=["僕"]) 
for item in ret:
    print(item[0], item[1])

結果:

教える 0.47623467445373535

いつか 0.4419512152671814

エモそう!!

”君”+”出会える”=”僕”+”教える”は”君と出会えることを僕が教える”みたいに解釈できそうですよね(強引かな?)

”君”+”出会える”=”僕”+”いつか”は”君と僕はいつか出会える”的な感じに解釈できそうですよね?!!(これは強引)

 

 それでは,”君”と”僕”を入れ替えた”僕”+”出会える”=”君”+”?”も考えてみます.

ret = model.wv.most_similar(positive=["僕","出会える"],negative=["君"]) 
for item in ret:
    print(item[0], item[1])

結果:

おかげ 0.48257261514663696

向ける 0.45529890060424805

エモそう?

”僕”+”出会える”=”君”+”おかげ”は”僕が出会えるのは僕のおかげ”みたいに解釈できそうですよね(強引ですね)

”僕”+”出会える”=”僕”+”向ける”は何かいい解釈ありませんかね笑

 

まとめ

安直な思いから始めた分析でしたが,結果としてはエモいものが多くとても満足いく結果を得ることができました.まだまだ,分析したい単語はあるので分析次第追記するなり呟くなりしたいと思います.

 

謝辞

分析してつぶやいたときに先人の方からありがたくモデルに名前をつけていただけました.ここでにのぴらさんには熱く御礼申し上げます.

 

次回

にのぴらさんから歌詞作成も面白いからやってみなという啓示を受けたのでやってみたいと思います.

また,歌詞が作成された年代も考慮に入れた分析もやってみたいと思います.