Skip to content

Instantly share code, notes, and snippets.

@yayoimizuha
Last active December 17, 2022 15:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yayoimizuha/aafcdcfa34537358e146a4312652fb38 to your computer and use it in GitHub Desktop.
Save yayoimizuha/aafcdcfa34537358e146a4312652fb38 to your computer and use it in GitHub Desktop.
Hello! Project Advent Calender 2022 - ハロー!プロジェクトのデータをコンピュータで処理したい。

こちらの記事は『もっとハロブロを読まれたい!ハロヲタブログ Advent Calendar 2022』12/17の記事になります。
書いた人間は@yayoi_mizuha , @hello_counter.<-間違い指摘お待ちしております。
ブログ形式のはずがかなり技術メモっぽくて脈絡のない文章になってしまいましたが、許してください。
※ここで使ってるコードはGitHubで公開してます。オレオレコードなので使い方はTwitterのDMなりで聞いてくださいな

ハロー!プロジェクトのデータをコンピュータで処理したい。

これはオタクあるあるだと思うんですが、推しについての情報を収集してまとめたくなりますよね。
でも、ハロメンは67人いて、既卒を含めたら200人以上もいます。曲に至っては概数さえはっきりしないくらいの量があります。大量のデータを手作業で管理するのは本当に大変ですね。 このスクショには研修生もいます。 👆現役ハロメン(研修生含む)のアー写をダウンロードしてきた例
こういう作業を手作業でやるのはあまりにも大変すぎますし(<-信仰心が足りない)、自分が何らかの理由で出来なくなったときに時間のかかる作業を代わってくれる誰かがいる保証もなくて継続性がないです。
ということでコンピュータにやらせて自動化しましょう。プログラムを実行させるだけなら続けやすいしノウハウの引継ぎも要らず、継続性が上がるだろうということです。定義を知りませんがやっていることは別にデータサイエンスというほどではないです。

👇自分が今のところ自動化してるもの。

  • iTunes APIから曲の情報を取得する。
  • YouTube Data API v3で公式MVとかの情報を取得する。
  • Hello!Project,UpFront Works公式サイトからいろいろ(リリース情報とか)取得する。
  • Amebloからブログテキストやブログ画像を取得する。

❄※自分がやってるのはほとんどデータ収集の部分だけなので、この集めたデータを使ってできるものを思いついた方がいれば積極的に教えてください!❄

構造化データについて

Excelで作った表などが典型的ですが、構造化データはどの位置のデータがどういう意味を持つデータなのかはっきりしたデータです。一般的にコンピュータで処理するのが楽なデータ形式です(作る方は大変だけど)。 image
これは自分が作ったわけではなくて、ここからお借りしました☝

iTunes APIを使ってみる

ほかにもよく使われる構造化データとしてjsonフォーマットというのがあります。iTunes APIでは、このjsonフォーマットを用いてデータが提供されます。以下はiTunes APIから真野恵里菜さんの"My Days for You"の情報を所得した例です。
※アップフロント傘下の企業からリリースされた曲のタイトルとアーティスト(任意)を指定すると以下のようなデータを取得できるツールを作っていて、より皆さんに使ってもらいやすい形のものを今後制作する予定です。

{
  'artistId': 292305431,
  'artistName': '真野恵里菜',
  'artistViewUrl': 'https://music.apple.com/jp/artist/%E7%9C%9F%E9%87%8E%E6%81%B5%E9%87%8C%E8%8F%9C/292305431?uo=4',
  'artworkUrl100': 'https://is2-ssl.mzstatic.com/image/thumb/Music/f6/12/5c/mzi.dapttxgj.jpg/100x100bb.jpg',
  'artworkUrl30': 'https://is2-ssl.mzstatic.com/image/thumb/Music/f6/12/5c/mzi.dapttxgj.jpg/30x30bb.jpg',
  'artworkUrl60': 'https://is2-ssl.mzstatic.com/image/thumb/Music/f6/12/5c/mzi.dapttxgj.jpg/60x60bb.jpg',
  'collectionCensoredName': 'My Days for You - Single',
  'collectionExplicitness': 'notExplicit',
  'collectionId': 444079460,
  'collectionName': 'My Days for You - Single',
  'collectionPrice': 764.0,
  'collectionViewUrl': 'https://music.apple.com/jp/album/my-days-for-you/444079460?i=444079465&uo=4',
  'country': 'JPN',
  'currency': 'JPY',
  'discCount': 1,
  'discNumber': 1,
  'isStreamable': False,
  'kind': 'song',
  'previewUrl': 'https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview115/v4/3f/fa/6c/3ffa6c50-725f-f94b-dc6a-d07562473073/mzaf_16096037565694564383.plus.aac.p.m4a',
  'primaryGenreName': 'J-Pop',
  'releaseDate': '2011-06-29T12:00:00Z',
  'trackCensoredName': 'My Days for You',
  'trackCount': 3,
  'trackExplicitness': 'notExplicit',
  'trackId': 444079465,
  'trackName': 'My Days for You',
  'trackNumber': 1,
  'trackPrice': 255.0,
  'trackTimeMillis': 265907,
  'trackViewUrl': 'https://music.apple.com/jp/album/my-days-for-you/444079460?i=444079465&uo=4',
  'wrapperType': 'track'
}

