Python, janomeの形態素解析でツイートを単語レベルに分解して、キーワードごとのいいね数を調べる

Python

形態素解析という機能では、コンピューターによって自動で文章を単語ごとに区切ることができます。

Pythonにはこの形態素解析を簡単に行えるjanomeというライブラリーがあります。

今回はこのjanomeライブラリーを使って過去にバズったツイートを集めて、形態素解析で単語レベルに分解して、どんな単語がいいねを多く集めているのか、その傾向を調べるPythonのプログラムを紹介します。

関連記事

PythonでTwitterのいいねの多いバズったツイートをいいね数順に表示させる
Twitterでは、どんなツイートがバズっているのでしょう?いいねやRTの数が見ればわかりますが、いちいち手作業で遡るのは面倒ですよね。いいねが多い順(降順)にツイートを並び替えるプログラムを使えば、バズったツイートを簡単に調べることができ

プログラムのソースコード

# ①ライブラリをインポート
import tweepy
from janome.tokenizer import Tokenizer

# ②TwitterAPIの認証情報
api_key = 'APIキーを入力'
api_secret = 'APIシークレットを入力'
access_token = 'アクセストークンを入力'
access_token_secret = 'アクセストークンシークレットを入力'

# ③APIを取得
auth = tweepy.OAuthHandler(api_key, api_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

# ④空の辞書型1を作成
dic1 = {}
# ⑤形態素解析の準備
tokenizer = Tokenizer()

# ⑥ユーザーの全てのツイートを取得
tweets = tweepy.Cursor(api.user_timeline, id="調べたいユーザー", exclude_replies = True, include_rts =False, tweet_mode='extended').items()

# ⑦一覧からツイートを1つずつ取り出す
for status in tweets:
        text = status.full_text # ⑧ツイートの全文
        fav = status.favorite_count # ⑨ツイートのいいね数
# ⑩ツイートの文章をキーワード単位に分割
        for token in tokenizer.tokenize(text):
            word = token.surface # ⑪ツイートに含まれるキーワード
            dic1.setdefault(word, []).append(fav) # ⑫キーワード・いいね数を辞書型に追加

# ⑬空の辞書型2を作成
dic2 = {}
# ⑭キーワード・いいね数を1つずつ取り出す
for key1, value1 in dic1.items():
    dic2.setdefault(key1, sum(value1)) #⑮いいね数を合算して、辞書型2に追加

# ⑯いいね数の多い順に、キーワード・いいね数をソート
list1 = sorted(dic2.items(), key=lambda x:x[1], reverse=True)
# ⑰キーワード・いいね数を1つずつ取り出す
for word2, fav2 in list1:
    print(f'{repr(word2)}:{fav2}いいね') # ⑱キーワード・いいね数を表示

プログラム実行前の準備

Tweepyモジュール・Janomeライブラリは外部ライブラリなので、インストールが必要です。
!pip install tweepy
!pip install janome
↑の2つを実行して、今回のプログラムを実行する前にインストールしておきます。

プログラムのコードの一部を書き換える

7~10行目:

api_key = 'APIキーを入力'
api_secret = 'APIシークレットを入力'
access_token = 'アクセストークンを入力'
access_token_secret = 'アクセストークンシークレットを入力'

↑部分の4箇所のコードを、自分のTwitterAPIの認証情報に書き換えます。
TwitterAPIの認証キーは各自異なるので、それぞれ自分のものを入力してください。

22行目:
tweets = tweepy.Cursor(api.user_timeline, id="調べたいユーザー").items()
↑の「調べたいユーザー」部分を、調べたいユーザーのスクリーンネームに書き換えます。
スクリーンネームは、ユーザーのプロフィール画面で確認できます。

ソースコードの詳細な解説

ここからはソースコードの処理を解説していきます。
プログラム冒頭では、2種類のライブラリをインポートしています。

2行目:
import tweepy
tweepyモジュールをインポートします。
tweepyモジュールは、PythonからTwitterAPIを操作するためのライブラリです。

3行目:
from janome.tokenizer import Tokenizer
janomeライブラリをインポートします。
janomeライブラリは、Pythonで形態素解析を行うためのライブラリです。

5〜14行目:
PythonからTwitterAPIを操作できる状態にするための処理です。
TwitterAPIでは毎回お馴染みの処理なので、詳しくは過去の記事をご覧ください。
Pythonプログラムでいいねの多いバズったツイートを探す

空の辞書型を作成

17行目:
dic1 = {}
キーワード・いいね数をセットで格納するために、空の辞書型(変数dic1)を作成します。

Tokenizerオブジェクトを作成

19行目:
tokenizer = Tokenizer()
Tokenizerオブジェクトを生成して、変数tokenizerとします。
このTokenizerオブジェクトにコマンドを渡すことで、文章を単語レベルに分割する形態素解析ができるようになります。

すべてのツイートを一覧で取得

22行目:

tweets = tweepy.Cursor(api.user_timeline, id="調べたいユーザー", exclude_replies = True, include_rts =False, tweet_mode='extended').items()

api.user_timelineで、形態素解析したいツイートを取得します。
返り値はリスト型で、取得したツイートを集めた一覧リスト(変数tweets)になります。

引数では、どのようなツイートを取得するか設定をしています。

id="調べたいユーザー"
指定したユーザーのツイートを取得します。
exclude_replies = True
リプライを含めないように設定します。
include_rts =False
リツイートを含めないように設定します。
tweet_mode='extended'
140文字以上のツイートも取得するように設定します。
URLや画像付きのツイートは140文字を超える場合があるためです。

1つずつツイートの文章・いいね数を取り出す

25行目:
for status in tweets:
for文で、リスト(変数tweets)にあるツイートを1つずつ取り出します。
取り出したツイートを変数statusとして、キーワードといいね数を調べていきます。

ツイートの全文を取得

26行目:
text = status.full_text
取り出したツイートの文章を調べて、変数textとします。
Statusオブジェクトのfull_text属性で、ツイートの全文を取得できます。

ツイートのいいね数を取得

27行目:
fav = status.favorite_count
取り出したツイートのいいね数を調べて、変数favとします。
Statusオブジェクトのfavorite_count属性で、ツイートのいいね数を取得できます。

形態素解析でツイートをキーワード単位に分割

29行目:
for token in tokenizer.tokenize(text):
はじめにtokenized.tokenize()で、ツイート文(変数text)を形態素解析します。
形態素解析の返り値は、Tokenオブジェクトの集まったリスト型になります。

そしてfor文で、リストにあるTokenオブジェクトを1つずつ変数tokenに代入して、ループ処理していきます。

自分のツイートの中で、どんなツイートがバズったか気になった事ってありませんか?
という文章を形態素解析した時のTokenオブジェクトです。
Tokenオブジェクトは品詞や読み方など、単語の情報が格納されたオブジェクトになります。

キーワードを取り出す

30行目:
word = token.surface
Tokenオブジェクト(変数token)のsurface属性で、キーワードを取り出します。
そして取り出したキーワードを、変数wordとします。

キーワード・いいね数を辞書型に追加

31行目:
dic1.setdefault(word, []).append(fav)
取り出したキーワード・いいね数を辞書型(変数dic1)に追加します。
(変数word,変数fav)という形で、キーと値のセットで格納されます。

ただしdic1.setdefault(word, [])で、値がリスト型の辞書型として作成します。
ただの辞書型だと同じキーを2回以上格納した時、値が上書きされてしまうからです。
リスト型にすると「1回目,2回目…」という具合に、同じキーでも複数の値を持つことができます。

辞書型(変数dic1)の中身は、以下のようになります。
要素のキーと値は、キーワード:[1回目のいいね数,2回目のいいね数…]になります

キーワードといいね数を整理していく

ここまでツイートをキーワード単位に分けて、いいね数を調べることができました。
しかしキーワードの並び順はバラバラな上、いいね数がリスト形式になってしまっています。

まずはいいね数を合算して、キーワードごとの合計いいね数を数えていきます。

2つ目の辞書型を作成

34行目:
dic2 = {}
空の辞書型(変数dic2)を作成します。
この辞書には、いいね数を合算した後のキーワードと値を格納していきます。

キーワードごとにいいね数を合算

36行目:
for key1, value1 in dic1.items():
まずfor文で、1つ目の辞書型(変数dic)の要素を1つずつ取り出します。
キーワードを変数key1に、いいね数のリストを変数value1に取り出します。

37行目:
dic2.setdefault(key, sum(value1))
sum()で、取り出したキーワードのいいね数(変数value1)の合計を取得します。
そしてdic2.setdefault()で、2つ目の辞書型(変数dic2)にキーワード・合計いいね数をセットで格納します。

辞書型(変数dic2)の中身は、以下のようになります。

要素のキーと値は、キーワード:合計いいね数になります

いいね数が多い順にキーワードを並び替え

38行目:
list1 = sorted(dic2.items(), key=lambda x:x[1], reverse=True)
sorted()で、2つ目の辞書型(変数dic2)の要素をソートします。
返り値は辞書型ではなく、リスト型になります。

引数のkey=lambda x:x[1], reverse=Trueでは、値が大きい順に並び替えるよう設定しています。
そしてソートした後の返り値であるリスト型を、変数list1とします。

リスト型(変数list1)の中身は、以下のようになります。

いいね数の多いキーワードから順番に、キーワード,いいね数がセットで格納されています。

キーワード・いいね数を1つずつ表示

42行目:
for word2, fav2 in list1:
ソート後のリスト型(変数list1)から、キーワード・いいね数を1つずつ取り出します。
いいね数の多い順にキーワードを変数word2、いいね数を変数fav2とします。

43行目:
print(f'{repr(word2)}:{fav2}いいね') # ⑱キーワード・いいね数を表示
print()で、キーワード・いいね数をセットで表示します。
しかしそのままだと、¥nのようなエスケープシーケンスを表示できません。
そこでrepr()で、キーワードを表示できる形に整形してから表示しています。


プログラムを実行すると、出力結果は上の画像のようになります。
いいね数が多い順に、キーワード・いいね数がセットで表示されます。

まにゃpy
まにゃpy

プログラムを実行していただいたり、改良して@uury112をつけてメンション付きのツイートをしていただければ(https://twitter.com/uuyr112)でリツイートさせていただきます。

コメント

タイトルとURLをコピーしました