ポルノグラフィティ狩歌の歌詞が出てくる数をGAS使って調べる

ポルノグラフィティ狩歌の歌詞が出てくる数をGAS使って調べる

ポルノグラフィティ狩歌で1曲作れるんじゃないか説

タイトルと見出しの通りなんですが、ポルノグラフィティ20周年グッズの「狩歌」について気になったことが出てきて、ついでに思いついたことがあったのでやっていきます。

まず「狩歌」とはJ-POPの歌詞に出てくるキーワードが書かれたカードで遊ぶ「かるた」です。
それのポルノグラフィティバージョンということで、ポルノグラフィティのシングル曲(アポロVSの50枚54曲、m-FLOODはシングルとしてカウントされません)に合ったキーワードがたくさん入っています。

100枚のカードに「旅人」とか「月」とか、いかにもポルノグラフィティの曲に出てきそうなワードが使われています。
そこで気になったことがいくつかありました。

  • 「狩歌」のキーワードは実際の歌詞の中にどれくらい出てくるのか?
  • 1曲の中でどのくらいの頻度でキーワードが登場するのか?
  • 「狩歌」で採用されたワードは「ポルノグラフィティっぽい」のか?
  • 「狩歌」のキーワードを詰め込めば誰でもポルノグラフィティっぽい歌詞が作れるのではないか?

これを検証したいと思います。

ポルノグラフィティの新曲の歌詞を作るための準備

ゴールは「狩歌のキーワードならポルノグラフィティっぽい歌詞を作れる」ということの証明です。
しかしこんなことを1人で黙々とやるのにモチベーションが継続できるか心配すぎるので、ブログと動画で発表できるような企画にしていきたいと思います。

ポルノグラフィティ狩歌は20周年記念ということで当時の最新シングルVSまでが対象なのですが、2021年9月22日に「テーマソング」が発売されてしまいますので、なんとかそれまでに歌詞を作り終わってしかも動画の編集が終わればなあと考えています。

ただ「狩歌」のキーワードを並べるだけだと面白くないので、ルールを決めました。

企画のルール

  • 使うキーワードはカードをランダムで引いて決める
  • キーワードは必ずカードを引いた順に登場させる
  • 1度登場したあとは複数回登場しても良い
  • キーワードの使い方は公式ルールに則る
  • 歌詞は既存の曲を逸脱しない長さや構成にする

さて、ここで気になっていた疑問を解決する必要が出てきました。
それは「1曲あたりのキーワード数」です。
ついでにそのほかの疑問も解決するために、アポロからVSまでの54曲(両A面の曲もカウント)をすべて調査したいと思います。
調査する内容は、「どの曲にどのキーワードが出てくるか」「1曲平均のキーワード数」となります。

しんどいですね?

やります。

キーワードの調査

歌詞データを準備する

この作業がもっともしんどいと思います。
なんせいわゆる著作権という問題がありまして、基本的にコピペできるサイトがありません。
できるサイトもあるっちゃありますが触れずにおきましょう。
IT技術を駆使すれば手打ちしなくてもどうにかできますがそこは触れずにおきましょう。
私はよくわかりませんが、みなさんあちらの出口の方に行かれますね。

自力で用意しましょう。

のちのちGASで走査するためにGoogleドキュメントで用意しておきます。
とりあえず1ファイルに1曲で、ファイル名は曲のタイトルにしておきます。

これらのドキュメントファイルはひとつのフォルダ内に入れておきます。

検索するためのキーワードリストを準備する

そして、検索するキーワードのリストをスプレッドシートに用意します。
このとき、「狩歌」のカードで複数の表記があるものについても検索できるようにリストを編集しておきます。
たとえば「青」というカードには「青」「ブルー」があるのですが、ハネウマライダーの「metal blue」も検索でヒットしないと困るので追加しましょう。

今回A列にカード100枚分のリスト(新品開封時点のカード順)を入れましたが、実際にはB列のデータを使って検索します。

「白」の「ホワイト」や、「黒」の「ブラック」などはカタカナで表記されていますが、実際の歌詞では「White」や「Black」といった英単語になっていることがあります。これらも公式ルールに則り、耳で聴こえる歌詞である「ホワイト」「ブラック」という歌詞にあてはまるとして対象にします。
検索でヒットさせるためにリストに追加しておきます。