表敬式ではないですが、これもコンピューターで処理しやすいようになっていて、
アーティスト名は真野恵里菜で、
このアルバムのサムネイルは https://is2-ssl.mzstatic.com/image/thumb/Music/f6/12/5c/mzi.dapttxgj.jpg/1000x1000bb.jpg で、
アルバム名は「My Days for You - Single」で、
値段は764、通貨は日本円、
発売された国は日本で、
ディスクが1枚あるうちの1枚目に収録されていて、
3曲あるうちの1曲目で、
サブスクでは聞けない、
ジャンルはJ-Popで
リリース日は2011年6月29日午後零時(世界標準時)、
(↑末尾にZがついていると世界標準時を示すとISO規格で決まっています)
楽曲1つだけ購入する場合は255円、
長さは265907ミリ秒(つまり4分と26秒弱)である、
ということなどが書かれています。

YouTube Data API v3

YouTubeが公式に提供しているサービスでiTunes API同様jsonフォーマットを用いてデータが提供されます。YouTube Data API v3は有名で、いろいろな人が書いているので詳細は割愛します。各自ググってください。
自分の作ったものの中では、Twitterと、ウェブページで、ハロプロその他グループの動画の再生回数のブログを表示するシステムに使っています。

ここまではそんな難しくない処理で、特に新規性があるわけでもないです。

非構造化データについて

身も蓋もない言い方をすれば、構造化データ以外のことです。
一般的にデータ作成者が、機械で処理したりデータ処理をすることを想定せずに作ったものであることが多いです。ハロプロ関連の例だと、ブログの投稿とか、公式YouTubeの概要欄、アップフロント&ハロー!プロジェクトのプレスリリースのページなどがそれにあたると思われます。自分で分類し直さないといけないので当然に面倒ですがその代わり使えるデータ量は大きく増やせます。 image 引用元 👆ブログは各々が自分の名前をテーマに設定しているようですが、かなりの数がほかのメンバーとのツーショットだったりほかの人・ペットの画像だったりして、テーマを基準に画像を分類するのは無理があります。

image ということで、👆こんなふうに画像を全部落としてきます。ファイル名からどのブログのどの画像か1対1でわかるような名前を付けて保存されるようにするのがコツです。 image 👆テーマ名、ブログの名前、投稿ID、投稿内の画像の番号がわかるようになっています。
これらの画像から顔を検出してくり抜き、傾きを補正します。これにはGoogle製のMediaPipeにあるBlazeFaceを2度使っていて、1回目で顔と顔器官の位置を検出して、2回目で1回目にうまく傾きを補正できなかった画像をさらに補正しています。処理時間は1回の時に比べて2倍ほどかかってしまいますが、かなり正確にくり抜くことができたので、この方法を採用しています。 image 👆傾いていた画像が補正されて、端が白くなっていることがわかります。(検出の感度が高いのはうれしいけれど、絵文字とかイラスト?まで認識してしまっていたり、ペットが映り込んでいたりする。何か自動で削除する方法を模索中。)

image 👆くりぬいた顔画像をFaceNetを使って特徴量を抽出し、NearestNeighbors法でマンハッタン距離(←やってみた感じユークリッド距離より精度高かった。)を用いて似ているものを順に150件集めることができます。RAPIDSAIの開発しているcuMLライブラリを使うことで、GPUを使ってかなり高速化をしています。くりぬいた顔画像そのままでは、いろんな人が混じっていて手間がかかります。これで全部分類することはできないのですが似た画像を集めることができるのでだいぶ作業が楽になります。
細かくは決めてないのですがこれである程度仕分けをした後に、ファインチューニングしてハロメンの顔を判定するモデルを作れたらいいなとか思ってます(あまり詳しくないのでできるとは言ってない。データセット渡すからだれかやってくれ)

ブログテキストについて

いまのところ何もしていないけれども、ブログテキストからハロメンの言及を拾って、誰とのつながりが深いのかとか統計取れたら面白そうだなと思ってたりします。いつかやるかも。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment