記事がどれだけバズるかを投稿前に判定する

以下は[How to predict likes and shares based on your article’s title using Machine Learning](https://medium.freecodecamp.org/how-to-predict-likes-and-shares-based-on-your-articles-title-using-machine-learning-47f98f0612ea)の日本語訳です。

# How to predict likes and shares based on your article’s title using Machine Learning

記事に対して良いタイトルを付けることは、ライティングの重要な要素のひとつです。
より興味をそそるタイトルであるほど、読者が記事を目に入れるチャンスも高まります。
さらに、彼らの好みに合う記事を提供することで、読者はより満足します。

この研究は、私の[機械学習ナノ学位](https://udacity.com/course/machine-learning-engineer-nanodegree--nd009)専門コースの最終プロジェクトとして始めたものです。
この研究をやりとげ、私は今誇りと満足感に包まれています。
プロジェクトの完遂後に記事を投稿すると[Quincy Larson](https://medium.com/@quincylarson)と約束していたので、研究の道中において気付いた知見を共有したいと思います。

最終的なレポートについては[PDF](https://github.com/flaviohenriquecbc/machine-learning-capstone-project/blob/master/final-report.pdf)を確認ください。
コードを試してみたいときは[ipynb](https://github.com/flaviohenriquecbc/machine-learning-capstone-project/blob/master/title-success-prediction.ipynb)をチェックするか、[GitHub](https://github.com/flaviohenriquecbc/machine-learning-capstone-project)からforkしてください。
この記事では専門用語を排除し、一般向けの解説を行います。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/26088/29766ca0-91fe-99ca-299d-0b9af63652e9.png)

現在、アイデアを拡散するために最もよく使われているプラットフォームのいくつかは、TwitterとMediumです。
Twitterでは、通常、外部URLとタイトルだけの内容が投稿され、ユーザはその記事にアクセスして元の投稿にいいねやリツイートを行い、興味を示すことができます。

Mediumでは、記事を分類するためのtagと、ユーザがコンテンツにどれくらい満足したかを表すclapを記事詳細に表示しています。
この2プラットフォーム間の相関関係は、我々に貴重な情報をもたらします。


## The project

私が取り組んだ問題は、教師付き学習を使った分類タスクでした。
その記事が獲得するお気に入りやリツイート数を、タイトルに基づいて予測するというものです。

Twitterのいいねとリツイート数をMedium記事と相関させるということは、読者数とclap数を切り分ける試みということです。
異なるプラットフォームで共有されるほど、より多くの読者まで届き、より多くのMediumのclapを受け取ることになる、と予想されるからです。

Twitterの統計だけを使うと、最初に読者の目に届く数は記事によって変わりません(要するにfreeCodeCampのフォロアー数です)。
従って、その記事がその後どれだけ伸びるかはほぼツイート内容だけ―――たとえば記事のタイトル、に限定されるということです。

分析対象に[freeCodeCamp](https://twitter.com/freecodecamp)アカウントを選びました。
これは記事の分野を限定し、特定の分野に対してよりよく予測を行うためです。
あるタイトルは一つのカテゴリ(たとえば技術)では有効なタイトルかもしれませんが、異なるカテゴリ(たとえば料理)でも通用するとは限りません。
また、このアカウントはタイトルとMediumのURLのみを投稿するため、分析対象として最適です。


## How does the data look?

このプロジェクトの第一歩は、TwitterとMediumからデータを取得して相関させることです。
データセットは[こちら](https://github.com/flaviohenriquecbc/machine-learning-capstone-project/blob/master/dataset/dataset-tweets-final.json)にあります。
データ総数は711で、中身は以下のようになっています。

```text
Id, Title (Twitter), Likes (Twitter), Retweet (Twitter), Claps (Medium), Title Length, Categories (Medium), URL (Medium) ,
0, How to use JSON padding (and other options) to bypass the Same Origin Policy, 10, 5, 177, 76, JavaScript; HTML; Web Development; Tutorial; Technology, https://medium.freecodecamp.org/use-jsonp-and-other-alternatives-to-bypass-the-same-origin-policy-17114a5f2016
1, How to build GitHub search functionality in React with RxJS 6 and Recompose by @yazeedBee, 19, 7, 61, 90, React; Tech; Functional Programming; Programming; Technology, https://medium.freecodecamp.org/how-to-build-a-github-search-in-react-with-rxjs-6-and-recompose-e9c6cc727e7f
2, How to read and write Mindful Minutes from iOS HealthKit with Swift, 11, 6, 54, 93, iOS; Software Development; Programming; Web Development; Tech, https://medium.freecodecamp.org/read-write-mindful-minutes-from-healthkit-with-swift-232b65118fe2
3, How to make more money on Upwork by @jpmorris, 39, 9, 139, 46, Freelancing; Tech; Web Development; Web Design; Jobs, https://medium.freecodecamp.org/7-steps-to-make-money-on-upwork-bf57e56f6038
4, Let's build a fun little game: Learn advanced React patterns by developing a game with sprite animation by @pvl4sov, 62, 14, 342, 116, CSS; Games; Tech; Programming; React, https://medium.freecodecamp.org/learn-advanced-react-patterns-by-developing-a-game-with-sprite-animation-5dc072886975
```

## Analyzing and learning with the data

データセットを解析してグラフにプロットした結果、興味深い現象に気がつきました。
異常値を排除した後、私は各分析対象(リツイート、Like、clap)の上位25%に注目しました。

それでは、Mediumで書かれたfreeCodeCampの記事が、どれほどTwitterで共有されているかを見てみましょう。


### What is a good title length?

![02.png](https://qiita-image-store.s3.amazonaws.com/0/26088/143c2282-96a5-22ad-a95d-8efaa0a4fe6d.png)
記事タイトルは50文字以上110文字以下にすることで、記事がよく伸びる可能性が高まるようです。


### What is a good number of words in the title?

![03.png](https://qiita-image-store.s3.amazonaws.com/0/26088/14743001-c150-e5ef-01ed-40f541db9e18.png)
最も効果的な単語数は9から17です。
リツイートやLikeを稼ぎたいなら9から18、clap目的であれば7から17です。


### Which are the best categories to tag?

![04.png](https://qiita-image-store.s3.amazonaws.com/0/26088/67e6b169-ed7c-b01c-d615-82943798dca9.png)
![05.png](https://qiita-image-store.s3.amazonaws.com/0/26088/3ab4c0f8-f398-5879-6cc6-ceff7a6ec895.png)
![06.png](https://qiita-image-store.s3.amazonaws.com/0/26088/b68f7fdd-7ff5-39c9-452b-f80e6de3e74c.png)

投稿する際に考慮すべきカテゴリタグは`Programming`、`Tech`、`Technology`、`JavaScript`、そして`Web Development`です。
3つの分析対象全てに対して、このタグは優れた効果を発揮します。


### Which are the best words to use?

![07.png](https://qiita-image-store.s3.amazonaws.com/0/26088/6af7bb01-a2e5-24c7-9e74-d4a3fb10c1d3.png)
![08.png](https://qiita-image-store.s3.amazonaws.com/0/26088/3203c87d-96c7-b2e4-d7af-85afa8d03fb5.png)
![09.png](https://qiita-image-store.s3.amazonaws.com/0/26088/fe55f608-865f-7a41-648c-ee605fbf3f53.png)

字句解析において、一部の単語が他の単語よりも特に注目を集めていることがわかりました。
読者数を増やしたいのであれば、`JavaScript`、`React`、そして`CSS`についての記事を書くとよいでしょう。
`learn`や`guide`といった単語を追加するとさらに効果的です。


## Using Machine Learning

データを解析し、何らかの情報を抽出することに成功しました。
このプロジェクトの最終的な目標は、記事のタイトルを突っ込むとリツイート数、Like数、clap数を予測してくれる機械学習モデルを作成することです。
このような予測は教師あり分類問題として扱うことができ、それはまさに機械学習の主要な使用法です。

入力は、各単語をトークンに分けたもの(t1,t2,t3,…tn)、タイトル長、ワード数とします。
出力は範囲指定が必要なため、以下のような範囲としました。
・リツイート数：0から10、10から30、30以上
・Like数：0から25、25から60、60以上
・Clap数：0から50、50から400、400以上

データセットを前処理していくつかのモデル(全ては[ここ](https://github.com/flaviohenriquecbc/machine-learning-capstone-project/blob/master/final-report.pdf)で解説しています)を評価した結果、MultinomialNBモデルがリツイート数において60.6%の精度を挙げることができました。
ロジスティック回帰ではLike数が55.3%、clap数が49%という結果になりました。

この記事を締めくくる実験として、この記事のタイトルで予測を実行したところ、モデルは以下の結果を弾き出しました。

・Twitterのリツイート数が10から30、いいねが25から60、Mediumでのclap数が400以上。

この予測はどうだったでしょうか？


# 感想

最後の[予測の結果](https://twitter.com/freeCodeCamp/status/1043273922978955270)ですが、2018/12/10時点でリツイート数9、いいね数40、clap数801です。
RT数が微妙に足りてないものの、概ね適切なモデル構築に成功していると言っていいでしょう。

さて、見てのとおり、この分析は記事の本文を一切使っていません。
要するに、記事の本文なんて誰も読んでおらず、その記事がバズるかどうかは[タイトル(とタグ)だけで決まる](https://qiita.com/SugarShootingStar/items/bba0fab1e55936e7234a)ということです。
この分析は英語なのでモデルをそのまま日本語で使えるわけではありませんが、同じようにQiitaの新着記事投稿BOTをモデルに突っ込むだけで、きっとトレンドを総なめにする記事を量産できることでしょう。

と思ったのですが、調べてみたらQiitaの新着記事を投稿してるTwitterアカウントってもしかして無いみたいですね。
[公式](https://twitter.com/qiita)は○○いいねとか○○Contributionとかばかりで、新着はありません。
もしかして[凍結対策](https://qiita.com/code_monkey/items/eb9630b21fcb3a4250ec)なのか？

よもやの教師不在で、この記事をQiitaに適用するには新着記事投稿BOTを作成して育てるところから始めないといけないという結論になりました。
BOT作成するだけならともかく育てるのが大変なので諦めよう。