形態素解析という機能では、コンピューターによって自動で文章を単語ごとに区切ることができます。
Pythonにはこの形態素解析を簡単に行えるjanomeというライブラリーがあります。
今回はこのjanomeライブラリーを使って過去にバズったツイートを集めて、形態素解析で単語レベルに分解して、どんな単語がいいねを多く集めているのか、その傾向を調べるPythonのプログラムを紹介します。
関連記事
プログラムのソースコード
# ①ライブラリをインポート 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回目…」という具合に、同じキーでも複数の値を持つことができます。
要素のキーと値は、キーワード:[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)にキーワード・合計いいね数をセットで格納します。
要素のキーと値は、キーワード:合計いいね数になります
いいね数が多い順にキーワードを並び替え
38行目:
list1 = sorted(dic2.items(), key=lambda x:x[1], reverse=True)
sorted()で、2つ目の辞書型(変数dic2)の要素をソートします。
返り値は辞書型ではなく、リスト型になります。
引数のkey=lambda x:x[1], reverse=True
では、値が大きい順に並び替えるよう設定しています。
そしてソートした後の返り値であるリスト型を、変数list1とします。
いいね数の多いキーワードから順番に、キーワード,いいね数がセットで格納されています。
キーワード・いいね数を1つずつ表示
42行目:
for word2, fav2 in list1:
ソート後のリスト型(変数list1)から、キーワード・いいね数を1つずつ取り出します。
いいね数の多い順にキーワードを変数word2、いいね数を変数fav2とします。
43行目:
print(f'{repr(word2)}:{fav2}いいね') # ⑱キーワード・いいね数を表示
print()で、キーワード・いいね数をセットで表示します。
しかしそのままだと、¥nのようなエスケープシーケンスを表示できません。
そこでrepr()で、キーワードを表示できる形に整形してから表示しています。
プログラムを実行すると、出力結果は上の画像のようになります。
いいね数が多い順に、キーワード・いいね数がセットで表示されます。
プログラムを実行していただいたり、改良して@uury112をつけてメンション付きのツイートをしていただければ(https://twitter.com/uuyr112)でリツイートさせていただきます。
コメント