こんにちは!
いきなりですが自己紹介します。
わたしはハコサトといいます。音楽の歌詞を見るのが好きです♪ 最近好きな作詞家さんは秋元康さんです。
さて去年こんな記事を書いたところ、たくさんのボカロリスナーさんに見ていただきました♪
知らない曲たくさんあって、世の中はすごく広いなぁって実感したのでした。
ぜんぜん接点のなかったボカロクラスタのみなさんに声かけていただけたのもうれしかったです!
それもなんと1年も前。今年もその季節がやってきました。
というわけで、今年も「#2016年ボカロ10選」を集計してみました!
よろしくお願いします!!
Twitterのボカロクラスタのみなさんの間では、毎年年末(か年始)に、年号の付いたハッシュタグで、好きな曲を10曲紹介する文化があります。
今年なら「#2016年ボカロ10選」です。
それを追いかけていくと今年クラスタのみなさんの心をつかんだ曲たちがわかってきます。
でも、みんなてんでに紹介しているので、(紹介文のものすごい熱量はうんと味わいがいがあるとはいっても、)ほんとうにボカロクラスタのみなさんに人気の曲がどれなのかはわかりません。
こんなときにはどうしよう…。
…そうだ! 集計すればいいんだ!
というわけで、安直なわたしは、今年も集計業務にいそしんだのでした。
なお、集計業務に使うツールはすべて一新しました! これで来年も(あるていど)使い回せるはず!
いまから段取りをご紹介しますが、結果だけ見たい向きはどうぞ気兼ねなくスクロールしてください♪
だんどり!!
- ステップ1.ツイートを収集
- ステップ2.リンクを集める
- ステップ3.数を数える
- ステップ4.表にする
ステップ1.ツイートを収集
前回は、アタマのいい収集はいっさいせず、力で解決したのですが、今回はAPIを活用しました。
Tweepyを使ってTwitter REST APIを活用しています。
Twitterの検索、古いツイートはヒットしなくなっちゃいますが、今回は最大でも直近1ヶ月程度ツイートしか収集しないため、とくに弊害はないと判断しました。
3〜7日程度の間隔を開けながら、数回にわたってツイートを収集して、ローカルにテキストファイルとして保存しました。
12月25日にも収集してる履歴がある…。わたしはなにをしていたんだろう……。
合計951ツイートを収集しました。これは前回(345ツイート)の3倍近くです!
ステップ2.リンクを集める
今回も前回と同様、ニコニコ動画へのリンクだけを集計対象としました。
ニコニコ動画へのリンクは、ここでは2種類あります。
- 動画への直接のリンク(「sm〜(数字)」が含まれる)
- マイリストへのリンク(「mylist」が含まれる)
ここではどちらも対象としました。
ハッシュタグの名前「#2016年ボカロ10選」ですが、数は10を超えても特に制限しませんでした。
ステップ3.数を数える
今回は、前回と少し方針を変えました。
- 同じひとが複数回Twitterで言及している曲は、1票。
- 違うひとが同じ曲にTwitterで言及していたら、もちろん別の票。
- 同じひとが複数回Twitterで言及しているマイリストは、1票。
- 別のひとが同じマイリストにTwitterで言及していたら、数えない。
こうしました。
たったひとつのマイリストのうちのひとつとして載っているだけの曲、マイリストURLがTwitterで言及されるたびにカウントされると実感と合わないと考えたのでした。
ステップ4.表にする
こうして今回も無事に集計することができました。
Twitterの情報を集計して処理をしているけど、1回あたり10分ぐらい時間がかかるのつらみ…。 pic.twitter.com/iKVcElz5yn
— ハコサト (@hacosato) 2017年1月9日
途中で泣いたりしたこともあったけど、それもいまはよい思い出です!!
異なり曲数は872曲、総票数は1189票でした。
票数が3以上の曲をまとめました。ではどうぞ!
(いかりゃく!)
というわけで、今回一番票を集めたのは、saiB『パイロキネシス』でした!
わたしは知らなかった曲です…。世界はあいかわらず広い…。
聴いてみるとコード進行もメロディも拍子も予想と少しちがう風に動くのに、それなのに、なんかぜんぜん不愉快な感じが出なくて、っていうか逆にすっごく気持ちいいですね〜〜!!
わたしがボカロクラスタのみなさん好きそう!って思ってたバルーン『シャルル』は4番めでした。
すごくいいの! ボカロ感うすいよね、おしゃれなJ-POPっぽさあるよね。
ご本人歌唱Ver.もめっちゃかっこいいから聴いてほしい!! バルーンさんもっとたくさん歌ってくれないかな…。
話題を少し変えて、ランクインした中で一番再生数が多かったのはDECO*27『ゴーストルール』でした。
この曲は2016年のボカロ界のトレンドをがんがん更新していったバケモノです(ゴーストだけに!)。
たくさんおしゃべりしたいことがあるのですが、この曲の音韻については前に文章を書いたことがあるのでとりま読んでほしいです!
hacosato.hatenablog.com
おまけ
投稿者別でも集計とってみました!
こういう結果でしたよ♪
票数 | 投稿者 |
---|---|
16 | 稲葉曇 |
15 | saiB |
15 | カルロス袴田 |
14 | ナユタン星人 |
13 | バルーン |
12 | koyori |
12 | 八王子P |
12 | みきとP |
12 | ポリスピカデリー |
11 | Neru |
10 | 松傘 |
10 | ピノキオピー |
9 | DECO*27 |
9 | しじま |
9 | Clean Tears |
8 | みやけ |
8 | Haniwa |
8 | 鈴鳴家 |
8 | ぽて |
8 | かぴるす |
7 | はるまきごはん |
7 | ハヤブサ |
7 | EZFG |
7 | 小菅こんにゃく |
6 | 23.exe |
6 | りゅーりゅー |
6 | anomimi |
6 | こんにちは谷田さん |
5 | ein |
5 | mayrock |
5 | ΩBAKE |
5 | きくお |
5 | 岩見陸/ナナホシ管弦楽団 |
5 | Orangestar |
5 | 勝也 |
5 | HaTa |
5 | \*Luna |
5 | さまぐら |
5 | Mwk / みわく |
5 | yeahyoutoo |
5 | (「・ω・)「 |
4 | とおる |
4 | mint*(薄荷キャンディP) |
4 | 12uck |
4 | よの |
4 | クロワッサンシカゴ |
4 | ムシぴ |
4 | たま |
4 | ryo |
4 | ウインディー |
4 | ニックネーム |
4 | しめさば |
4 | nowhere man |
4 | 瀬名航 |
4 | ねこむら(cat nap) |
4 | YASUHIRO(康寛) |
4 | talaw |
4 | nadauyu |
4 | キノシタ |
4 | 和田たけあき |
4 | Bau |
4 | Jille. |
4 | samayuzame |
4 | tilt |
4 | 名無し |
4 | ぴぼ |
4 | 有機酸 |
4 | Task |
4 | ハヤシケイ / KEI |
3 | ぐらんびあ |
3 | HATOKO/窓助 |
3 | ねじ式 |
3 | ぬゆり |
3 | regulus |
3 | Bernis |
3 | 廻転楕円体 |
3 | れるりり |
3 | なぎさ |
3 | コトバ*ユキ(archuk) |
3 | うぽつ絶対殺すマン |
3 | 青屋夏生(アオヤナツキ) |
3 | amahisa |
3 | おあ |
3 | NIYMORIY |
3 | daniwell |
3 | Daphnis |
3 | 田中 尾為 |
3 | thommofonia |
3 | nanami |
3 | halyosy |
3 | RUBY-CATMAN |
3 | n-buna |
3 | あえる |
3 | mie |
3 | 物煎餅 |
3 | はるふり |
3 | ジグ |
3 | 大丈夫P |
3 | 5u5h1 |
3 | 前略 |
3 | Torero |
3 | 土山時雨 |
3 | tekalu |
3 | 164 |
3 | AVTechNO! |
3 | ashcolor |
3 | 雄之助 |
3 | 平田義久 |
3 | 鼻そうめんP |
3 | WAHIKO |
3 | 梨本うい |
3 | Omoi |
3 | yamada |
(いかりゃく!)
1位は稲葉曇さんでした。はじめて曲聴いた! これはアレだ、高校の文化祭や大学の学園祭で、教室の一角から流れてるタイプの音楽じゃん!!
4曲に分かれて幅広い層で票を獲得しました。
同率2位はsaiBさんとカルロス袴田さん。このおふたりは割と一点突破で人気を集めているので、今回の上位層は人気の傾向がちがうとわかりますね♪
おまけ2
今回も集計に使ったPythonスクリプトを公開しておきます。
こんなでよければ、追試などにお役立てください♪
Twitterからツイートを収集してテキストファイルに保存。
>|python|
import tweepy
CONSUMER_KEY = 'わわわ〜〜'
CONSUMER_SECRET = 'わわわ〜〜'
ACCESS_TOKEN = 'わわわ〜〜'
ACCESS_TOKEN_SECRET = 'わわわ〜〜'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
with open('パスを入れる.txt','a') as fout:
for tweet in tweepy.Cursor(api.search, q='#2016年ボカロ10選').items():
print({"id":tweet.id, "user_id":tweet.user.id, "screen_name":tweet.user.screen_name, "text":tweet.text}, file = fout)
|
テキストファイルを読み込んで集計して表示。
import re import json import feedparser from urllib.request import urlopen from collections import defaultdict from bs4 import BeautifulSoup as soup import time # リストから重複を取り除いてリストを返す。 def uniqlist(li): uniqed = [] for x in li: if x not in uniqed: uniqed.append(x) return uniqed def getnicoinfo(url, attr): from urllib.request import urlopen from bs4 import BeautifulSoup as soup try: url = "http://ext.nicovideo.jp/api/getthumbinfo/" + url.split("/")[-1] return soup(urlopen(url), "lxml").find(attr).string except: return url # 短縮されたURLを元に戻す def expandurl(url): from urllib.request import urlopen try: expandedurl = urlopen(url).geturl() if url == expandedurl: return url else: return expandurl(expandedurl) except: return url # 時間を計測 start = time.time() # 事前にテキストファイルを加工しておく。 # シングルクオートをダブルクオートに変更し、アポストロフィを手動で検索して戻す(world'sっていうところ)。 with open('パスを入れる.txt','r') as fout: tweets2json = json.loads(fout.read()) # 重複するツイートがあるので、それをなくす。 uniqtweets = uniqlist(tweets2json) # 短縮されたURLを元に戻しつつ、TwitterユーザーIDと動画URLだけの辞書のリスト(urllist)にする。 smlist = [] mylistlist = [] for x in uniqtweets: try: urltext = expandurl(re.search(r"(https?://\S+)", x["text"]).group()) except: urltext = "none" # URLがマイリストだったら、mylistlistにURLをappend if re.search(r"mylist", urltext): mylistlist.append(urltext) # URLがマイリストでなかったら(動画だったら)、ツイートした人の名前とURLを辞書にしてappend else: smlist.append({"screen_name": x["screen_name"], "url":urltext}) # smlistから重複をなくす。同じひとが複数回同じ曲をツイートしたのが1カウントになる。 urllist = [x["url"] for x in uniqlist(smlist)] # mylistlistから重複をなくす。ちがうひとが同じマイリストをツイートしたのが1カウントになる。 mylistlist = uniqlist(mylistlist) for urltext in mylistlist: urltext = urltext + "?rss=2.0&lang=ja-jp" # RSSを読むのはBeautifulSoupでもできるみたいだけど、feedparserのほうがカンタンみたい。 doc = feedparser.parse(urltext) # mylistに入っている曲をurllistにappendする。 # mylistlistとsmlistが統合される。 for entry in doc.entries: urllist.append(entry.link) # ここでurllistはただのurlだけのネストのないリスト。 # URLの数を集計(ここでTwitterユーザーIDの情報はなくなる)。 urlcountdict = defaultdict(int) for item in urllist: urlcountdict[item] += 1 # 結果をlistにまとめる。 # がんばれば1行に収まるけど、見づらいので分割。 urlcountlist = [] for url, counter in urlcountdict.items(): try: doc = soup(urlopen("http://ext.nicovideo.jp/api/getthumbinfo/" + url.split("/")[-1]), "lxml") title = doc.find("title").string view_counter =doc.find("view_counter").string user_nickname = doc.find("user_nickname").string urlcountlist.append({"url":url, "counter":counter, "title": title, "view_counter": view_counter, "user_nickname": user_nickname}) except: urlcountlist.append({"url":url, "counter":counter, "title": "error", "view_counter": "error", "user_nickname": "error"}) urlcountlist = sorted(urlcountlist, key=lambda x:x["counter"], reverse=True) # 所要時間を表示 elapsed_time = time.time() - start print ("elapsed_time:", elapsed_time, "[sec]")
おしまい。
今回はコアなボカロクラスタのみなさんのおすすめ曲をまとめたかたちになります。
コアな人たちは語りもわたし大好きです!
shirobanasankaku.hatenablog.com
しろばなさんの語りは今年も頭おかしい!!(だいすきです)
ところで、一般のひとたちも視野に入れてどれが人気かを知るのだったら、再生数のランキングが頼りになります。
2016年の年末にわたしが書いた記事があるので、よければ合わせて読んでください!
hacosato.hatenablog.com
スクレイピングはすごいスキルがなくても(とりあえずは)できるので、プログラミング初心者(たとえばわたし)にとってもオススメです。
Pythonという言語を使うなら最近出たばかりのこの本がすごくいいです♪
今回は使わなかったけど、Scrapyっていうフレームワークが超絶便利っぽいので、それを使うともっとすごいことがもっとカンタンにできそう! さいこう! みんなこの本読んでお勉強しよう!Rubyという言語を使ってスクレイピングするならこの本もめっちゃ好きです!
去年まではわたしもこの本を使ってお勉強していました。
Pythonに乗り換えたのはPython原理主義者さまにお会いしたからというだけの理由なので、Rubyでスクレイピングするのもとってもいいと思います!
こっちのほうが本が小さくてかわいいです♪(両方持ってる)
そんな感じできょうはおしまいです。
今年もボカロ業界が楽しくありますように。
次回は乃木坂46『サヨナラの意味』の歌詞について書きます!