最近、AYXが勝手に損切りされたので、その資金でモンゴDBを買いました。衝動的に買ったわけではなく、実は上場時から密かに目をつけていた銘柄です。
知らない人のためにざっくりと紹介しますと、モンゴDBはNoSQLのデータベースで首位のオープンソースソフトウェアです。たまに打倒オラクル的な言い方をする人も言いますが、そもそもNoSQLとRDB製品は用途が違うので直接的な競合関係にはないです。
将来的にはIoT系の雑多なデータが多くなってくるので、NoSQLのニーズは拡大していくと考えられています。
そこで本記事ではモンゴDBを紹介したいと思います。
スポンサーリンク
Twitter APIを使ってみる
モンゴDBをただ紹介しても芸がないので、こんな感じで使うものですよというところに触れてみようと思います。
そこで今回は身近なおもちゃとしてTwitterのAPIで遊んでいきたいと思います。
まず、ツイッターのAPIに接続します。接続にはキー情報が必要なため、事前にツイッターAPIに利用登録をして、consumer_key,consumer_secret,access_token,acsess_secretの4つを取得してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#必要なパッケージをインポート from requests_oauthlib import OAuth1Session from requests.exceptions import ConnectionError, ReadTimeout, SSLError import json, datetime, time, pytz, re, sys,traceback, pymongo from pymongo import MongoClient from collections import defaultdict import numpy as np twitter = None #Twitter APIへの接続。Keyは事前に入手。 def initialize(): # twitter接続情報 global twitter, twitter twitter = OAuth1Session(KEYS['consumer_key'],KEYS['consumer_secret'], KEYS['access_token'],KEYS['access_secret']) initialize() |
これでツイッターAPIが利用可能になりました。
次に、データを取得してみます。
取得できるデータは色々ありますが、今回は一番シンプルにキーワード検索に引っかかったツイートを取得するためにserchTWという関数を作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
##ツイッターからキーワードを検索して取得する関数 def serchTW(q): #ツイートを検索する用のエンドポイント url = 'https://api.twitter.com/1.1/search/tweets.json' params = {'q':q+" exclude:nativeretweets", 'result_type':'mixed', "locale":"ja", 'count':100} req = twitter.get(url, params = params) # Tweetデータの取得 serchtweet = json.loads(req.text) #json形式変換 #取得したデータのツイート部分のみを表示 for i in range(len(serchtweet["statuses"])): print("********************",i,"*************************") print(serchtweet["statuses"][i]["user"]["name"],":",serchtweet["statuses"][i]["text"]) #取得したツイートデータ全体を返す return serchtweet["statuses"] |
ということで、関数ができたため早速使ってみましょう。
とりあえず、パッと思いついたキーワードを突っ込んで検索してみた結果は以下の通りです。
APIの制限上、1回で取得できるツイートは100件までなのですが、流石ツイッタランドのマスコット的存在だけあり、余裕で100件分のツイートが取得することができました。
ツイートデータをモンゴDBに入れてみる
さて、前述の表示はあくまでツイート部分のみを抽出しましたが、次に取得できたデータの中身をみてみます。以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
{'contributors': None, 'coordinates': None, 'created_at': 'Mon Sep 17 13:24:12 +0000 2018', 'entities': {'hashtags': [], 'symbols': [], 'urls': [], 'user_mentions': []}, 'favorite_count': 4, 'favorited': False, 'geo': None, 'id': 1041679213944684545, 'id_str': '1041679213944684545', 'in_reply_to_screen_name': None, 'in_reply_to_status_id': None, 'in_reply_to_status_id_str': None, 'in_reply_to_user_id': None, 'in_reply_to_user_id_str': None, 'is_quote_status': False, 'lang': 'ja', 'metadata': {'iso_language_code': 'ja', 'result_type': 'recent'}, 'place': None, 'retweet_count': 1, 'retweeted': False, 'source': '<a href="http://twitter.com/download/android" rel="nofollow">Twitter for Android</a>', 'text': 'ほんきの田中ちゃん見せつけるまでアジデンも眠らないよ', 'truncated': False, 'user': {'contributors_enabled': False, 'created_at': 'Thu Apr 06 07:03:38 +0000 2017', 'default_profile': True, 'default_profile_image': False, 'description': 'fuck you money', 'entities': {'description': {'urls': []}, 'url': {'urls': [{'display_url': 'kutsumigaki.blog.fc2.com', 'expanded_url': 'http://kutsumigaki.blog.fc2.com/', 'indices': [0, 23], 'url': 'https://t.co/cKBKJDZHyI'}]}}, 'favourites_count': 5450, 'follow_request_sent': False, 'followers_count': 1642, 'following': True, 'friends_count': 973, 'geo_enabled': False, 'has_extended_profile': False, 'id': 849880256760631296, 'id_str': '849880256760631296', 'is_translation_enabled': False, 'is_translator': False, 'lang': 'ja', 'listed_count': 19, 'location': 'NYSE', 'name': 'アジデン(ナチュラル畜生)', 'notifications': False, 'profile_background_color': 'F5F8FA', 'profile_background_image_url': None, 'profile_background_image_url_https': None, 'profile_background_tile': False, 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/849880256760631296/1505426093', 'profile_image_url': 'http://pbs.twimg.com/profile_images/1042230082343907328/Pv4rG1T2_normal.jpg', 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1042230082343907328/Pv4rG1T2_normal.jpg', 'profile_link_color': '1DA1F2', 'profile_sidebar_border_color': 'C0DEED', 'profile_sidebar_fill_color': 'DDEEF6', 'profile_text_color': '333333', 'profile_use_background_image': True, 'protected': False, 'screen_name': 'asian_dangerous', 'statuses_count': 33756, 'time_zone': None, 'translator_type': 'none', 'url': 'https://t.co/cKBKJDZHyI', 'utc_offset': None, 'verified': False}}, |
ちなみにこれは1ツイートあたりのデータの全量です。実際にはこのデータが100件分あります。
呟いた人のIDや名前は当然ですが、ファボ数やリツイート数、画像やリンクの有無、などなどありとあらゆるデータがAPI経由で取得できるわけです。
上記のようなデータ形式はJSON形式といって最近、流行ってる気がします。キーとデータが一意に紐づけられるし、csvと違って人が見てもある程度解釈できるといった点が利点です。
そしてこのようなJSON形式のデータを簡単に保管しておけるのがモンゴDBさんです。
なお、手順ですが、以下の手順は予め行ったことを前提にpythonで突っ込むところから記載します。
- モンゴDBをダウンロードしてPCにインストールする
- pythonから扱うのでpipからpymongoをインストールする
- 事前にモンゴDBは起動しておく
それではpythonからモンゴDBに接続し、データを格納してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from pymongo import MongoClient # MongoDBに接続 client = pymongo.MongoClient('localhost', 27017) # データベース「test_db」を作成 db = client.test_db # tweetというコレクション(RDBのテーブルと同義)を作成 db_tweet = db.tweet # コレクションに取得したtweetデータをインサート db_tweet.insert_many(tweet) |
これだけです。接続からtweetデータのインサートまででたった5行です。
insertされたtweetというデータはさっきAPIから取得したツイートデータの全量ですが、たった一行でDBにぶち込むことに成功しています。これがmongoDBがお手軽で支持されている真骨頂ですね。
本当に入ったか確認してみましょう。DBの中身をリストで表示したのが以下の結果です。
このように問題なく取得できています。
モンゴDBのデータを弄ってみる
DBにデータさえ入ってしまえばこっちのものです。データは自由自在に扱えます。
例えば以下のように、「誰が」、「どんなツイートを呟いたか」だけを抜き取って表示してみるとこんな感じです。
また、普段からアジデンさんと仲が良いわかま屋さんが、どれだけアジデンさんのことを愛しているかを知りたくなったら、以下のようにわかま屋さんのアジデン呟きだけを抽出することも容易いです。
まとめと今後について
本記事ではJSON形式のデータを簡単に扱えるNoSQLデータベースのmongoDBを紹介しました。RDBのようにリレーションの設計をしたりする手間がなく、何でもかんでもガンガン入れられるところがとても使い勝手のいいDBで個人的には好きです。
そして奇妙な副産物として、mongoDBを紹介する過程で世の中の「アジデン」呟きを100件分取得することができてしまいました。
こちらについては引き続き色々分析して遊んでいきたいと思います。
例えば、
- 形態素解析にかけて、アジデン呟きの傾向をみてみる
- 単純に使われているキーワードとか、誰が一番、アジデン愛があるかとかをみてみる
- むしろアジデンさん本人のツイートを数千件溜め込んだ上で、ディープラーニングでアジデンBOTを作ってみる
- アジデンさんのツイートに速攻でクソリプをつけるBOTを作ってみる
などなど、モンゴDBが使いこなせれば可能性は無限大ですね!