1/19(金)~1/21(日)にかけてpyhack冬山合宿に行ってきた。
気づいたらもう3月。記事を書くのがかなり遅れてしまった。
雪国。宿に到着。 #pyhack pic.twitter.com/lPQQ65bvVJ
— nao_y (@NaoY_py) 2019年1月18日
@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)と呼び替えることにする。
実際のコードの話は別の記事で。