蛇ノ目の記

技術のことも。そうでないことも。

pyhack冬山合宿に行ってきた - SpotifyチャートにTF-IDFを使ってみた話(概要編)

1/19(金)~1/21(日)にかけてpyhack冬山合宿に行ってきた。

気づいたらもう3月。記事を書くのがかなり遅れてしまった。

pyhack.connpass.com

@takanoryによるTogetterまとめはこちら。Python mini Hack-a-thon 雪山合宿 2019 - Togetter

昨年はsiraphのライブがあったので2日目の昼に帰ってきたんだけど、今年は3日間通しで参加した。

合宿でやったこと

Spotifyのチャートに対して、文書の特徴量を求めるのに使われるTF-IDFを使って国ごとに特徴的な曲を分析してみる、ということをやってみた。

グローバルチャートに対する国ごとにユニークな曲を抽出するなら、グローバルチャートと各国チャートの差集合を取るだけでいいのでは、という向きもあると思うけど、まあ思いつきでやったことなので多めに見てほしい。

Spotify Charts

Spotify Chartsでグローバル・各国の人気曲チャートが公開されている。チャートには以下の2種類がある。

  • Top 200: ストリーミング数による集計。上位200曲が公開されている。

  • Viral 50: SNS上での人気を基にした集計。上位50曲が公開されている。

Viral 50の集計に関しては以下のフォーラムで議論されているが、おそらくソーシャルメディアを分析したものとのこと。

https://community.spotify.com/t5/Content-Questions/Viral-50-Playlists-How-do-they-work/td-p/1627778

今回は2種類のチャートそれぞれを対象とした。

データの取得

前回の記事で紹介したSpotify APIではチャートの取得ができないため、Spotify Chartsを使うことにした。

Spotify Charts Top200, Viral 50のWebページをスクレイピングしてチャートを取得した。

URLはTop 200ならhttps://spotifycharts.com/{{ country code }}/, Viral 50ならhttps://spotifycharts.com/viral/{{ country_code }}/とシンプルな作りになっているのでスクレイピングが容易。

{{ country_code }}ISO 3166-1 alpha-2 - Wikipediaに基づいている。ただし、グローバルチャートの場合はglobalとなる。

国によってはTop 200やViral 50が取得できない場合がある。このとき、レスポンスヘッダに'Content-Encoding'が含まれる。これを考慮しておかないとチャートの取得でコケるので注意が必要。

TF-IDF

TF-IDFは文書の特徴量として使われる指標。文書中に出現する単語の重要度を評価できる。

TFとIDFは以下のように説明できる。

  • TF(Term Frequency): 文書dにおける単語tの出現頻度

  • IDF(Inverse Document Frquency): 逆文書頻度。この値が高ければ単語tの出現頻度が低いということになる。

TF-ICF

TF-IDFが文書の特徴量なら、今回考えるのはトラックの特徴量だろうということで、TF(Track Frequency), ICF(Inverse Chart Frequency)と呼び替えることにする。


実際のコードの話は別の記事で。