見出し画像

【Python(2)】Twitterのフォロワーさんが何に興味がるのか可視化してみよう('ω')ノ

こんにちは(@t_kun_kamakiri)

本記事は前回の続きとなっております。
前回の記事では、TwitterAPIを使って自身のフォロワーのフォロワー数の分布を取得してグラフ化するところまでをやりました。

前回の内容でフォロワーの自己紹介文も同時に取得していたので、形態要素解析を行ってフォロワーさんが何に興味を持っているのかを可視化したいと思います。

※前回のコードをjupyter labで実行させてから本内容に入ってください。
エラーが起こります。

データフレームの取得

前回の記事でフォロワー情報のcsvファイルを出力したので、そちらを読み込むところから始めます。

画像1

まずはpandasをインポートします。

import pandas as pd

csvファイルを読み込みます。

df_followers = pd.read_csv(f'{acount}_followers_list.csv')
df_followers

形態要素解析で自己紹介文を品詞分解

形態要素解析とは日本語分を品詞に分解して解析を行うことを言いますが、品詞分解にはPythonのjanomeというライブラリを使用すれば簡単にできます。

使い方は公式ドキュメントを見ればだいたいわかります。

まずはライブラリをインポートして、クラスのインスタンス化を行います。

from janome.tokenizer import Tokenizer

t = Tokenizer()

では、試しに1人目のフォロワーの自己紹介文を品詞分解してみましょう。

text = df_followers['description'][0]
text

画像2

自己紹介文が↑このような内容となります。

そして品詞分解をします。

for token in t.tokenize(text):
   print(token)

画像3

このように名詞や動詞に品詞分解できますが、今回知りたいのは名詞だけなのでここから重要と思われる品詞だけを抽出します。

token_list = []
for token in t.tokenize(text):
   if (token.part_of_speech.split(',')[0] == '名詞') & (token.part_of_speech.split(',')[1] in ['一般', '固有名詞', 'サ変接続', '形容動詞語幹']):
       token_list.append(token.surface)
       
token_list

画像4

これでだいたい名詞だけを抽出できました。

では、すべてのフォロワーに対して品詞分解しそれをリストにします。
そしてさらにそれをリストにして全フォロワーの名詞のみを抽出します。

all_token_list = []

for text in df_followers['description']:
   token_list = []
   if type(text) != float:
       for token in t.tokenize(text):
           if (token.part_of_speech.split(',')[0] == '名詞') & (token.part_of_speech.split(',')[1] in ['一般', '固有名詞', 'サ変接続', '形容動詞語幹']):
               token_list.append(token.surface)
       all_token_list.append(token_list)
   else:
       all_token_list.append([''])

ちょっとわかりにくいですが、all_token_listには、
all_token_list=[
    ['名詞','名詞','名詞','名詞'],
    ['名詞','名詞','名詞','名詞'],
    ['名詞','名詞','名詞','名詞'],
・・・
]
という形でリスト化されています。

if文で「if type(text) != float:」としているのは、中には自己紹介文が無くてデータとしてnanとなっていることが原因でエラーが起こることがあり、if文で判別してエラーを回避しています。

一応データフレームの行数と今回作成したリストの長さが一致しているかを確認します。

画像5

1532行と一致していますね。
これはぼくの現在のフォロワー数です。

フォロワーリストに自己紹介文の名詞のみを合体させる

では、新たなデータフレームを作成しましょう。

df_part = pd.DataFrame({
   'part':all_token_list  
})
   
df_part

画像6

このように名詞のみのデータフレームを作成しました。

これをフォロワーリストの列に追加します。

df_followers_part = pd.concat([df_followers, df_part], axis=1)
df_followers_part

画像7

これで準備OKです。

名詞の頻出度を数える

名詞のリストができたので、ここから名詞の頻出度を計算したいと思います。その時に使うライブラリがこちらです。

import collections

では、各フォロワーの自己紹介文内の名詞をカウントしながら、すべてひとつのリストに格納してやります。

all_words = []

delete_words = ['','/','.','t','https','://','co','-','(','~',')','@','ー','...','?…','|','s',',',':','%','T','D','#','C','R','_','.','by','a','!']

for words in df_followers_part['part']:
   for delete_word in delete_words:
       try:
           words.remove(delete_word)
       except Exception as e:
           pass
   all_words.extend(words)

tweet_counter = collections.Counter(all_words)
tweet_counter.most_common()

リストに要素を追加する場合は「extend」というメソッドを使えば良いですね。

画像8

不必要な名詞を除外するために

 ​delete_words = ['','/','.','t','https','://','co','-','(','~',')','@','ー','...','?…','|','s',',',':','%','T','D','#','C','R','_','.','by','a','!']

を用意して必要な名詞は削除するようにしました。
この処理・・・いらないかもしれません(笑)

フォロワーの自己紹介文から興味ある名詞を可視化

自己紹介文にその名詞が頻出するということは、自身のフォロワーがどのようなことに興味をもってフォローしてくれたかということの表れだと思うので、頻出単語を可視化してやります。

使うライブラリは↓こちらです。
インポートしましょう。

from wordcloud import WordCloud

文字化けしないようにフォント指定をして画像データとして可視化の結果を出力します。

FONT_PATH = 'C:/Windows/Fonts/msgothic.ttc'

wordcloud = WordCloud(font_path=FONT_PATH, background_color='black', width=800, height=800, random_state=1).generate(' '.join(all_words))
wordcloud.to_file(f'./wordcloud_descriptsion_{acount}.png')

