目次
本研究では大まかに2つのことをやる
1.webから楽曲特徴量を取得し、特徴量に応じたHTMLの作成(下準備)
2.顔から感情値を取得し、感情値に応じてHTMLへ移動
実行したいだけの人は下の「楽曲推薦の実行方法」まで飛ばしてください
使うプログラムはこちら ※最終的に1.8GBの容量になるのでPCに1.8GB分の容量をあけておいてください
あと、htmlの作成に合計3~4時間かかります
#ref(): File not found: "感情分析プログラム.zip" at page "石井さん卒論"
中身はこんな感じ
#ref(): File not found: "使うプログラム1.png" at page "石井さん卒論"
「1.プレイリスト作成用プログラム」は、HTML作成するプログラムで「2.顔から感情推定用プログラム」は顔から感情を取得するプログラムである。
「data」は「1.プレイリスト作成用プログラム」のプログラムの実行結果のcsvを格納するためのフォルダである
下準備1.GeniusAPIからアクセストークを取得
下準備2.SpotifyからClientid、Clientsecretを取得
1.「1.プレイリスト作成用プログラム」の「2.Geniusから歌詞の取得.ipynb」を実行
2.「1.プレイリスト作成用プログラム」の「3.BERTのモデルの構築&歌詞の感情推定」のなかにある「3.BERTモデル構築&感情推定.ipynb」を実行
3.「1.プレイリスト作成用プログラム」の「4.LDAによるトピック分類.ipynb」を実行
4.「1.プレイリスト作成用プログラム」の「5.トピックと楽曲特徴量によるHTMLの作成.ipynb」を実行
ここで、HTML作成は終わり
5.「2.顔から感情推定用プログラム」のapp.py実行用のモジュールをインストール(インストールするモジュールは後述)
6.「2.顔から感情推定用プログラム」のapp.pyをコマンドプロンプトから起動
以下にそれぞれの解説を行う
GeniusAPIから歌詞を取得するには、以下のサイトの、「Geniusのアカウント登録」、「Genius APIにおけるトークンの取得」を行う
登録したら、アクセストークンを控えておく。これは2.Geniusから歌詞の取得.ipynbで使用する。以下は例↓
#ref(): File not found: "アクセストークン.jpg" at page "石井さん卒論"
spotifyから楽曲の特徴量を取得するには、spotifyに会員登録をし、clientid,crientsecretを取得する必要がある。
以下のサイトの、「ここまででCLIENT ID と CLIENT SECRET ID を取得する流れは完了です」までを実行する
https://zenn.dev/tteaoocl/articles/6cce2e7615c11c
アプリを作成の部分で、アプリ名とアプリの説明は何でもよいが、リダイレクトURLは「https://example.com/callback/」を入力する
#ref(): File not found: "アクセストークン22.png" at page "石井さん卒論"
登録が完了したら、ClientIDとClientsecretを控えておく。これは5.トピックと楽曲特徴量によるHTML作成で使用する
以下は例↓
#ref(): File not found: "アクセストークン333.png" at page "石井さん卒論"
「1.プレイリスト作成用プログラム」の中身はこのようになっている
#ref(): File not found: "使うプログラム2.1.1.png" at page "石井さん卒論"
2から順番に使っていきます
基本的にコードを実行していくだけでできます。
このプログラムでできること
・アーティスト名と楽曲名から歌詞を取得する
・スクレイピングで取得した歌詞の不要な部分の除去
ipynbはそれぞれのブロックに分かれているので、それぞれの重要な部分の解説を行う
コードを実行するとこのプログラムの実行に必要なモジュールがダウンロードされる
tokenに「下準備1」で取得した自分のアクセストークンを入れる
#ref(): File not found: "アクセストークン2.png" at page "石井さん卒論"
「clean_lyrics」は歌詞から不要な文字列を削除する関数。
#ref(): File not found: "2関数1.png" at page "石井さん卒論"
「get_lyrics」はアーティスト名と曲名を使って Genius から歌詞を取得する関数。
#ref(): File not found: "2関数2.png" at page "石井さん卒論"
これは削除したい不要な文字列を削除する部分。削除したい文字列を追加したい場合配列に追加する
#ref(): File not found: "2関数3.png" at page "石井さん卒論"
最後に、歌詞の列を追加したcsvが「data」の「2.ごみとり前歌詞付き楽曲特徴量1.csv」に保存される。
これは取得した歌詞から分析に関係ないごみを取るコード。
実行に200分くらいかかるので、実行したら放置。
最後に、歌詞のゴミとり処理を行った結果のcsvファイルが「data」の「3.ごみとり前歌詞付き楽曲特徴量2.csv」に保存される。
これは上と同じようにごみを取るコード
これはすぐ終わります
最後に、歌詞のごみとり処理を行った結果結果が「data」の「4.歌詞付き楽曲特徴量.csv」に保存される。
このプログラムでできること
・BERTのモデルを構築する
・構築したBERTモデルを用いて歌詞の感情値(0~1の連続値、1に行けば行くほどポジティブを表す)を推定する
BERTについて知りたい人はこちらを参考に↓
https://aisuite.jp/column/bert/
「3.BERTのモデル構築&歌詞の感情推定」の中身はこのようになっている。この中の「3.BERTのモデル構築&歌詞の感情推定.ipynb」を実行する
#ref(): File not found: "3の中身.png" at page "石井さん卒論"
実行するとこのプログラムの実行に必要なモジュールがダウンロードされる
「chABSA-dataset」は、TISが公開している感情分析を行うためのデータセット
詳しくはこちら↓
https://www.tis.co.jp/news/2018/tis_news/20180410_1.html
#ref(): File not found: "3.1.png" at page "石井さん卒論"
このコードは以下のサイトから「chABSA-dataset.zip」をダウンロードしている↓
https://github.com/chakki-works/chABSA-dataset?tab=readme-ov-file
コードを実行すると「chABSA-dataset.zip」が解凍される
#ref(): File not found: "3.2.0.png" at page "石井さん卒論"
このコードは「chABSA-dataset」を扱いやすいようにcsvファイルに変換している
ほぼこのページを参考にしました↓
https://zenn.dev/robes/articles/a7ba6e172f3a14
コードを実行すると「dataset.csv」が保存される
#ref(): File not found: "3.2.1.png" at page "石井さん卒論"
中身はこんな感じ。「label」は、「text」の文章がポジティブかネガティブかを表している(0ならネガティブ、1ならポジティブ)
#ref(): File not found: "3.3.png" at page "石井さん卒論"
このコードはさっき作った「dataset.csv」を使ってBERTを感情分析用に適用させる。
BERTは事前学習は東北大学が公開している「bert-base-japanese-v2」を使用している
「bert-base-japanese-v2」についてはこちら↓
https://www.math-joy-life.com/bert-base-japanese-v2
BERTのモデルのトレーニングに使用するトレーニング引数である
#ref(): File not found: "トレーニング引数.png" at page "石井さん卒論"
num_train_epochsはエポック数であり学習データを全て 1 回モデルに入力するプロセスの回数である
per_device_train_batch_size、per_device_eval_batch_sizeトレーニングと評価の際のバッチサイズであり、一度にモデルへ入力されるデータサンプルの数のことである
warmup_steps学習率が最大値に到達するまでのステップ数である
weight_decayは重み減衰率であり,モデルの過学習を防ぐためのパラメータである
logging_stepsはlogに記録を書き込む回数のことである
BERTの用語について詳しくはこちら↓
https://deepsquare.jp/2020/07/transformer/
このコードを実行するとBERTのモデルが作成される
#ref(): File not found: "完成したモデル.png" at page "石井さん卒論"
また、最後にモデルの評価結果が出力される。
#ref(): File not found: "モデルの評価.png" at page "石井さん卒論"
このコードは、作成したBERTの感情分析モデルで、歌詞の感情値を分析している
BERTで歌詞のポジティブ、ネガティブの割合を分析し、ポジティブの割合を感情値としている。
このコードを実行すると歌詞の感情分析結果を追加したcsvファイルが「data」の「5.歌詞感情値付き楽曲特徴量_列名修正前.csv」に保存される
csvファイルの列名を整えている
コードを実行すると列名を変更したcsvファイルが「data」の「6.歌詞感情値付き楽曲特徴量2.csv」に保存される
このプログラムでできること
・LDAを拡張したガイド付きLDAを用いて、歌詞から任意のトピックを抽出する。
LDAとは、それぞれのテキストを単語に分割して情報化して、各テキストについてのトピックを推定するもの
ガイド付きLDAとは、それぞれのトピックに「予約語」を設定することで、テキストを任意のトピックへクラスタリングするもの
LDAについて知りたい人はこちら↓
https://recruit.gmo.jp/engineer/jisedai/blog/topic-model/
ガイド付きLDAについて知りたい人はこちら↓
https://qiita.com/pocket_kyoto/items/23ebe43c7f647f2c6b6f
実行するとこのプログラムの実行に必要なモジュールがダウンロードされる
ここでは、ガイド付きLDAを用いて、歌詞を「恋愛」「青春」「応援」「友情」「絶望、孤独」「夢、目標」「人生」「ストーリー」「季節、風景描写」「地名場所」に分類している。
ここはストップワードを設定する部分。ストップワードとは、分析に必要のない単語のことであり、ストップワードを設定して分析に関係ない単語を除去している
#ref(): File not found: "4.1.png" at page "石井さん卒論"
ここは予約語の定義の部分。予約語として各トピックに関連するワードを設定することにより歌詞を任意のトピックに分類することができる。
それぞれのトピックの予約語は、トピックに関連するであろうワードを自分で設定しました。ここを変えればクラスタ結果が変わります。
#ref(): File not found: "4.2.png" at page "石井さん卒論"
ここは歌詞からストップワード、と英語を除去し、単語ごとに分割している
#ref(): File not found: "4.31.png" at page "石井さん卒論"
ここは予約語をもとに初期トピックの単語分布を設定している。
#ref(): File not found: "4.4.png" at page "石井さん卒論"
ここはLDAモデルのパラメータ設定部分。etaはトピックの単語分布を表し、さっき作成した単語分布を使用している
#ref(): File not found: "4.5.png" at page "石井さん卒論"
最後に、トピックのクラスタ結果を追加したcsvファイルが「data」の「7.歌詞感情値楽曲特徴量_with_cluster.csv」に保存される
また、クラスタとトピック対応表のcsvファイルが「data」に保存される
このプログラムでできること
・トピックと特徴量ごとにプレイリストを作成
・プレイリストを埋め込んだHTMLの作成
実行するとこのプログラムの実行に必要なモジュールがダウンロードされる
これは楽曲を、「高ネガティブ強度向け」「中ネガティブ強度向け」「低ネガティブ強度向け」にクラスタリングしている。
最後に、特徴量のクラスタ結果を追加したcsvファイルが「data」の「8.歌詞感情値付き楽曲特徴量_with_cluster_更新.csv」に保存される
これは、次の「プレイリストの作成とhtmlの作成」を実行するために必要なコードである。 まず、「CLIENT_ID」と「CLIENT_SECRET」は「下準備2」で取得したものを入れる
#ref(): File not found: "クライアント登録.png" at page "石井さん卒論"
実行すると、以下のurlが出てくるので、クリックする
#ref(): File not found: "実行1.png" at page "石井さん卒論"
そうすると以下の画面が出るので、このページのurlをコピーする
#ref(): File not found: "実行2.png" at page "石井さん卒論"
また、画面上部にurlを張り付ける部分が出てくるので、先ほどコピーしたurlを張り付ける
#ref(): File not found: "認証1.png" at page "石井さん卒論"
成功すると「認証成功!アカウント名:(ユーザの名前)」が表示される。もし認証に失敗したらもう一度urlを張りなおすか、client,clientsecretが間違っていないか確認する
#ref(): File not found: "認証結果.png" at page "石井さん卒論"
ここは、上の初回認証を終わった後に行う。 まず、「CLIENT_ID」と「CLIENT_SECRET」は「下準備2」で取得したものを入れる
#ref(): File not found: "クライアント登録2.png" at page "石井さん卒論"
実行するとurlの入力が要求されるので、「初回認証」で取得したurlを張り付ける
#ref(): File not found: "認証2.png" at page "石井さん卒論"
入力が成功すると、まず、自分のSpotifyアカウントにプレイリストが作成される
#ref(): File not found: "プレイリスト.png" at page "石井さん卒論"
また、プレイリストのurlを格納したcsvファイルが「data」の「created_playlists.csv」に保存される
#ref(): File not found: "プレイリスト2.png" at page "石井さん卒論"
これは、先ほど作成したcsvのurlをもとに、プレイリストが埋め込まれたhtmlを作成するコード
実行すると、作成されたプレイリストが埋め込まれたhtmlが「2.顔から感情推定用プログラム」の「static」の中の「楽曲」というフォルダにそれぞれの強度ごとのhtmlが保存される
#ref(): File not found: "作成されたhtml.png" at page "石井さん卒論"
表情から感情値を取得し、「1.プレイリスト作成プログラム」で作成されたプレイリストへ移動するコード 「2.顔から感情推定用プログラム」の中身は以下の通り
#ref(): File not found: "2の中身.png" at page "石井さん卒論"
「static」には「1.プレイリスト作成用プログラム」で作成されたプログラムが入っている。
「templates」にはhtmlの表示部分の「index.html」が入っている
「測定結果」には、表情から測定した各感情の確率が格納されているcsvファイルが保存される
「app.py」は実行プログラム
環境はPython 3.10.1で実行できました。ほかのバージョンでもできると思いますが、実行できなかったらpython 3.10.1でやってみてください
以下のモジュールをインストール。多分これでいけます。モジュールのインストールエラーが出たら適宜インストールする。
pip install flask==3.1.0 pip install deepface==0.0.93 pip install tensorflow==2.18.0 pip install tf-keras==2.18.0
コマンドプロンプトから「2.顔から感情推定用プログラム」の中の「app.py」を実行
学籍番号と名前を入力(測定結果のcsvファイルの名前を区別するためなので、何でもよい)
#ref(): File not found: "動作1.png" at page "石井さん卒論"
以下の画面になったら、ctrlボタンを押しながら「https:://127.0.0.1:5000」のところを押す
#ref(): File not found: "動作2.png" at page "石井さん卒論"
実行できたら以下のフロント画面が表示される。
この画面はカメラから移される画面と、画面の中の表情から推定したネガティブ強度が表示されている。また、その下には起動してからのネガティブ強度の平均値が表示されている。
#ref(): File not found: "動作3.png" at page "石井さん卒論"
「楽曲を表示」ボタンを押すと、ネガティブ強度の平均値に応じたサイトに別タブで移動する
左のランプは現在の人のストレス強度の段階(青なら低ネガティブ強度、黄色なら中ネガティブ強度、赤なら高ネガティブ強度)を表し、右のランプは音楽の持つ楽曲の特徴量の度合いを表す。
#ref(): File not found: "動作4.1.png" at page "石井さん卒論"
フロント画面の「終了する」ボタンを押すか、フロント画面のタブを閉じると測定終了。「測定結果」のファイルにcsvファイルが保存される。
「感情値(前)」の方は、フロント画面を起動してから「楽曲を表示する」ボタンを押す前(音楽を聴く前)までの各感情のスコアが保存されている。
「感情値(後)」の方は「楽曲を表示する」ボタンを押してからフロント画面を閉じる(音楽を聴いた後)の各感情スコアが保存されている
#ref(): File not found: "動作5.png" at page "石井さん卒論"
中身は以下のとおりである。1秒ごとの各感情の確率とネガティブスコアが格納されている
#ref(): File not found: "動作6.png" at page "石井さん卒論"
1分間のグラフの推移を作成するには、以下のプログラムを使う。このプログラムは、指定した分または秒ごとのネガティブスコアの平均値を計算するプログラムである
#ref(): File not found: "分析用プログラム.py" at page "石井さん卒論"
まず、pythonプログラムを起動すると分析するcsvを選択するダイアログが表示されるので、分析したいcsvファイルを選択する
#ref(): File not found: "分析プログラム1.1.png" at page "石井さん卒論"
次に、秒ごとの平均をとるか、分ごとの平均をとるかを選択する。秒ごとの平均の場合は0、分ごとの平均をとる場合は1を押す
#ref(): File not found: "分析プログラム2.png" at page "石井さん卒論"
選択したら、何秒ごとまたは何分ごとの平均をとるかを選択する。1分ごとの平均をとる場合は以下の通り
#ref(): File not found: "分析プログラム3.png" at page "石井さん卒論"
そうすると、選択したcsvファイルに選択した分ごとのネガティブ強度の平均値が表示される。以下は1分ごとの平均値をとった時の出力結果
#ref(): File not found: "分析プログラム4.1.png" at page "石井さん卒論"
ここからグラフの作成方法を説明する(excelの場合)。まず、計算したネガティブ強度をドラッグする。
#ref(): File not found: "分析プログラム5.1.png" at page "石井さん卒論"
ドラッグした状態で「挿入」→「散布図(直線とマーカー)」を押す。
#ref(): File not found: "分析プログラム6.3.png" at page "石井さん卒論"
出来上がり。グラフの色や書式は自分で選択したください
#ref(): File not found: "分析プログラム8.png" at page "石井さん卒論"
おわり