狩歌でどの曲が盛り上がるのかスコア理論値を調査する方法

#そもそも狩歌とは
簡単に説明すると、音楽を聴いて聞こえた歌詞の札を取り合うボードゲームです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">狩歌（かるうた）というゲームを作りました。JPOPを聴き、その歌詞と一致するカードを取るカルタです。歌詞の頻出度によって点数が変わったり、何度も出てくる歌詞にはボーナスがあったり。お気に入りの曲をかけてノリノリでプレイしましょう！ <a href="https://t.co/o13zxUWQk8">pic.twitter.com/o13zxUWQk8</a></p>&mdash; Xaquinel サグイネル 『狩歌』発売中 (@Xaquinel) <a href="https://twitter.com/Xaquinel/status/776726709240406016?ref_src=twsrc%5Etfw">September 16, 2016</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
#採点方法
カードごとにポイントが割り振られており、1点、2点、5点の札があります。
1点の札を3枚集めると10点になるルールもあり、シンプルながらも奥深いゲームです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">2018年12月14日『狩歌 基本セット』『狩歌 応用セット』値下げして再発売！！簡単なルールで遊べるJ-POPかるたです。 <a href="https://t.co/jUHL16R7qY">pic.twitter.com/jUHL16R7qY</a></p>&mdash; Xaquinel サグイネル 『狩歌』発売中 (@Xaquinel) <a href="https://twitter.com/Xaquinel/status/1069226588665896960?ref_src=twsrc%5Etfw">December 2, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#作成経緯
ネットを検索するとすでにおすすめの曲って結構紹介されてるんですよね。
その曲で遊ぶのもいいけど、自分の好きなアーティストでプレイしたいじゃないですか。
例えば私はアニオタなので「ラブライブ!」のμ’ｓの楽曲でやったらどうなるのかな？
と思うわけですが、どうせ遊ぶならたくさんワードが出てくる曲で遊びたいということで、調査することにしました。
遊んでから「この曲は多かったねぇ」などやっている時間は社会人にはないのです。
#調査方法検討
- 歌詞の取得
一番ハードルが高いであろう「歌詞」をどこから取得するか。
こちらは↓ブログさんを参考にさせていただいて、歌詞ネットから取得させていただくことにします。
http://hacosato.hatenablog.com/entry/20170805/caruuta

- 使用言語
Powershellを利用します。
私がインフラエンジニアゆえの選択です。

- 開発環境
Visual Studio Codeを使用します。
めっちゃ書きやすい


- 簡単なロジック
1.ワード、点数の定義ファイルを用意
2.Powershellで定義ファイルを読み込み
3.対象の歌詞を読み込み
4.ワードと一致する場合、点数を計上

#実装
1.定義ファイルの作成
↓こんな感じのCSVファイルを用意します。

```
KeyWords,Point
毎日,5
長い,4
自分,2
優しい,3
ふたり,4
きっと,2
今日,2
本当,5
大人,5
みんな,4
心,1
全て,4
```

2.定義ファイルの読み込み
以下コマンドでCSVファイルを読み込みます。

```PowerShell
$KeyWords = Import-Csv -Path .\KeyWord.csv
```

3.歌詞の取得
以下コマンドを使用して指定したURLの情報を取得します。

```
$Contents = Invoke-WebRequest -Uri $URL
```

取得した情報から歌詞の部分のみを取得する処理に関しては、
HTMLをパースし、getElementbyIDメソッドを使用して抽出します。
アーティスト名や
曲名も同様です。
詳しい情報は以下URLを参考いただければ。
本当にためになる情報盛りだくさんで勉強になりました。
http://winscript.jp/powershell/305

```
$Lyrics = ($Contents.ParsedHtml.getElementById("***")).textContent
```

4.点数の計算
点数の計算についてはめちゃくちゃシンプルですが、
CSVで読み込んだファイル内のキーワードが取得した歌詞と一致した場合、
ポイントとして計算する仕組みになっています。
ただし、ここでは1ポイントは計算せず、1ポイントが何回出てきたかのみ集計します。