画像10

画像が出力されましたね。

結果を見てみましょう。

画像10

なるほど・・・

フォロワーの方は、
●物理
●Python
●勉強
●CAE
●プログラミング

などに興味があるのか・・・・・

というのがわかりました(^^♪

プログラムをまとめると

全部のプログラムをまとめると以下となります。

import tweepy
from dotenv import find_dotenv, load_dotenv
import os
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from janome.tokenizer import Tokenizer
import collections
from wordcloud import WordCloud

env_file = find_dotenv()
load_dotenv(env_file)  # .envファイルを探して読み込む
CONSUMER_KEY = os.environ.get('CONSUMER_KEY')
CONSUMER_SECRET = os.environ.get('CONSUMER_SECRET')
ACCESS_KEY = os.environ.get('ACCESS_KEY')
ACCESS_KEY_SECRET = os.environ.get('ACCESS_KEY_SECRET')

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_KEY_SECRET)

api = tweepy.API(auth)


user_list = {
   'eco':'ally_of_earth',
   'kamakiri':'t_kun_kamakiri',
   'kousi':'mimikousi',
   'snow_yuhzoh':'snow_yuhzoh',
   'UG':'UG26192525',
   'shimatake':'shimatake_117'
}
# アカウント名
acount = 'kamakiri'

# フォロワーリスト
def follower_counts_func(acount):
   followers_list = []
   i = 0
   cursor = -1
   while cursor != 0:
       auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
       auth.set_access_token(ACCESS_KEY, ACCESS_KEY_SECRET)
       api = tweepy.API(auth, wait_on_rate_limit=True)
       itr = tweepy.Cursor(api.followers_ids, id=user_list[acount], cursor=cursor).pages()
       try:
           for follower_id in itr.next():
               try:
                   user = api.get_user(follower_id)
                   user_info = [user.id_str, user.screen_name, user.name, user.followers_count,user.description]
                   followers_list.append(user_info)
                   i = i +1
                   print(i, user_info)
               except tweepy.error.TweepError as e:
                   print(e.reason)
       except ConnectionError as e:
           print(e.reason)
       cursor = itr.next_cursor
   return followers_list

# フォロワー自己紹介データフレーム
def df_followers_part_func(followers_list):
   # データフレームの作成
   df = pd.DataFrame(followers_list, columns=['id','screen_name','name','follower_counts','description'])

   # グラフの作成
   plt.figure(figsize=(20,6))
   sns.histplot(df[df['follower_counts']<=1000]['follower_counts'], binwidth=100)
   plt.savefig(f'{acount}_followers_l1000.png')
   plt.figure(figsize=(20,6))
   sns.histplot(df[df['follower_counts']>=1000]['follower_counts'], binwidth=100)
   plt.savefig(f'{acount}_followers_g1000.png')

   t = Tokenizer()


   all_token_list = []

   for text in df['description']:
       token_list = []
       if type(text) != float:
           for token in t.tokenize(text):
               if (token.part_of_speech.split(',')[0] == '名詞') & (token.part_of_speech.split(',')[1] in ['一般', '固有名詞', 'サ変接続', '形容動詞語幹']):
                   token_list.append(token.surface)
           all_token_list.append(token_list)
       else:
           all_token_list.append([''])

   df_part = pd.DataFrame({
       'part':all_token_list  
   })

   df_followers_parts = pd.concat([df, df_part], axis=1)

   df_followers_parts.to_csv(f'{acount}_followers_list.csv') # csvファイルの保存

   return df_followers_parts

# 自己紹介文の品詞分解、名詞の頻出頻度
def all_words_func(df_followers_parts):

   all_words = []

   delete_words = ['','/','.','t','https','://','co','-','(','~',')','@','ー','...','?…','|','s',',',':','%','T','D','#','C','R','_','.','by','a','!']

   for words in df_followers_parts['part']:
       for delete_word in delete_words:
           try:
               words.remove(delete_word)
           except Exception as e:
               pass
       all_words.extend(words)

   tweet_counter = collections.Counter(all_words)
   print(tweet_counter.most_common())
   
   return all_words

# 自己紹介の名詞頻出頻度可視化
def wordcloud_png(all_words):
   FONT_PATH = 'C:/Windows/Fonts/msgothic.ttc'

   wordcloud = WordCloud(font_path=FONT_PATH, background_color='black', width=800, height=800, random_state=1).generate(' '.join(all_words))
   wordcloud.to_file(f'./wordcloud_descriptsion_{acount}.png')    

if __name__ == '__main__':
   followers_list = follower_counts_func(acount)               # フォロワーリスト
   df_followers_parts = df_followers_part_func(followers_list) # フォロワー自己紹介データフレーム
   all_words = all_words_func(df_followers_parts)              # 自己紹介文の品詞分解、名詞の頻出頻度
   wordcloud_png(all_words)                                    # 自己紹介の名詞頻出頻度可視化

お試しあれ(^^♪

Python独習が僕の参考書なので紹介しておきます。
細かい文法の知識は↓こちらを辞書のようにして使っています。

Twitter➡@t_kun_kamakiri
Instagram➡kamakiri1225
ブログ➡宇宙に入ったカマキリ(物理ブログ)
ココナラ➡物理の質問サポートサービス
コミュニティ➡製造業ブロガー

この記事が気に入ったらサポートをしてみませんか?