公式ルールでは、歌詞の表記が「時間」で読みが「とき」であっても、「とき」と読ませる「時」のカードをとるというルールになっています。「青空(あおぞら)」も「空(そら)」の対象になりません。「月夜」という歌詞で「夜(よる、よ、や)」となっているカードはとれます。

参考:狩歌 細かいルール

検索結果を記録するシートを準備する

具体的なスクリプトのコードはこのあと出しますが、そのときに使用するシートを作っておきます。
今回は「キーワード抽出」「キーワード出現回数」「曲別ワード出現数」の3つのシートを作りました。

GASで検索&シート入力のスクリプトを用意する

特に必要ではないのですが、パッと見でわかりやすそうなので、歌詞データのドキュメントを検索すると同時に検索でヒットした箇所を黄色くハイライトする処理も入れました。
画像でも歌詞が読めたらダメかもしれないので念のためぼかしましたから何の曲かはわからないかもしれませんが、こんなイメージです。


いや〜画像とはまったく関係ないんですけど、私ゲームで一番好きなのは逆転裁判シリーズなんですよね〜ほんと画像とはまったく関係ないんですけど。

処理の順序

  1. 検索対象のドキュメントが入ったドライブのフォルダやスプレッドシートを変数に入れておく
  2. スプレッドシートのB列キーワードリストの値をまとめて配列にぶち込む
  3. 検索した結果を二次元配列に入れるため変数を用意しておく
  4. ドキュメントをひとつずつループして対象のドキュメントに次の処理をしていく
  5. ドキュメントのIDやファイル名などを取得しておく
  6. ドキュメントを開く
  7. キーワードリストをループしてドキュメントのテキスト内を検索していく
  8. マッチしたらドキュメント上のテキストをハイライトする
  9. マッチしたキーワードと現在の曲名を二次元配列に格納して貯めていく
  10. ドキュメントを保存して閉じる
  11. 貯めた二次元配列のデータをシートのセルに出力する

実際のコード

これらの記事を参考にしてコードを書きました。

function karuutaSearch() {
  //ドライブのフォルダを指定してファイルを取得
  var drive = DriveApp.getFolderById("ドライブのフォルダID");
  var docs = drive.getFiles();

  var spreadSheet = SpreadsheetApp.openById("スプレッドシートのID");
  var sheet = spreadSheet.getSheetByName("キーワードリスト");
  var sheetResult = spreadSheet.getSheetByName("キーワード抽出");

  var keywords = sheet.getRange("B:B").getValues().filter(v => v[0]);

  var resultTable = [];
  var resultRecord = [];

  while (docs.hasNext()) {
    var doc = docs.next();
    var docId = doc.getId();
    var title = doc.getName();

    Logger.log(title);

    var doc = DocumentApp.openById(docId);

    //ドキュメントのテキストを大文字→小文字変換して格納
    var body = doc.getBody();
    var asText = body.asText();
    var text = asText.getText().toLowerCase();
    body.clear();
    body.insertParagraph(0,text);

    //keywordsを検索するループ処理
    var keywordsCnt = keywords.length;
    for(var i=0; ikeywordsCnt; i++)
      {
        //次のキーワード
        var str = keywords[i];

        var match = new RegExp(text.match(str), 'gim');
        var pos = 0;
        var posN = 0;
        while ((arr = match.exec(text)) !== null) {
          posN = body.asText().getText().indexOf(str, pos);
          if (posN !== -1) {
            //見つかった箇所にハイライトをつける
            asText.setBackgroundColor(posN, posN + str.length - 1, '#fff089');
          }
          pos = match.lastIndex;

          resultRecord = [title,str];
          resultTable.push(resultRecord);
        }
      }
    doc.saveAndClose();
  }
  //スプレッドシートにresult出力
  Logger.log(resultTable.length);
  sheetResult.getRange(1, 1, resultTable.length, resultTable[0].length).setValues(resultTable);
}

*コードハイライトプラグインのバグ対応のためループの比較演算子「<」を全角文字にしています。

