Edited at

Qiitaの「いいね」がダメならば

最近、Qiitaの記事の品質低下に関する議論記事やネタ記事を見かけます。真面目な話をすれば、「品質」は、顧客の評価で決まるものです。つまり、人によって基準が違うもの。例えば記事で言うと、初心者が満足する記事と、上級者が満足する記事は違います。そのため、品質が高い/低いなどとは一概には決められません。

でも今問題視されているのはそういうレベルの話ではなく、単純に「記事の内容が正しくないこと」のように見えます。「正しさ」を二の次にして、注目を浴びやすい記事を書く人が増えたのでしょう。自分が「いいね」を押しても損する人はいませんから、目を引くわかりやすいタイトルを見てなんとなく「いいね」を押す人も多いと思います。

個人的には人が増えればそうなるのも自然な話だと思いますし、それに対するQiitaでお金が稼げるなら質の高い記事がもっと増えるのではないかという提言などの議論は面白いのですが、結果的に議論・ネタ記事ばかりがトレンドに載り、「プログラミング」というサイトの本質からズレてしまっているのは少し違う気がします。


Qiitaの「いいね」がダメならば

もはやQiitaのトレンド、つまり「いいね」の数だけで記事を評価するのは難しい。それならば、「いいね」以外の尺度を見てもいいんじゃないか?ということで、今回は実験的に、「Twitterのリツイート数」に注目してみました。

リツイートするには、「いいね」よりも強い、「フォロワーに共有したい」という意志が必要です。つまり、リツイート数が多い記事は、「みんなに見てほしいぐらい良記事」か「みんなに晒すべきほどのダメ記事」に偏るのではないか?という仮説が立てられます。さらに問題のある記事は周りの反応を見れば初心者でもすぐわかるので、結果として良記事を拾える。かもしれない。

※ちなみに最初は、リツイート数ではなく単純に記事がツイートされた数で集計しようかと考えたのですが、単発ツイートのみで拡散される記事はそうそうないでしょうし、敢えてシンプルにリツイートに絞りました。


作ったもの



Qiitaの人気ツイートをリツイートくん

Qiitaの記事URLを含むツイートのうち、リツイート回数が多いツイートをリツイートします。基準となるリツイート回数については暫定で100回として作りました。ざっくりこんな感じ。

■リツイート対象の条件

・Qiitaの記事URLを含む

・100回以上リツイートされている

・直近7日間以内に1回以上リツイートされている

※以下は対象外

・このbotが既にリツイート済み

・Qiitaの記事がサスペンドされている

・Qiita公式のツイート(トレンドに寄りそうなので)


作り方

シンプルにTwitter APIを利用しました。

やってることはすごく大したことないですが一応書きます。

Standard search API


Search APIの呼び出し

tweepyなどのパッケージを使ってもいいのですが、大した内容でもないので地道にやってみます。基本はこのあたりにわかりやすく書かれています。

Pythonでサクッと簡単にTwitterAPIを叩いてみる

ただし、検索対象に合わせてパラメータを指定しています。

    params = {

'q': 'qiita.com',
'lang': 'ja',
'count': 100, # 最大取得件数(max100)
'since': 'YYYY-MM-DD(7日前)', # FROM
'until': 'YYYY-MM-DD(当日)', # TO
'since_id': XXXXXXXXXX, # 最小ツイートID
'max_id': XXXXXXXXXX, # 最大ツイートID
}

これで、since 〜 until の期間のツイートのうち、IDが since_id 〜 max_id の間のツイートを取得できます。引っかかりやすい(直感的ではない)と感じたポイントは2点。

①Search API は新しいツイートから順に取得する

直感的には古い順に取得していきそうな気もしますが、新しい順です。

また、1回の最大取得件数が100件なので何度も取得を繰り返すのですが、「max_id」には「前回取得時の一番古いツイートのID -1」を指定してあげる必要があります。

例えば1回目に取得したツイートIDが:999 〜 900 だった場合、2回目の取得時の「max_id」は899にします。

②countを100にしても1件のときもある

countは1回の最大取得件数なのですが、100にしたからといって毎回100件取得できるわけではありません。90件だったり80件だったり、まちまちです。最初の数回は100件取得できても、後半は1件ずつということもよくあります。件数に応じて処理を行う際は気をつける必要があります。


リツイート情報の取得

今回は「7日間以内にリツイートされたツイート」を対象とします(7日間:Twitter Search APIの無料枠)。7日以上前のツイート情報であっても、7日以内にリツイートされていれば取得できます。

Twitter API で取得できるツイートオブジェクト(Tweet objects)は、リツイート情報も入れ子の形で含むようです。

参考:Twitterリツイートに関するJSONについてまとめる

from requests_oauthlib import OAuth1Session

import json

