지정된 계정의 트윗을 WordCloud에서 시각화하는 방법
19371 단어 트위터파이썬TwitterAPI자연 언어 처리wordcloud
제1회:
'정전'에 대한 트윗을 파이썬으로 수집하고 WordCloud에서 시각화하려고했습니다.
htps : // m / poc t_ko / / ms / 0f43c9fd 87bd31cf
제2회:
"쿠파 공주"에 관한 트윗을 파이썬으로 수집하여 버스트를 감지했습니다.
htps : // 이 m / Pocke t_Koo / / ms /에서 4b512b8212 53 3
이번에는 간단하게 지정된 계정의 트윗을 얻고,
WordCloud에서 시각화해 보았습니다.
Twitter 데이터는 어떻게 하면 수집할 수 있는 거야?
다음 흐름으로 수집할 수 있습니다.
자세한 내용은 제1회 기사을 참조하십시오.
지정된 계정의 트윗 수집
우선 라이브러리 로드 등 트윗 수집 준비입니다.
Twitter REST APIs의 출력은 json 형식이므로 json 라이브러리를 사용합니다.
또한 python에서 REST API를 쉽게 호출 할 수 있도록 requests_oauthlib 라이브러리를 사용합니다.
# Twitterデータ収集用のログインキーの情報
KEYS = { # 自分のアカウントで入手したキーを記載
'consumer_key':'*********************',
'consumer_secret':'*********************',
'access_token':'*********************',
'access_secret':'*********************',
}
# Twitterデータの収集(収集準備)
import json
from requests_oauthlib import OAuth1Session
twitter = OAuth1Session(KEYS['consumer_key'],KEYS['consumer_secret'],KEYS['access_token'],KEYS['access_secret'])
지정된 계정의 트윗 수집을 위한 함수는 다음과 같이 작성되었습니다.
user_name(@이후의 계정명)을 인수로 하고 있습니다.
한 번에 최대 100 트윗 만 검색 할 수 있으므로 for 문으로 여러 번 요청할 수 있습니다.
# Twitterデータ取得関数
def getAccountTwitterData(user_name, repeat=10):
url = "https://api.twitter.com/1.1/statuses/user_timeline.json"
params ={'screen_name':user_name,'exclude_replies':True,'include_rts':False,'count':200} #取得パラメータ
tweets = []
mid = -1
for i in range(repeat):
if mid != -1: # 初回のみmax_idの指定を解除する
params['max_id'] = mid # midよりも古いIDのツイートのみを取得する
res = twitter.get(url, params = params)
if res.status_code == 200: #正常通信出来た場合
sub_tweets = json.loads(res.text) #レスポンスからツイート情報を取得
user_ids = []
for tweet in sub_tweets:
user_ids.append(int(tweet['id']))
tweets.append(tweet)
# ループで取得したmidよりも古いツイートを取るための工夫(※もっと良い書き方ありそう)
if len(user_ids) > 0:
min_user_id = min(user_ids)
mid = min_user_id - 1
else:
mid = -1
print(mid) # 時系列で見た時に最も古いツイートID
else: #正常通信出来なかった場合
print("Failed: %d" % res.status_code)
break
print("ツイート取得数:%s" % len(tweets))
return tweets
이 함수를 사용하여 특정 사용자의 트윗을 수집해 봅니다.
총 팔로워 랭킹 1위인 아리요시 히로유키의 계정 ("ariyoshihiroiki") 트윗을 수집해 보세요.
tweets = getAccountTwitterData("ariyoshihiroiki", repeat=30)
산출:
1083030050134323201
1052193588430364671
1022730204936953855
996980908119900161
965901986422927360
927507559023460352
901354707137871872
883995701314584575
850964015756869631
823160757894291455
796014648101175296
781414278850936831
763211195511771135
747450926097563647
728578679194820607
708969135716196351
706835898747367423
-1
:
(중략)
:
-1
트윗 취득 수: 2520
2520개의 트윗을 수집했습니다.
일정량의 트윗을 수집할 수 있었지만 Twitter API에서 특정 사용자의 모든 트윗에 액세스하는 것은 사양상 할 수 없는 것 같습니다.
획득한 트윗을 시각화
다음과 같은 함수를 정의하고 janome에서 형태소 해석하여 단어의 출현 빈도를 계산한 후 WordCloud에서 시각화했습니다.
# 文章を形態素解析して、Bag of Wordsに変換する
from janome.tokenizer import Tokenizer
import collections
import re
def CountWord(tweets):
tweet_list = [tweet["text"] for tweet in tweets]
all_tweet = "\n".join(tweet_list)
t = Tokenizer()
# 原形に変形、名詞のみ、1文字を除去、漢字・平仮名・カタカナの連続飲みに限定
c = collections.Counter(token.base_form for token in t.tokenize(all_tweet)
if token.part_of_speech.startswith('名詞') and len(token.base_form) > 1
and token.base_form.isalpha() and not re.match('^[a-zA-Z]+$', token.base_form))
freq_dict = {}
mc = c.most_common()
for elem in mc:
freq_dict[elem[0]] = elem[1]
return freq_dict
WordCloud에서 시각화하는 함수
# Word Cloudで可視化、WordCloud可視化関数
def color_func(word, font_size, position, orientation, random_state, font_path):
return 'white'
from wordcloud import WordCloud
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')
from matplotlib.font_manager import FontProperties
fp = FontProperties(fname=r'C:\WINDOWS\Fonts\meiryo.ttc', size=50) #日本語対応
def DrawWordCloud(word_freq_dict, fig_title):
# デフォルト設定を変更して、colormapを"rainbow"に変更
wordcloud = WordCloud(background_color='white', min_font_size=15, font_path='C:\WINDOWS\Fonts\meiryo.ttc',
max_font_size=200, width=1000, height=500, prefer_horizontal=1.0, relative_scaling=0.0, colormap="rainbow")
wordcloud.generate_from_frequencies(word_freq_dict)
plt.figure(figsize=[20,20])
plt.title(fig_title, fontproperties=fp)
plt.imshow(wordcloud,interpolation='bilinear')
plt.axis("off")
아리요시 히로유키의 계정에 포함된 트윗을 시각화해 봅니다.
freq_dict = CountWord(tweets)
DrawWordCloud(freq_dict, "%sさんのつぶやきキーワード" % "ariyoshihiroiki")
산출:
할 수 있었습니다.
라디오라는 단어와 다나카 씨, 우에시마 씨 등 사이 좋은 멤버의 이름이 두드러집니다.
덧붙여서 손정의 님의 계정 ("masason") 트윗을 시각화하면 다음과 같습니다.
tweets = getAccountTwitterData("masason", repeat=30)
freq_dict = CountWord(tweets)
DrawWordCloud(freq_dict, "%sさんのつぶやきキーワード" % "masason")
산출:
329646069589884927
241826873217257472
:
(중략)
:
-1
트윗 취득 수: 3068
원전 관련 트윗이 눈에 띄는 것을 알 수 있습니다.
정리와 앞으로
고급 분석을 위해 노력하면 REST API에서 수집 할 수있는 범위에서 부족한 느낌이 들지만,
유저 계정마다의 트윗을 간이하게 취득할 수 있는 것을 알았으므로, 응용할 수 있을 것 같은 예감은 합니다.
Twitter 데이터의 다른 활용 방법에 대해서도 살펴보겠습니다.
Reference
이 문제에 관하여(지정된 계정의 트윗을 WordCloud에서 시각화하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/pocket_kyoto/items/e823f3319d41076f7899
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# Twitterデータ収集用のログインキーの情報
KEYS = { # 自分のアカウントで入手したキーを記載
'consumer_key':'*********************',
'consumer_secret':'*********************',
'access_token':'*********************',
'access_secret':'*********************',
}
# Twitterデータの収集(収集準備)
import json
from requests_oauthlib import OAuth1Session
twitter = OAuth1Session(KEYS['consumer_key'],KEYS['consumer_secret'],KEYS['access_token'],KEYS['access_secret'])
# Twitterデータ取得関数
def getAccountTwitterData(user_name, repeat=10):
url = "https://api.twitter.com/1.1/statuses/user_timeline.json"
params ={'screen_name':user_name,'exclude_replies':True,'include_rts':False,'count':200} #取得パラメータ
tweets = []
mid = -1
for i in range(repeat):
if mid != -1: # 初回のみmax_idの指定を解除する
params['max_id'] = mid # midよりも古いIDのツイートのみを取得する
res = twitter.get(url, params = params)
if res.status_code == 200: #正常通信出来た場合
sub_tweets = json.loads(res.text) #レスポンスからツイート情報を取得
user_ids = []
for tweet in sub_tweets:
user_ids.append(int(tweet['id']))
tweets.append(tweet)
# ループで取得したmidよりも古いツイートを取るための工夫(※もっと良い書き方ありそう)
if len(user_ids) > 0:
min_user_id = min(user_ids)
mid = min_user_id - 1
else:
mid = -1
print(mid) # 時系列で見た時に最も古いツイートID
else: #正常通信出来なかった場合
print("Failed: %d" % res.status_code)
break
print("ツイート取得数:%s" % len(tweets))
return tweets
tweets = getAccountTwitterData("ariyoshihiroiki", repeat=30)
다음과 같은 함수를 정의하고 janome에서 형태소 해석하여 단어의 출현 빈도를 계산한 후 WordCloud에서 시각화했습니다.
# 文章を形態素解析して、Bag of Wordsに変換する
from janome.tokenizer import Tokenizer
import collections
import re
def CountWord(tweets):
tweet_list = [tweet["text"] for tweet in tweets]
all_tweet = "\n".join(tweet_list)
t = Tokenizer()
# 原形に変形、名詞のみ、1文字を除去、漢字・平仮名・カタカナの連続飲みに限定
c = collections.Counter(token.base_form for token in t.tokenize(all_tweet)
if token.part_of_speech.startswith('名詞') and len(token.base_form) > 1
and token.base_form.isalpha() and not re.match('^[a-zA-Z]+$', token.base_form))
freq_dict = {}
mc = c.most_common()
for elem in mc:
freq_dict[elem[0]] = elem[1]
return freq_dict
WordCloud에서 시각화하는 함수
# Word Cloudで可視化、WordCloud可視化関数
def color_func(word, font_size, position, orientation, random_state, font_path):
return 'white'
from wordcloud import WordCloud
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')
from matplotlib.font_manager import FontProperties
fp = FontProperties(fname=r'C:\WINDOWS\Fonts\meiryo.ttc', size=50) #日本語対応
def DrawWordCloud(word_freq_dict, fig_title):
# デフォルト設定を変更して、colormapを"rainbow"に変更
wordcloud = WordCloud(background_color='white', min_font_size=15, font_path='C:\WINDOWS\Fonts\meiryo.ttc',
max_font_size=200, width=1000, height=500, prefer_horizontal=1.0, relative_scaling=0.0, colormap="rainbow")
wordcloud.generate_from_frequencies(word_freq_dict)
plt.figure(figsize=[20,20])
plt.title(fig_title, fontproperties=fp)
plt.imshow(wordcloud,interpolation='bilinear')
plt.axis("off")
아리요시 히로유키의 계정에 포함된 트윗을 시각화해 봅니다.
freq_dict = CountWord(tweets)
DrawWordCloud(freq_dict, "%sさんのつぶやきキーワード" % "ariyoshihiroiki")
산출:
할 수 있었습니다.
라디오라는 단어와 다나카 씨, 우에시마 씨 등 사이 좋은 멤버의 이름이 두드러집니다.
덧붙여서 손정의 님의 계정 ("masason") 트윗을 시각화하면 다음과 같습니다.
tweets = getAccountTwitterData("masason", repeat=30)
freq_dict = CountWord(tweets)
DrawWordCloud(freq_dict, "%sさんのつぶやきキーワード" % "masason")
산출:
329646069589884927
241826873217257472
:
(중략)
:
-1
트윗 취득 수: 3068
원전 관련 트윗이 눈에 띄는 것을 알 수 있습니다.
정리와 앞으로
고급 분석을 위해 노력하면 REST API에서 수집 할 수있는 범위에서 부족한 느낌이 들지만,
유저 계정마다의 트윗을 간이하게 취득할 수 있는 것을 알았으므로, 응용할 수 있을 것 같은 예감은 합니다.
Twitter 데이터의 다른 활용 방법에 대해서도 살펴보겠습니다.
Reference
이 문제에 관하여(지정된 계정의 트윗을 WordCloud에서 시각화하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/pocket_kyoto/items/e823f3319d41076f7899
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(지정된 계정의 트윗을 WordCloud에서 시각화하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/pocket_kyoto/items/e823f3319d41076f7899텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)