GASではスクリプトの実行時間が6分に制限されています。
検索した結果を1行ずつスプレッドシートに入力してしまうとめちゃくちゃ時間がかかり、6分では終わりませんでした。
そのため二次元配列にデータのみを保管しておき、最後にまとめてスプレッドシートに貼り付けるという処理にしました。
これでかなりの時短になります。

ちなみにこのスクリプトを使えば他のキーワードや他の曲でも出現回数を調べることができます。
たとえば「猫」とか。
ただそのために歌詞のデータを準備しなければならないので、やる気は起きません。

ポルノグラフィティの全曲の中で「猫」が出てくる回数、気になってるんだけどなー

各種集計データを作る

スクリプトを実行し「キーワード抽出」シートにキーワードのデータが表示されたら、あとは「キーワード出現回数」「曲別ワード出現数」シートに集計データを出力していきます。

全体でのキーワード出現回数を調べる

まず「キーワード出現回数」シートのほうです。
A列にはキーワードリストを入力します。
B列にそのキーワードが何回出てきたのかを表示したいので、COUNTIF関数を使います。
「キーワード抽出」シートのB列に、A列に入っているキーワードがいくつあるかをカウントします。

=COUNTIF(‘キーワード抽出’!B:B,A1)

曲別のキーワード出現回数を調べる

続いて「曲別ワード出現数」シートです。

こちらは曲名のリストを手で作るのは大変なので、「キーワード抽出」シートのA列から持ってきましょう。重複はカウントせずにデータをとってきたいので、UNIQUE関数を使います。

=UNIQUE(‘キーワード抽出’!A:A)

そしてB列は、「キーワード出現回数」と同様にCOUNTIF関数でカウントした数を入れます。

=COUNTIF(‘キーワード抽出’!A:A,A1)

リストの中で最大値と最小値を調べる

ついでなので、もっとも多くキーワードが出てくる曲と、もっとも少ない曲を調べます。
条件付き書式の「カスタム数式」を使って、最大値・最小値のセルに色をつけます。

=$B:$B = max(B:B)

画像は最大値ですが、最小値のときはmaxminに変更すればOK。

調査結果

検索結果のデータのみのスプレッドシートを用意しました。
欲しい方はどうぞ。
ポルノグラフィティ狩歌キーワード調査(Googleスプレッドシート)

追記: 精度が低かったのでデータ修正しました。ついでに重複除外処理も入れたいなーいつかやります。

もっとも少なかったのはカゲボウシ(8件)でした。
スローテンポな曲やバラード系はどうしても歌詞のボリュームが少ないためキーワードの出現回数も少なめなのですが、非常に意外なところでDON’T CALL ME CRAZY(9件)というのもありました。
また1桁というのはこのほかにはROLL(9件)のみです。

頻度MAXだったのはTHE DAY(35件)
さもありなん…

テキストを検索している都合上、たとえば瞳の奥をのぞかせて「空(から)のワイングラス」(「そら」ではない)のように本来対象ではないワードでマッチしてしまったものもあります。
また「Days」は「Day」でもマッチしてしまうため重複されているカウントもあります。

ちなみに一番多いのは「日」(84件)でした。
「今日」「明日」「昨日」など、「日」が含まれる単語がたくさんあるので自然と頻度が高くなるのでしょう。
次点の「空」(47件)と大差をつけてトップでした。
「空」は単体でも出てきますが「夜空」や「青空」などもヒットしてしまいます。

さきほど説明したとおりこれら読みの異なるワードは本来は対象外なので、厳密にやるなら除外ワードリストが必要になってきますね…しんど…
まあ、最終的な目的はここの調査じゃなくて歌詞に使う適切なワード数の目安を知ることなので、これで良しとしましょう。

この状態の1曲あたり登場数アベレージは18.5ワードなのですが、重複を除外したらさらに減りますね。

そもそも100ワード全部使って作れるんじゃないか?歌詞を。
むしろ、そのくらい詰め込まないと、20ワード入れる程度では、こっちで考えなきゃいけないボリュームが多すぎるぞ?

そのへんどうするかは後で考えます。

とりあえず今回はここまで!

ぎりっぎりで9月8日中に公開できそうなんで慌てて公開しちゃいます!誤字脱字その他必要なところあれば随時修正していきます。あしからず!

後編の記事と動画を9月22日に同時公開予定です。ぜひご覧ください。

過去のポルノグラフィティ関連の記事