twitter = OAuth1Session(CK, CS, AT, AS)
SEARCH_URL = 'https://api.twitter.com/1.1/search/tweets.json'

# ツイート情報を取得
res = twitter.get(SEARCH_URL, params=params)
tweets = json.loads(res.text)

# 取得したツイート毎に処理
for tweet in tweets['statuses']:
if 'retweeted_status' in tweet:
retweeted = tweet['retweeted_status'] # 公式リツイート情報(引用リツイート情報は 'quoted_status')
id = retweeted['id'] # ツイートID
retweet_count = retweeted['retweet_count'] # リツイート情報
・・・


サスペンドされた記事を対象外にする

ツイートを取得してみると、サスペンドされた記事のツイートが取得されることがありました。見れない記事をリツイートしても仕方ないので、対象外にすることにします。

Python3でURLが存在するかを確認する方法で記事が存在しない場合はリツイート対象外にします。本当はQiitaのAPIなど呼べばいいのかもですが。


結果

作成時のポイントはこんなところなので、最後に実際に動かしてみた結果も残しておきます。とりあえず直近の7日間で対象となったリツイートのうち、リツイート数が上位のものを並べてみます。

一応、集計時点におけるQiitaの「いいね」数とTwitter上のリツイート数も合わせて書いておきます。

1位

Twitter:291 リツイート

Qiita:653 いいね





「会社を休む」というおふざけとプログラミングの真面目さのギャップが良い感じの記事。みんなの休みへの欲求がリツイートさせたのかな。




2位

Twitter:235 リツイート

Qiita:1273 いいね



AtCoderというプログラミングのコンテスト?に関する記事。




3位

Twitter:192 リツイート

Qiita:30 いいね



Vtuberになるための情報を集めた記事。あまりプログラミングっぽくはないですが、多くの人が興味を持ちそうなテーマです。




4位

Twitter:169 リツイート

Qiita:23 いいね



「数独」をプログラミングで解いている記事。数独やったことないのでよくわかりませんが、凄いのかな。




5位

Twitter:149 リツイート

Qiita:23 いいね



僕の記事ですみません。

(ちなみにツイートしてくれてるのは知らない方)




6位

Twitter:144 リツイート

Qiita:211 いいね



深層強化学習のアルゴリズムたちをまとめた記事みたいです。読んでないけど凄そうですね。




7位

Twitter:120 リツイート

Qiita:63 いいね



VRChat関連記事です。こちらもVtuber記事同様プログラミングっぽくはないですが、楽しそう。




8位

Twitter:117 リツイート

Qiita:838 いいね



学ぶべき言語系の記事。個人的にはタイミングや環境で大きく変わると思うので強引に言い切る必要はないと思いますが、初心者の指標としては良いのかもですね。




9位

Twitter:109 リツイート

Qiita:677 いいね



オブジェクト指向入門記事。こちらも初心者向けの記事のようです。すごく長い。


良記事とダメ記事に偏ったか?

結果を見て感じたことをまとめます。大きく3つあります。

①ダメ記事には偏る

記事が公開停止されていたので上に載せてはいませんが、数だけで言うと、最近議論の対象になっていたヤバい記事が、実は最もリツイート数が多かったです。やはり、みんなにヤバさ・怖さを共有したいという思いがリツイートを呼び、大きな偏りを生んでいました。

②エンジニア以外にウケる記事にも偏る

一方で、良記事と言っていいのかはわかりませんが、難易度によらず、便利なもの・面白いものを作った記事が多く選ばれている印象も受けました。簡単に言うと「エンジニア以外にもウケる記事」でしょうか。Twitterはエンジニア以外が大半なので、一般向けにも楽しめる内容が拡散されるのは当然と言えば当然ですが。

③Qiitaの「いいね」とTwitterの「リツイート」は比例しない

面白かったのはここですかね。やはりQiitaとTwitterはユーザ層が違うからか、「良い」とされるものが違うようです。各記事の全リツイートを合計したら結果は多少違うかもしれませんが、大枠は変わらないでしょう。


あとがき

結果的に、そこまで有用なフィルターにはなりませんでしたが、「大衆にウケる記事」という意味で参考程度には楽しめるものになったかなと思います。

逆に言えば、「エンジニアにウケる情報」や、「正確な情報」を求めている人は、世間の「いいね」や「リツイート」などは気にせず、小規模でも純粋なエンジニアが集まるコミュニティに入ったり信頼できる人をフォローするのが良いのでしょう。幅と深さを両方求めるのはなかなか難しい気がするので。

ということで、みなさんトレンドなんて気にせず作りたいものを作りましょう。




何かあればTwitterまで。

いい記事だったよ!と思ってくださった方は、PayPayで好きな金額を投げ銭してみてもいいよ!

PayPayID:yossymura