```
    foreach($keyword in $KeyWords){
        if($Lyrics -match $keyword.KeyWords){
            #1ポイント以外は集計
            if($keyword.Point -ne 1){
                [int]$KaruUtaScore = [int]$KaruUtaScore + [int]$KeyWord.Point
            }
            
            #1ポイント用の処理
            if($KeyWord.Point -eq 1){
                $ExPointCount ++
            }

        }
    }
```

1ポイント用の処理はForEachの処理完了後に処理します。

```
#1ポイントが3枚だと10点になるルールの処理
    $ExPoint = [system.math]::Floor($ExPointCount / 3)
    $ExPoint = $ExPoint * 10
    #あまりの値を追加
    $ExPoint = $ExPoint + ($ExPointCount % 3)

    #総合スコアを計算
    $KaruUtaScore = $KaruUtaScore + $ExPoint
```

#EX
1曲なら上記でいいんですが、何曲もやる場合は、関数化してしまったほうが楽です。
関数化後の集計処理については、リターンとして受け取ったアーティスト名,曲名,スコアを連想配列に格納します。

```
#集計用配列の初期化。一番最初にやっとく
$SongDB = @()

#URLリストを読み込む
foreach($URL in $URLList){
    $Result = ChkScore($URL.URL)
    
    #$Result
    #配列に格納
    $SongDB += @{
        Artist = $Result[0]
        Song = $Result[1]
        Score = $Result[2]
    }
}
```
また、以下処理で、処理結果をCSVとして吐き出します。
そのほうが見やすいですしね。

```
#CSVファイルとして吐き出す
$SongDB[0].Keys -join "," >> .\Result.csv
ForEach($A in $SongDB){
    $A.values -join "," >> .\Result.csv
}
```

#結果
実際の処理結果が以下です。
Wonderful Rush強いですねぇ！

