Pythonの開発者が楽しんでいることの1つは、きっとその大きなコミュニティによって開発された膨大な数のリソースです。Pythonで作られたアプリケーションプログラミングインターフェース(API)は、Webサイトにとって一般的なものです。どんな人気のあるWebサービスでも、そのサービスへのアクセスを容易にするためにPython APIライブラリを作成していないことは想像に難くありません。最も人気のあるWebサービスのいくつかについて、そのようなAPIのいくつかのアイデアをここで見つけることができました。なぜなら、Web APIは通常、一般的なアプリケーションプログラミングインターフェースを提供し、プログラミング言語固有のライブラリは、それを使いやすい関数に「ラップ」するコードを作成するからです。いずれにせよ、この記事を通して両方の用語を互換的に使用します。
このブログ記事では、Twitter APIに焦点を当て、Twitterでの認証情報の設定方法と、コミュニティへの参加に基づくいくつかのPythonラッパーの比較について説明します。次に、Twitter APIを使用してツイートを検索し、特定のテーマに関するリアルタイムのツイートのストリームを作成する例をいくつか紹介します。最後に、保存されたデータについて調べます。
Twitter APIの概要
Twitterプラットフォームには、ソフトウェア開発者が利用できる多くのAPIがあり、最終的にはTwitterと連動する完全自動化システムを作成することができます。この機能は、Twitterのデータから洞察を引き出すことで企業に利益をもたらす可能性がありますが、小規模なプロジェクト、研究、および楽しみにも適しています。以下は、Twitterが提供する最も注目すべきAPIの一部である。
- ツイート: 検索、投稿、フィルタリング、エンゲージメント、ストリーミングなど。
- 広告: キャンペーンとオーディエンスの管理、分析。
- ダイレクトメッセージ(まだベータ版):送受信、ダイレクト返信、ウェルカムメッセージなど。
- アカウントとユーザー(ベータ版):アカウント管理、ユーザーインタラクション。
- メディア: 写真、ビデオ、アニメーション GIF のアップロードとアクセス。
- トレンド: 特定の場所でのトレンドトピック。
- Geo: 既知の場所やその場所の近くの場所に関する情報。
TwitterのAPIには、このリストには含まれていない、さらに多くの可能性があります。また、Twitterは随時新しいAPIを追加し、既存のAPIを更新することで、サービスの幅を常に広げています。
クレデンシャルの取得
Twitter APIを使用する前に、まずTwitterのアカウントを取得し、いくつかのクレデンシャルを取得する必要があります。クレデンシャルの取得方法は今後変更される可能性がありますが、現状は以下の通りです。
- アプリケーション管理ページ(https://apps.twitter.com/)にアクセスし、Twitterアカウントでサインインします。
- 新しいアプリを作成する」ボタンをクリックし、必要事項を入力し、利用規約に同意します。
- キーとアクセストークン」セクションに移動し、コンシューマーキーとシークレットをメモしてください。
- 同じセクションで “Create my access token “ボタンをクリックします。
- アクセストークンとアクセストークンシークレットを入力してください。
以上です。Consumer Key/SecretはTwitter APIを利用するアプリの認証に使用され、Access Token/Secretはユーザーの認証に使用されます。これらのパラメータはすべてパスワードとして扱うべきであり、プレーンテキストでコードに含めるべきではありません。JSONファイル「twitter_credentials.json」に保存し、必要なときにコードから読み込むのが適切な方法の1つです。
import json
# Enter your keys/secrets as strings in the following fields
credentials = {}
credentials['CONSUMER_KEY'] = ...
credentials['CONSUMER_SECRET'] = ...
credentials['ACCESS_TOKEN'] = ...
credentials['ACCESS_SECRET'] = ...
# Save the credentials object to file
with open("twitter_credentials.json", "w") as file:
json.dump(credentials, file)
Python ラッパー
Pythonは、Twitter APIのラッパーが最も多く開発されているプログラミング言語の一つです。そのため、それぞれのラッパーをしばらく使ってみないと比較するのは難しいです。正しいツールを選ぶには、ドキュメントを読み、それらが提供する可能性と、あなたのアプリの仕様にどのように適合するかを見ることが良い方法かもしれません。このパートでは、PythonコミュニティのGitHubプロジェクトにおけるエンゲージメントを利用して、様々なAPIラッパーを比較します。比較に適した指標としては、貢献者数、スター獲得数、ウォッチャー数、最初のリリースからの時間的なライブラリの成熟度などが挙げられるでしょう。
表1:Twitter APIのためのPythonライブラリは、受け取った星の数で並べました。
ライブラリ | #貢献者 | #スター | #ウォッチャー | #成熟度(Maturity) |
ツイーピー|135|4732|249|~8.5年|←今ここ | ||||
Python Twitter Tools|60|2057|158|~7年|←今ここ | ||||
python-twitter | 109 | 2009 | 148 | 〜5年|(英語) |
twython|73|1461|100|NA|~5年 | ||||
TwitterAPI | 15 | 424 | 49 | 〜4.5年|(英語 |
TwitterSearch|8|241|29|~4.5年|←今ここ |
上の表は、Twitter APIのための最も人気のあるPythonライブラリのいくつかをリストアップしました。では、そのうちの1つを使って、ツイートを検索し、データを取得し、探索をしてみましょう。
Twythonの例
twythonライブラリを選択した理由は、Twitterの様々なAPIに対応した多様な機能、最初のリリースがいつだったかという情報はありませんが、バージョン2.6.0が5年ほど前に登場したという情報、そしてツイートのストリーミングに対応していることです。最初の例では、Search APIを使って「learn python」という文字列を含むツイートを検索し、後ほどTwitterのStreaming APIを使ったより現実的な例を紹介します。
検索API
この例では、検索キーワードを “learn python” として Search API 用のクエリを作成し、過去 7 日間で最も人気のある公開ツイートを返します。このキーワードは “learn” と “python” という2つの単語から構成されているため、必ずしも連続したフレーズとしてではなく、ツイートのテキストに両方が表示される必要があることに注意してください。まず、ライブラリをインストールしましょう。一番簡単なのは pip
を使う方法ですが、他のオプションもインストールドキュメントに記載されています。
$ pip install twython
次のステップでは、Twythonクラスをインポートして、そのオブジェクトをインスタンス化し、検索クエリを作成します。クエリには4つの引数のみを使用します。q,
result_type,
count,
lang` で、それぞれ検索キーワード、検索タイプ、検索回数、検索結果の言語となります。Twitterでは、検索クエリを細かく調整するための他の引数も定義しており、こちらで確認することができます。
# Import the Twython class
from twython import Twython
import json
# Load credentials from json file
with open("twitter_credentials.json", "r") as file:
creds = json.load(file)
# Instantiate an object
python_tweets = Twython(creds['CONSUMER_KEY'], creds['CONSUMER_SECRET'])
# Create our query
query = {'q': 'learn python',
'result_type': 'popular',
'count': 10,
'lang': 'en',
}
最後に、Twythonオブジェクトを使って search
メソッドを呼び出すと、 search_metadata
と statuses
– クエリ結果の辞書が返されます。ここでは statuses
の部分のみを見て、すべての情報の一部を pandas
データフレームに保存して、テーブルで表示することにします。
import pandas as pd
# Search tweets
dict_ = {'user': [], 'date': [], 'text': [], 'favorite_count': []}
for status in python_tweets.search(**query)['statuses']:
dict_['user'].append(status['user']['screen_name'])
dict_['date'].append(status['created_at'])
dict_['text'].append(status['text'])
dict_['favorite_count'].append(status['favorite_count'])
# Structure data in a pandas DataFrame for easier manipulation
df = pd.DataFrame(dict_)
df.sort_values(by='favorite_count', inplace=True, ascending=False)
df.head(5)
.dataframe thead tr:only-childのth {。
text-align: right;
}
.dataframe thead th {
text-align: left;
}
.dataframe tbody tr th {
vertical-align: top;
}
date | favorite_count | text | user | |
---|---|---|---|---|
1 | Fri Jan 12 21:50:03 +0000 2018 | 137 | 2017 was the Year of Python. We set out to lea… | Codecademy |
3 | Mon Jan 08 23:01:40 +0000 2018 | 137 | Step-by-Step Guide to Learn #Python for #DataS… | KirkDBorne |
4 | Mon Jan 08 11:13:02 +0000 2018 | 109 | Resetter is a new tool written in Python and p… | linuxfoundation |
8 | Sat Jan 06 16:30:06 +0000 2018 | 96 | We’re proud to announce that this week we have… | DataCamp |
2 | Sun Jan 07 19:00:36 +0000 2018 | 94 | Learn programming in Python with the Python by… | humble |
So we got some interesting tweets. Note that these are the most popular tweets containing the words “learn” and “python” in the past 7 days. 過去にさかのぼってデータを探索するには、Search APIのプレミアムプランまたはエンタープライズプランを購入する必要があります。
ストリーミングAPI
前の例では1回限りの検索を示しましたが、より興味深いケースはツイートのストリームを収集することでしょう。これは Twitter Streaming API を使って行われ、Twython には TwythonStreamer クラスを通してそれを行う簡単な方法があります。以下のように、 TwythonStreamer
を継承したクラス MyStreamer
を定義し、 on_success
と on_error
メソッドをオーバーライドする必要があります。
on_successメソッドは twitter からデータが送られてきたときに自動的に呼ばれ、
on_errorメソッドは API に問題が発生したときに(Twitter API の制約によるものがほとんど)呼ばれます。追加されたメソッド
save_to_csv` は、ツイートをファイルに保存するのに便利な方法です。
先ほどの例と同様に、ツイート内のすべてのデータを保存するのではなく、使用したハッシュタグ、ユーザー名、ユーザーの位置情報、ツイート自体のテキストなど、興味のあるフィールドのみを保存します。ツイートには興味深い情報がたくさんあるので、自由に試してみてください。なお、ツイートの位置情報は、ユーザーのプロフィール上に存在するものとして保存されますが、これは、ツイートを送信したユーザーの現在地や実際の場所と一致しない場合があります。これは、Twitterユーザーのごく一部だけが、ツイートデータのcoordinates
キーで現在地を提供しているためです。
from twython import TwythonStreamer
import csv
# Filter out unwanted data
def process_tweet(tweet):
d = {}
d['hashtags'] = [hashtag['text'] for hashtag in tweet['entities']['hashtags']]
d['text'] = tweet['text']
d['user'] = tweet['user']['screen_name']
d['user_loc'] = tweet['user']['location']
return d
# Create a class that inherits TwythonStreamer
class MyStreamer(TwythonStreamer):
# Received data
def on_success(self, data):
# Only collect tweets in English
if data['lang'] == 'en':
tweet_data = process_tweet(data)
self.save_to_csv(tweet_data)
# Problem with the API
def on_error(self, status_code, data):
print(status_code, data)
self.disconnect()
# Save each tweet to csv file
def save_to_csv(self, tweet):
with open(r'saved_tweets.csv', 'a') as file:
writer = csv.writer(file)
writer.writerow(list(tweet.values()))
次に行うことは、MyStreamer
クラスのオブジェクトをインスタンス化して、引数として認証情報を渡します。引数 track
にはフィルタのキーワード(ここでは “python”)を指定し、フィルタを作成します。引数 track
の他にも、基本的なストリーミングパラメータに記載されているように、選択したユーザー、言語、場所などからツイートを収集するなど、フィルタを細かく調整することができます。Streaming APIの有料版では、さらに多くのフィルタリングオプションが提供される予定です。
# Instantiate from our streaming class
stream = MyStreamer(creds['CONSUMER_KEY'], creds['CONSUMER_SECRET'],
creds['ACCESS_TOKEN'], creds['ACCESS_SECRET'])
# Start the stream
stream.statuses.filter(track='python')
上記のコードで、「python」というキーワードを含む約1万件のツイートのデータを収集することができました。次のパートでは、含まれるハッシュタグとユーザーのロケーションについて簡単な分析を行います。
簡単なデータ分析
The Twitter API is a powerful thing, very suitable for researching the public opinion, market analysis, quick access to news, and other use-cases your creativity can support. A common thing to do, after you’ve carefully collected your tweets, is to analyse the data, where sentiment analysis plays a crucial role in systematically extracting subjective information from text. Anyway, sentiment analysis a huge field to be addressed in a small portion of a blog post, so in this part we’ll only do some basic data analysis regarding the location and hashtags used by people tweeting “python”.
Please note that the point of these examples is just to show what the Twitter API data could be used for – our small sample of tweets should not be used in inferring conclusions, because it’s not a good representative of the whole population of tweets, nor its collection times were independent and uniform.
First let’s import our data from the “saved_tweets.csv” file and print out a few rows.
import pandas as pd
tweets = pd.read_csv("saved_tweets.csv")
tweets.head()
.dataframe thead tr:only-child th {
text-align: right;
}
.dataframe thead th {
text-align: left;
}
.dataframe tbody tr th {
vertical-align: top;
}
hashtags | text | user | location | |
---|---|---|---|---|
0 | [‘IBM’] | RT @freschesolution: 明日、@OCと一緒に参加しましょう… | 1 | [ ] |
1 | [] | pylocus 1.0.1: ローカライゼーションパッケージ https://t…. | 1 | [ ] |
2 | [] | humilis-push-processor 0.0.10: Humilis push ev…. | pypi_updates2 | NaN |
3 | [‘Python’, ‘python’, ‘postgresql’] | #Python Digest is out! https://t.co/LEmyR3yDMh… | horstwilmes | チューリッヒ |
4 | [‘NeuralNetworks’, ‘Python’, ‘KDN’] | RT @kdnuggets: ニューラルネットの初心者ガイド | giodegas|イタリア、ラキラ|… |
python “というキーワードでよく使われるハッシュタグは何でしょうか?DataFrameのデータはすべてhashtags
カラムに括弧を含む文字列として表現されるので、ハッシュタグのリストを取得するためには、文字列のリストからリストのリスト、そしてハッシュタグのリストへと移動する必要があります。次に、 Counter
クラスを使ってリスト内のハッシュタグを数え、最も一般的な 20 のハッシュタグをソートしたリストを表示します。
from collections import Counter
import ast
tweets = pd.read_csv("saved_tweets.csv")
# Extract hashtags and put them in a list
list_hashtag_strings = [entry for entry in tweets.hashtags]
list_hashtag_lists = ast.literal_eval(','.join(list_hashtag_strings))
hashtag_list = [ht.lower() for list_ in list_hashtag_lists for ht in list_]
# Count most common hashtags
counter_hashtags = Counter(hashtag_list)
counter_hashtags.most_common(20)
[('python', 1337),
('datascience', 218),
('bigdata', 140),
('machinelearning', 128),
('deeplearning', 107),
('django', 93),
('java', 76),
('ai', 76),
('coding', 68),
('100daysofcode', 65),
('javascript', 64),
('iot', 58),
('rstats', 52),
('business', 52),
('tech', 48),
('ruby', 45),
('programming', 43),
('cybersecurity', 43),
('angularjs', 41),
('pythonbot_', 41)]
次に、ユーザーの位置情報を使って、「世界のどの地域が “python “について最も多くツイートしているか」という質問に答えます。このステップでは、与えられた入力位置の座標を返すgeopyライブラリの geocode
メソッドを使用します。ツイートの世界ヒートマップを表示するには、gmplotライブラリを使用します。注意:この小さなデータは世界を代表するものではありません。
from geopy.geocoders import Nominatim
import gmplot
geolocator = Nominatim()
# Go through all tweets and add locations to 'coordinates' dictionary
coordinates = {'latitude': [], 'longitude': []}
for count, user_loc in enumerate(tweets.location):
try:
location = geolocator.geocode(user_loc)
# If coordinates are found for location
if location:
coordinates['latitude'].append(location.latitude)
coordinates['longitude'].append(location.longitude)
# If too many connection requests
except:
pass
# Instantiate and center a GoogleMapPlotter object to show our map
gmap = gmplot.GoogleMapPlotter(30, 0, 3)
# Insert points on the map passing a list of latitudes and longitudes
gmap.heatmap(coordinates['latitude'], coordinates['longitude'], radius=20)
# Save the map to html file
gmap.draw("python_heatmap.html")
上のコードは次の図のようなヒートマップを生成しました。米国、英国、ナイジェリア、インドで「python」ツイートのアクティビティが高いことがわかります。この方法の欠点は、データのクリーニングを行っていないことです。もちろん、”python “とつぶやく人間の地理的分布をより現実的に把握するために、これらのサンプルは破棄されるべきです。2つ目の改善点は、より長い期間、途切れることなく、より多くのデータを収集することです。
リソース
Pythonを使ってTwitter APIにアクセスする方法についてもっと学びたいですか?Byte-Sized-Chunks のようなコースをチェックしてみてください。Pythonでデータサイエンス・プロジェクトにTwitter APIを使用するためのより深い洞察については、Byte-Sized-Chunks: Twitter Sentiment Analysis in Pythonのようなコースをチェックしてみてください。
結論
このブログ記事では、Twitter APIのかなり控えめな部分を紹介しました。Twitterは世論を理解し、調査や市場分析を行うための非常に強力なツールであり、したがってそのAPIは、企業が自社の業務範囲に関連する洞察を引き出すための自動化ツールを作成するための素晴らしい方法となります。また、企業だけでなく、個人でもクリエイティブなアプリを作るためにAPIを利用することができるだろう。
また、最も人気のあるPythonラッパーをいくつかリストアップしましたが、ラッパーによってTwitter APIの異なる可能性が実装されていることに注意することが重要です。したがって、目的に応じてPythonラッパーを選択する必要があります。Search APIとStreaming APIで示した2つの例では、ツイートを収集するプロセスと、そこから得られる可能性のあるいくつかの知見を簡単に説明しました。自分でも自由に作ってみてください。
参考文献
- ジョエル・グルス著「ゼロからはじめるデータサイエンス」(書籍)
- Twitter API – ドキュメント
-
geopy
ライブラリ – Pypi ウェブページ -
gmplot
ライブラリ – GitHub プロジェクト