Pythonの言語処理ライブラリを使って「いいね」されやすい語句や傾向を調べる
はじめに
いいね(likes)の数はツイートの内容ではなくツイートしたアカウントのフォロワーの数や自身のアカウントの傾向との合致等のツイート外の要素に強い相関があるのは経験的に明らかだと思われますが、 それでもなおいいねの数が少ないツイートと多いツイートを比較して、 多いツイートにだけ存在する特有の語句があればそれはいいねを得られやすい語句の候補であると考えられます。
今回はそういった語句や傾向を探索します。 このような語句の取得にPythonの言語処理ライブラリを使用します。
APIを使用して検索条件を指定してツイートを取得する
Twitter API(v2)を使用して検索条件からツイートを取得します。 APIのキーはTwitter Developerから申請を行い取得を行います。 取得可能なデータは以下から参照できます。
https://developer.twitter.com/en/docs/twitter-api/data-dictionary/introduction
Pythonを使用するのでtweepyライブラリから、Client.search_recent_tweetsを使用して 最近7日から新しい順に5000件のツイートを取得するようにします。 検索条件は日本語ツイートの中からリツイートとユーザー名を除くため以下になります。
(search word) lang: ja -RT OR @a -@a
取得内容はツイートID・本文・言語・作成者ID・いいね数・リツイート数・引用数・ハッシュタグになります。 取得データは扱いやすいようにPandas DateFrameに変換します。 今回に使用する検索語句は"Python"です。 ソースコートは以下になります。
def get_tweet_by_word(word, num=1000):
colname = ["id", "author_id", "lang", "text", "retweet_count", "like_count", "quote_count", "hashtag_count", "hashtags"]
fields = ["author_id", "lang", "public_metrics", "entities"]
client = tweepy.Client(bearer_token=BEARER_TOKEN, wait_on_rate_limit=True)
itr = tweepy.Paginator(client.search_recent_tweets, query=word, tweet_fields = fields, max_results = min(num, 100)).flatten(limit=num)
dic = dict()
for c in colname:
dic[c] = []
for tweet in itr:
dic["id"].append(tweet.id)
dic["author_id"].append(tweet.author_id)
dic["lang"].append(tweet.lang)
dic["text"].append(tweet.text)
dic["retweet_count"].append(tweet.public_metrics["retweet_count"])
dic["like_count"].append(tweet.public_metrics["like_count"])
dic["quote_count"].append(tweet.public_metrics["quote_count"])
if not tweet.entities or "hashtags" not in tweet.entities:
dic["hashtag_count"].append(0)
dic["hashtags"].append("")
else:
dic["hashtag_count"].append(len(tweet.entities["hashtags"]))
dic["hashtags"].append(" ".join([tags["tag"].lower() for tags in tweet.entities["hashtags"]]))
return pd.DataFrame.from_dict(dic, orient='index').T
word = "Python"
lang = "ja"
df = get_tweet_by_word(f"{word} {f'lang: {lang}' if lang else ''} -RT OR @a -@a", num=5000)
df.to_csv(f"./{word}.csv")
df.describe()
得られたデータを使用してツイート内容の分析を行います。 これは「Python」を検索語句としたときの結果であって、他の語句を検索条件に使用したり、 トレンドなどの影響によりツイートを取得するタイミングによっても変化する可能性はあります。
いいね数・リツイート数・引用数・ハッシュタグ数
ツイートごとにそれぞれのデータのカウント行い図示しました。 データの見やすさのため、y軸はlogスケール、x軸は100までとしています。 まずはヒストグラムで数の分布を可視化しました。
続いて、それぞれの相関を可視化します。 これはseabornライブラリのpaiplotを使用すれば出力できます。
いいね数・リツイート数・引用数には相関がみられますが、ハッシュタグ数はこれらとの相関は見られないようです。 ハッシュタグをたくさんつけてもいいね数などには結びつかないということですね。
ツイートの文字数といいね数の関係
いいね数が期待できるのは50文字程度以上で、文章が長すぎてもダメみたいです。
いいね数の多いツイートで使われる語句を調査
まずいいね数でツイートのクラス分けを行いました。 クラスごとに語句の使用傾向を調べて比較することでいいねされやすい語句の候補を見つけることができます。
クラスはいいね数ごとに3つ(low, mid, high)に分けました。 それぞれのクラスの境界の決定はどのような検索語句でも対応できるようk-meansを使用しようと試みましたが、 いいね数が凝集しすぎていたためか失敗することが多かったため境界は固定しました。クラス分けは以下のように設定しました
- low : いいね数 0-1
- mid : いいね数 2-19
- high : いいね数 20-
まずは「ハッシュタグ別」のいいねの数を調べました。
low : like 0-1 | mid : like 2-20 | high: like 21- | |
---|---|---|---|
0 | python : 484 | python : 348 | 駆け出しエンジニアと繋がりたい : 49 |
1 | プログラミング : 92 | プログラミング : 162 | python : 47 |
2 | うひーメモ : 84 | プログラミング初心者 : 133 | プログラミング初心者 : 25 |
3 | 相互フォロー : 38 | 駆け出しエンジニアと繋がりたい : 122 | 今日の積み上げ : 22 |
4 | フォロバ100 : 37 | プログラミング学習 : 62 | プログラミング : 14 |
5 | 質問箱 : 34 | php : 60 | 朝活 : 11 |
6 | qiita : 34 | エンジニア : 59 | プログラミング初心者と繋がりたい : 7 |
7 | raspberrypi : 32 | laravel : 52 | progate : 5 |
8 | 仙台の天気 : 31 | go : 49 | プログラミング勉強中 : 5 |
9 | followback : 31 | fuelphp : 49 | プログラミング独学 : 4 |
10 | 匿名質問募集中 : 28 | buildree : 49 | 読書 : 4 |
11 | 株式投資 : 28 | apache : 49 | 英語 : 4 |
12 | 株 : 27 | フレームワーク : 49 | 駆け出しエンジニア : 4 |
13 | 投資初心者 : 26 | nodejs : 49 | 数学 : 4 |
14 | 株初心者 : 26 | nginx : 49 | イマソラ : 3 |
15 | 投資 : 26 | 今日の積み上げ : 49 | 投資 : 3 |
16 | 機械学習 : 22 | フォロバ100 : 42 | データサイエンス : 3 |
17 | django : 20 | 相互フォロー : 41 | データ分析 : 3 |
18 | イマソラ : 19 | followback : 41 | webマーケ : 3 |
19 | fswebcam : 19 | 仙台の天気 : 41 | 勉強垢さんと繋がりたい : 3 |
20 | オホーツク : 19 | progate : 38 | いいねした人全員フォローする : 3 |
21 | 北海道 : 19 | プログラミング初心者と繋がりたい : 32 | ランニング : 3 |
22 | photo : 19 | 機械学習 : 21 | ヨガ : 3 |
23 | 日本株 : 16 | データ分析 : 20 | 英語学習 : 3 |
24 | progate : 16 | プログラミング独学 : 18 | 勉強垢 : 3 |
25 | youtube : 15 | 独学 : 16 | ブログ更新しました : 2 |
26 | エンジニア : 15 | qiita : 15 | 今日の積上げ : 2 |
27 | 音楽 : 13 | プログラミング勉強中 : 14 | プログラマー : 2 |
28 | 自動作曲 : 13 | プログラミング初学者 : 14 | エンジニア : 2 |
29 | note : 13 | recursioncs : 13 | プログラミング初学者 : 2 |
lowとmid/highを比較すると「駆け出しエンジニアと繋がりたい」や「プログラミング初心者」などがいいねの数が増えています。 このようなハッシュタグはおそらくプログラミング・エンジニア関係者とのコミュニケーションを望んでいるようなタグなので、いいねが得られやすいのでしょう。
「今日の積み上げ」「朝活」というハッシュタグがあります。これは努力している最中なのでしょうか。こういったタグにもいいねが得られやすいようです。
また続いてフロントエンド関連の語句が目立ちますが、カウント数が同じなので同じアカウントの方が発現されたのかもしれません。 実際に確認してみたところ、これは宣伝でした。 lowをみると「相互フォロー」や「株」関連のハッシュタグが目立ちます。これはPythonと関係ないのでスルーされやすいのかもしれません。
次にツイートに使用された「語句別」のいいねの数を調べました。 語句の抽出には形態素解析Mecab、辞書にはmecab-ipadic-NEologdを使用しました。 語句は名詞または形容詞の自立語のみをカウントするようにしました。
import MeCab
def pick_independent_words(df):
me = MeCab.Tagger()
words = []
for id, txt in df["text"].items():
bases = []
lines = me.parse(txt).splitlines()
for line in lines:
if line == "EOS\n":
break
fields = line.split("\t")
if len(fields) != 2 or fields[0].isdigit():
continue
fields = fields[1].split(",")
pos = fields[0]
pos1 = fields[1]
base = fields[6]
if base == "*":
continue
if pos == "名詞" and pos1 in ['一般','固有名詞','サ変接続','形容動詞語幹']:
bases.append(base)
elif pos == '形容詞' and pos1 == '自立':
bases.append(base)
#elif pos == "動詞" and pos1 == "自立":
# bases.append(base)
words.append(bases)
return words
low : like 0-1 | mid : like 2-20 | high: like 21- | |
---|---|---|---|
0 | Python : 2863 | Python : 1132 | Python : 131 |
1 | HTTPS : 1677 | HTTPS : 626 | HTTPS : 90 |
2 | プログラミング : 376 | プログラミング : 590 | プログラミング : 79 |
3 | 入門 : 247 | エンジニア : 271 | エンジニア : 59 |
4 | 勉強 : 216 | 初心者 : 221 | 駆け出し : 53 |
5 | ない : 200 | 勉強 : 208 | 初心者 : 37 |
6 | 言語 : 190 | 学習 : 155 | 勉強 : 35 |
7 | コード : 156 | 駆け出し : 150 | 積み上げ : 25 |
8 | 自動 : 139 | PHP : 85 | チェックボックス : 20 |
9 | 機械学習 : 130 | 機械学習 : 82 | 朝活 : 16 |
10 | エンジニア : 128 | ない : 66 | 人 : 15 |
11 | 開発 : 127 | 積み上げ : 62 | コード : 15 |
12 | 人 : 122 | いい : 60 | blog : 14 |
13 | アプリ開発 : 120 | 言語 : 58 | 数学 : 13 |
14 | 環境 : 120 | FRAMeWORK : 58 | 学習 : 12 |
15 | Java : 120 | 独学 : 56 | 独学 : 9 |
16 | おすすめ : 119 | Java : 56 | 英語 : 9 |
17 | 質問 : 117 | 入門 : 55 | 理解 : 9 |
18 | いい : 117 | 環境 : 54 | 方法 : 9 |
19 | 投稿 : 113 | blog : 51 | 笑顔 : 9 |
20 | 初心者 : 111 | おすすめ : 51 | 読書 : 8 |
21 | 学習 : 107 | データ : 50 | 力こぶ : 8 |
22 | 有効 : 106 | nginx : 50 | 自分 : 8 |
23 | DESKTOP : 106 | 人 : 50 | 入門 : 8 |
24 | AI : 104 | Apache : 49 | 解説 : 7 |
25 | データ : 103 | nodejs : 49 | 機械学習 : 7 |
26 | 記事 : 103 | 自分 : 49 | 作成 : 7 |
27 | アイテム : 103 | FuelPHP : 49 | データ : 7 |
28 | プログラム : 103 | コード : 47 | プログラム : 7 |
29 | お家 : 101 | 開発 : 47 | 記事 : 7 |
いいねの多いツイートにはハッシュタグ関連の語句の他には「独学」という語句が存在します。 またいいねの数が少ないツイートには「入門」という語句が多く、多くなるほど「学習」「エンジニア」の語句が上位に来ます。 傾向として実際に努力の最中のツイートなどはいいねがされやすく、完全な初心者はもしかするといいねはされにくいのかもしれません。
ツイートの自立語数といいね数の関係
先ほどはツイートの文字数といいねとの関係でしたが、 今度は自立語数との関係を見ます。
いいね数が期待できるのは5個程度以上の意味のある言葉が必要で、同じように長すぎてもダメなようです。
他の検索語句の結果例
他の例として「言語処理」で検索したときの結果を示します。
low | mid | high | |
---|---|---|---|
0 | 自然言語処理 : 242 | 自然言語処理 : 66 | HTTPS : 8 |
1 | HTTPS : 179 | HTTPS : 45 | 自然言語処理 : 7 |
2 | 言語処理 : 86 | 言語処理 : 20 | AI : 3 |
3 | AI : 41 | AI : 15 | 処理 : 2 |
4 | モデル : 41 | Python : 13 | 紹介 : 2 |
5 | NLP : 30 | 人 : 9 | ない : 2 |
6 | 処理 : 27 | ない : 9 | 最新 : 2 |
7 | 言語 : 26 | 勉強 : 7 | 授業 : 2 |
8 | 機械学習 : 24 | データ分析 : 7 | カット : 2 |
9 | 技術 : 23 | 機械学習 : 7 | うち : 2 |
10 | ない : 22 | GT : 7 | いいね : 2 |
11 | 表現 : 22 | 情報 : 6 | 人工知能学会 : 2 |
12 | 研究 : 20 | プログラミング : 6 | 研究 : 2 |
13 | 入門 : 17 | 記事 : 6 | 言語処理 : 2 |
14 | Python : 16 | 研究 : 6 | 論文 : 2 |
15 | 人 : 16 | 先生 : 6 | 人工知能 : 2 |
16 | 公開 : 15 | 深層学習 : 5 | スカウト : 2 |
17 | 紹介 : 15 | 初心者 : 5 | 情報 : 2 |
18 | 自然 : 15 | TRANSFORMER : 5 | 返信 : 2 |
19 | 分野 : 15 | エンジニア : 5 | 予定 : 2 |
20 | 自然言語 : 14 | 発表 : 5 | 応用 : 2 |
21 | タスク : 14 | 処理 : 5 | 強化学習 : 2 |
22 | 理解 : 14 | 紹介 : 5 | 関連 : 2 |
23 | 深層学習 : 14 | 駆け出し : 5 | 聴覚情報処理障害 : 2 |
24 | 情報 : 13 | 入門 : 5 | 最新技術 : 1 |
25 | 人工知能 : 13 | 話 : 5 | 最適 : 1 |
26 | スコア : 13 | 本 : 4 | 概論 : 1 |
27 | 文章 : 13 | 普通 : 4 | 機械学習 : 1 |
28 | 学習 : 12 | Qiita : 4 | 文面 : 1 |
29 | 簡単 : 12 | 人工知能 : 4 | 機能 : 1 |
まとめ
今回は特定の検索語句を使用して検討しましたが、他に例えば
- 自身のツイートから傾向を観察する
- 自分のお気に入りのアカウントのツイートの傾向を調査する
などを行うことも可能で、その目的に合わせて分析の方法をアレンジしたり新しい手法を用いたりして、 その結果を参考に今後に活かすこともできると思います。
別の機会では、また今回とは違った分析や検索条件が英語の場合でもアプローチしてみようと思います。 実際に取得したツイートを観察すると、 語句のみを見るだけでは捉えきれていない部分があり、文脈も必要だと考える必要もありそうです。 英語で検索を行う場合、文化圏が違うのでまた違った結果が得られると思います。