| Artist | Song |  Score  |
|:-------|:-------|:--------|
|μ's|Wonderful Rush|88|
|園田海未(三森すずこ)|私たちは未来の花|84|
|μ's|MOMENT RING|78|
|μ's|LOVELESS WORLD|77|
|μ's|嵐のなかの恋だから|74|
|μ's|Super LOVE＝Super LIVE!|74|
|μ's|ミはμ'sicのミ|74|
|μ's|KiRa-KiRa Sensation!|72|
|μ's|それは僕たちの奇跡|70|
|μ's|僕たちはひとつの光|70|
|μ's|Music S.T.A.R.T!!|69|
|南ことり(内田彩)<br>小泉花陽(久保ユリカ)|告白日和、です！|69|
|μ's|WILD STARS|69|
|μ's|Shangri-La Shower|68|
|μ's|LONELIEST BABY|67|
|μ's|愛してるばんざーい!|65|
|高坂穂乃果(新田恵海)<br>南ことり(内田彩)<br>園田海未(三森すずこ)|ススメ→トゥモロウ|63|
|lily white|微熱からMystery|63|
|BiBi|冬がくれた予感|63|
|高坂穂乃果(新田恵海)|Someday of my life|62|
|μ's|"夏色えがおで1,2,Jump!"|62|
|μ's|Angelic Angel|62|
|μ's|僕らのLIVE 君とのLIFE|61|
|μ's|さようならへさよなら!|61|
|μ's|僕らは今のなかで|60|
|lily white|知らないLove*教えてLove|58|
|Printemps|永遠フレンズ|58|
|μ's|きっと青春が聞こえる|57|
|lily white|思い出以上になりたくて|57|
|Printemps|NO EXIT ORION|57|
|μ's|Dancing stars on me!|56|
|南ことり(内田彩)|スピカテリブル|55|
|BiBi|夏、終わらないで。|55|
|μ's|"Oh,Love＆Peace!"|54|
|Printemps|sweet&sweet holiday|54|
|BiBi|ラブノベルス|54|
|μ's|SENTIMENTAL StepS|54|
|高坂穂乃果(新田恵海)|愛は太陽じゃない？|53|
|lily white|あ・の・ね・が・ん・ば・れ!|53|
|μ's|Happy maker!|53|
|μ's|HEART to HEART!|53|
|μ's|ユメノトビラ|53|
|BiBi|錯覚CROSSROADS|53|
|lily white|秋のあなたの空遠く|52|
|Printemps|小夜啼鳥恋詩|52|
|小泉花陽(久保ユリカ)|なわとび|50|
|絢瀬絵里(南條愛乃)<br>東條希(楠田亜衣奈)|硝子の花園|48|
|BiBi|Cutie Panther|48|
|μ's|Snow halation|48|
|μ's|そして最後のページには|48|
|lily white|ふたりハピネス|47|
|小泉花陽(久保ユリカ)|孤独なHeaven|46|
|高坂穂乃果(新田恵海)<br>南ことり(内田彩)<br>園田海未(三森すずこ)|START:DASH!!|46|
|μ's|START:DASH!!|46|
|南ことり(内田彩)<br>園田海未(三森すずこ)|Anemone heart|45|
|μ's|輝夜の城で踊りたい|44|
|μ's|Mermaid festa vol.1|44|
|絢瀬絵里(南條愛乃)|ありふれた悲しみの果て|43|
|Printemps|UNBALANCED LOVE|42|
|Printemps|Love marginal|42|
|μ's|タカラモノズ|42|
|μ's|どんなときもずっと|42|
|μ's|だってだって噫無情|41|
|高坂穂乃果(新田恵海)<br>星空凛(飯田里穂)|Mermaid festa vol.2 ～Passionate～|40|
|高坂穂乃果(新田恵海)<br>南ことり(内田彩)<br>園田海未(三森すずこ)<br>星空凛(飯田里穂)<br>西木野真姫(Pile)<br>小泉花陽(久保ユリカ)<br>矢澤にこ(徳井青空)|これからのSomeday|39|
|Printemps|Pure girls project|39|
|μ's|もぎゅっと“love”で接近中!|39|
|BiBi|ダイヤモンドプリンセスの憂鬱|38|
|園田海未(三森すずこ)|勇気のReason|37|
|μ's|SUNNY DAY SONG|37|
|μ's|baby maybe 恋のボタン|36|
|高坂穂乃果(新田恵海)|もうひとりじゃないよ|36|
|μ's|友情ノーチェンジ|36|
|星空凛(飯田里穂)<br>西木野真姫(Pile)|Beat in Angel|35|
|lily white|春情ロマンティック|34|
|A-RISE|Private Wars|33|
|高坂穂乃果(新田恵海)|夢なき夢は夢じゃない|33|
|μ's|Paradise Live|33|
|西木野真姫(Pile)|Daring!!|32|
|μ's|るてしキスキしてる|32|
|矢澤にこ(徳井青空)<br>東條希(楠田亜衣奈)|乙女式れんあい塾|31|
|東條希(楠田亜衣奈)|純愛レンズ|31|
|Printemps|WAO-WAO Powerful day!|30|
|μ's|COLORFUL VOICE|28|
|BiBi|Trouble Busters|28|
|lily white|キミのくせに！|27|
|星空凛(飯田里穂)|恋のシグナルRin rin rin|26|
|西木野真姫(Pile)<br>園田海未(三森すずこ)<br>絢瀬絵里(南條愛乃)|soldier game|26|
|μ's|No brand girls|26|
|μ's|Wonder zone|25|
|矢澤にこ(徳井青空)|まほうつかいはじめました!|22|
|矢澤にこ(徳井青空)|にこぷり 女子道|19|
|BiBi|PSYCHIC FIRE|19|
|南ことり(内田彩)|ぶる～べりぃ とれいん|16|