{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Tutorial Outline\n", "\n", "- [Introduction](#Introduction)\n", "- [Preprerequisites](#Preprerequisites)\n", "- [How does it work?](#How-does-it-work?)\n", "- [Authentication](#Authentication)\n", " - [Authentication keys](#Authentication-keys)\n", "- [MongoDB Collection](#MongoDB-Collection)\n", "- [Starting a Stream](#Starting-a-Stream)\n", " - [Stream Listener](#Stream-Listener)\n", " - [Connect to a streaming API](#Connect-to-a-streaming-API)\n", "- [Data Access and Analysis](#Data-Access-and-Analysis)\n", " - [Load results to a DataFrame](#Load-results-to-a-DataFrame)\n", "- [Visualization](#Visualization)\n", "\n", "# Introduction\n", "\n", "Twitter provides two types of API to access their data:\n", "\n", "- RESTful API: Used to get data about existing data objects like statuses \"tweets\", user, ... etc\n", "- Streaming API: Used to get live statuses \"tweets\" as they are sent\n", "\n", "The reason why you would like to use streaming API:\n", "\n", "- Capture large amount of data because RESTful API has limited access to older data\n", "- Real-time analysis like monitoring social discussion about a live event\n", "- In house archive like archiving social discussion about your brand(s)\n", "- AI response system for a twitter account like automated reply and filing questions or providing answers\n", "\n", "# Preprerequisites\n", "\n", "- Python 2 or 3\n", "- Jupyter /w IPyWidgets\n", "- Pandas\n", "- Numpy\n", "- Matplotlib\n", "- MogoDB Installtion\n", "- Pymongo\n", "- Scikit-learn\n", "- Tweepy\n", "- Twitter account\n", "\n", "\n", "# How does it work?\n", "\n", "Twitter streaming API can provide data through a streaming HTTP response. This is very similar to downloading a file where you read a number of bytes and store it to disk and repeat until the end of file. The only difference is this stream is endless. The only things that could stop this stream are:\n", "\n", "- If you closed your connection to the streaming response\n", "- If your connection speed is not capable of receiving data and the servers buffer is filling up\n", "\n", "This means that this process will be using the thread that it was launched from until it is stopped. In production, you should always start this in a different thread or process to make sure your software doesn't freeze until you stop the stream.\n", "\n", "# Authentication\n", "\n", "You will need four numbers from twitter development to start using streaming API. First, let's import some important libraries for dealing with twitter API, data analysis, data storage ... etc" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import tweepy\n", "import matplotlib.pyplot as plt\n", "import pymongo\n", "import ipywidgets as wgt\n", "from IPython.display import display\n", "from sklearn.feature_extraction.text import CountVectorizer\n", "import re\n", "from datetime import datetime\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Authentication keys\n", "\n", "1. Go to https://apps.twitter.com/\n", "2. Create an App (if you don't have one yet)\n", "3. Grant read-only access to your account\n", "4. Copy the four keys and paste them here:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "api_key = \"yP0yoCitoUNgD63ebMerGyJaE\" # <---- Add your API Key\n", "api_secret = \"kLO5YUtlth3cd4lOHLy8nlLHW5npVQgUfO4FhsyCn6wCMIz5E6\" # <---- Add your API Secret\n", "access_token = \"259862037-iMXNjfL8JBApm4LVcdfwc3FcMm7Xta4TKg5cd44K\" # <---- Add your access token\n", "access_token_secret = \"UIgh08dtmavzlvlWWukIXwN5HDIQD0wNwyn5sPzhrynBf\" # <---- Add your access token secret\n", "\n", "auth = tweepy.OAuthHandler(api_key, api_secret)\n", "auth.set_access_token(access_token, access_token_secret)\n", "\n", "api = tweepy.API(auth)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# MongoDB Collection\n", "\n", "Connect to MongoDB and create/get a collection." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2251" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "col = pymongo.MongoClient()[\"tweets\"][\"StreamingTutorial\"]\n", "col.count()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Starting a Stream\n", "\n", "We need a listener which should extend `tweepy.StreamListener` class. There is a number of methods that you can extend to instruct the listener class to perform functionality. Some of the important methods are:\n", "\n", "- `on_status(self, status)`: This will pass a status \"tweet\" object when a tweet is received\n", "- `on_data(self, raw_data)`: Called when any any data is received and the raw data will be passed\n", "- `on_error(self, status_code)`: Called when you get a response with code other than 200 (ok)\n", "\n", "## Stream Listener" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "class MyStreamListener(tweepy.StreamListener):\n", " \n", " counter = 0\n", " \n", " def __init__(self, max_tweets=1000, *args, **kwargs):\n", " self.max_tweets = max_tweets\n", " self.counter = 0\n", " super().__init__(*args, **kwargs)\n", " \n", " def on_connect(self):\n", " self.counter = 0\n", " self.start_time = datetime.now()\n", " \n", " def on_status(self, status):\n", " # Increment counter\n", " self.counter += 1\n", " \n", " # Store tweet to MongoDB\n", " col.insert_one(status._json)\n", " \n", " \n", " if self.counter % 1 == 0:\n", " value = int(100.00 * self.counter / self.max_tweets)\n", " mining_time = datetime.now() - self.start_time\n", " progress_bar.value = value\n", " html_value = \"\"\"Tweets/Sec: %.1f\"\"\" % (self.counter / max([1,mining_time.seconds]))\n", " html_value += \"\"\" Progress: %.1f%%\"\"\" % (self.counter / self.max_tweets * 100.0)\n", " html_value += \"\"\" ETA: %.1f Sec\"\"\" % ((self.max_tweets - self.counter) / (self.counter / max([1,mining_time.seconds])))\n", " wgt_status.value = html_value\n", " #print(\"%s/%s\" % (self.counter, self.max_tweets))\n", " if self.counter >= self.max_tweets:\n", " myStream.disconnect()\n", " print(\"Finished\")\n", " print(\"Total Mining Time: %s\" % (mining_time))\n", " print(\"Tweets/Sec: %.1f\" % (self.max_tweets / mining_time.seconds))\n", " progress_bar.value = 0\n", " \n", " \n", "myStreamListener = MyStreamListener(max_tweets=100)\n", "myStream = tweepy.Stream(auth = api.auth, listener=myStreamListener)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Connect to a streaming API\n", "\n", "There are two methods to connect to a stream:\n", "\n", "- `filter(follow=None, track=None, async=False, locations=None, stall_warnings=False, languages=None, encoding='utf8', filter_level=None)`\n", "- `firehose(count=None, async=False)`\n", "\n", "Firehose captures everything. You should make sure that you have connection speed that can handle the stream and you have the storage capacity that can store these tweets at the same rate. We cannot really use firehose for this tutorial but we'll be using `filter`.\n", "\n", "You have to specify one of two things to filter:\n", "\n", "- `follow`: A list of user ID to follow. This will stream all their tweets, retweets, and others retweeting their tweets. This doesn't include mentions and manual retweets where the user doesn't press the retweet button.\n", "- `track`: A string or list of string to be used for filtering. If you use multiple words separated by spaces, this will be used for AND operator. If you use multiple words in a string separated by commas or pass a list of words this will be treated as OR operator.\n", "\n", "**Note**: `track` is case insensitive.\n", "\n", "### What to track?\n", "I want to collect all tweets that contains any of these words:\n", "\n", "- Jupyter\n", "- Python\n", "- Data Mining\n", "- Machine Learning\n", "- Data Science\n", "- Big Data\n", "- IoT\n", "- #R\n", "\n", "This could be done with a string or a list. It is easier to to it with a list to make your code clear to read." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Finished\n", "Total Mining Time: 0:01:21.477351\n", "Tweets/Sec: 1.2\n", "Tweets collected: 100\n", "Total tweets in collection: 2351\n" ] } ], "source": [ "keywords = [\"Jupyter\",\n", " \"Python\",\n", " \"Data Mining\",\n", " \"Machine Learning\",\n", " \"Data Science\",\n", " \"Big Data\",\n", " \"DataMining\",\n", " \"MachineLearning\",\n", " \"DataScience\",\n", " \"BigData\",\n", " \"IoT\",\n", " \"#R\",\n", " ]\n", "\n", "# Visualize a progress bar to track progress\n", "progress_bar = wgt.IntProgress(value=0)\n", "display(progress_bar)\n", "wgt_status = wgt.HTML(value=\"\"\"Tweets/Sec: 0.0\"\"\")\n", "display(wgt_status)\n", "\n", "# Start a filter with an error counter of 20\n", "for error_counter in range(20):\n", " try:\n", " myStream.filter(track=keywords)\n", " print(\"Tweets collected: %s\" % myStream.listener.counter)\n", " print(\"Total tweets in collection: %s\" % col.count())\n", " break\n", " except:\n", " print(\"ERROR# %s\" % (error_counter + 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Data Access and Analysis\n", "\n", "Now that we have stored all these tweets in a MongoDB collection, let's take a look at one of these tweets" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{'_id': ObjectId('56937d2e105f1970314720e2'),\n", " 'contributors': None,\n", " 'coordinates': None,\n", " 'created_at': 'Mon Jan 11 10:00:14 +0000 2016',\n", " 'entities': {'hashtags': [{'indices': [22, 27], 'text': 'Rã®æ³•å‰‡'}],\n", " 'symbols': [],\n", " 'urls': [],\n", " 'user_mentions': []},\n", " 'favorite_count': 0,\n", " 'favorited': False,\n", " 'filter_level': 'low',\n", " 'geo': None,\n", " 'id': 686487772970942466,\n", " 'id_str': '686487772970942466',\n", " 'in_reply_to_screen_name': None,\n", " 'in_reply_to_status_id': None,\n", " 'in_reply_to_status_id_str': None,\n", " 'in_reply_to_user_id': None,\n", " 'in_reply_to_user_id_str': None,\n", " 'is_quote_status': False,\n", " 'lang': 'ja',\n", " 'place': None,\n", " 'retweet_count': 0,\n", " 'retweeted': False,\n", " 'source': 'Twitter for iPhone',\n", " 'text': '体力è½ã¡ã¦ãã¦ãŠã°ã•ã‚“ã¿ãŸã„ã«ãªã£ã¦ããŸã€‚\\n#Rã®æ³•å‰‡',\n", " 'timestamp_ms': '1452506414059',\n", " 'truncated': False,\n", " 'user': {'contributors_enabled': False,\n", " 'created_at': 'Tue Aug 18 16:19:16 +0000 2015',\n", " 'default_profile': True,\n", " 'default_profile_image': False,\n", " 'description': '☮ 関ジャニ∞ & 山田涼介 & Justin Bieber & Benjamin Lasnier & Selena Gomez ☮',\n", " 'favourites_count': 1121,\n", " 'follow_request_sent': None,\n", " 'followers_count': 121,\n", " 'following': None,\n", " 'friends_count': 92,\n", " 'geo_enabled': True,\n", " 'id': 3318871652,\n", " 'id_str': '3318871652',\n", " 'is_translator': False,\n", " 'lang': 'en',\n", " 'listed_count': 0,\n", " 'location': 'The land of dreams',\n", " 'name': 'rena',\n", " 'notifications': None,\n", " 'profile_background_color': 'C0DEED',\n", " 'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png',\n", " 'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png',\n", " 'profile_background_tile': False,\n", " 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/3318871652/1452436374',\n", " 'profile_image_url': 'http://pbs.twimg.com/profile_images/683964013558931456/Q1rx1s5b_normal.jpg',\n", " 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/683964013558931456/Q1rx1s5b_normal.jpg',\n", " 'profile_link_color': '0084B4',\n", " 'profile_sidebar_border_color': 'C0DEED',\n", " 'profile_sidebar_fill_color': 'DDEEF6',\n", " 'profile_text_color': '333333',\n", " 'profile_use_background_image': True,\n", " 'protected': False,\n", " 'screen_name': 'Q2HpiJwCX1huBwf',\n", " 'statuses_count': 497,\n", " 'time_zone': None,\n", " 'url': None,\n", " 'utc_offset': None,\n", " 'verified': False}}" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "col.find_one()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load results to a DataFrame" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", " | created_at | \n", "source | \n", "text | \n", "user | \n", "
---|---|---|---|---|
0 | \n", "Mon Jan 11 10:00:14 +0000 2016 | \n", "<a href=\"http://twitter.com/download/iphone\" r... | \n", "体力è½ã¡ã¦ãã¦ãŠã°ã•ã‚“ã¿ãŸã„ã«ãªã£ã¦ããŸã€‚\\n#Rã®æ³•å‰‡ | \n", "@Q2HpiJwCX1huBwf | \n", "
1 | \n", "Mon Jan 11 10:09:26 +0000 2016 | \n", "<a href=\"http://twitter.com/download/android\" ... | \n", "皆ã«ãŠã°ã•ã‚“ã¨è¨€ã‚ã‚Œã¦ã†ã‚Œã—ãŒã£ã¦ã‚‹ #Rã®æ³•å‰‡ | \n", "@Tamutamu1017 | \n", "
2 | \n", "Mon Jan 11 10:00:10 +0000 2016 | \n", "<a href=\"http://trendkeyword.blog.jp/\" rel=\"no... | \n", "ã€R.I.P】急上昇ワード「R.I.Pã€ã®ã¾ã¨ã‚é€Ÿå ± https://t.co/yi1yfC... | \n", "@pickword_matome | \n", "
3 | \n", "Mon Jan 11 10:00:10 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "#Rã®æ³•å‰‡ \\nã©ã‚Œã‚‚ãŠã°ã•ã‚“è‡ã„ã‘ã‚Œã©ã‚„ã£ã±ã‚Šé»„色ãŒä¸€ç•ªã ãªã | \n", "@kakinotise | \n", "
4 | \n", "Mon Jan 11 10:00:10 +0000 2016 | \n", "<a href=\"http://bufferapp.com\" rel=\"nofollow\">... | \n", "The New Best Thing HP ATP - Vertica Big Data S... | \n", "@DataCentreNews1 | \n", "
5 | \n", "Mon Jan 11 10:00:11 +0000 2016 | \n", "<a href=\"http://dlvr.it\" rel=\"nofollow\">dlvr.i... | \n", "IoT Now: l’Internet of Things è qui, ora https... | \n", "@datamanager_it | \n", "
6 | \n", "Mon Jan 11 10:00:11 +0000 2016 | \n", "<a href=\"http://trendkeyword.doorblog.jp/\" rel... | \n", "今話題ã®ã€ŒR.I.Pã€ã¾ã¨ã‚ https://t.co/VOc5cwK5hg #R.I.P ... | \n", "@buzz_wadai | \n", "
7 | \n", "Mon Jan 11 10:00:11 +0000 2016 | \n", "<a href=\"http://twitterfeed.com\" rel=\"nofollow... | \n", "#oldham #stockport VIDEO: Snake thief hides py... | \n", "@Labour_is_PIE | \n", "
8 | \n", "Mon Jan 11 10:00:11 +0000 2016 | \n", "<a href=\"https://about.twitter.com/products/tw... | \n", "Las #startup pioneras de #machinelearning ofre... | \n", "@techreview_es | \n", "
9 | \n", "Mon Jan 11 10:00:12 +0000 2016 | \n", "<a href=\"http://www.linkedin.com/\" rel=\"nofoll... | \n", "Lets talk about how to harness the power of ma... | \n", "@jansmit1 | \n", "
10 | \n", "Mon Jan 11 10:00:13 +0000 2016 | \n", "<a href=\"http://catalystfive.com\" rel=\"nofollo... | \n", "Business Intelligence and Big Data Consulting ... | \n", "@Catalyst5Jobs | \n", "
11 | \n", "Mon Jan 11 10:00:13 +0000 2016 | \n", "<a href=\"http://twitter.com/NewsICT\" rel=\"nofo... | \n", "[æƒ…å ±é€šä¿¡]2016å¹´å°åŒ—国際コンピューター見本市ãŒæ–°ã—ã„ä½ç½®ã¥ã‘ã¨æ–°ã—ã„展示ã§è£…ã„æ–°ãŸã«ï¼... | \n", "@NewsICT | \n", "
12 | \n", "Mon Jan 11 10:02:10 +0000 2016 | \n", "<a href=\"http://dlvr.it\" rel=\"nofollow\">dlvr.i... | \n", "#bonplan Parties de Laser Quest entre amis à 2... | \n", "@Bons_Plans_ | \n", "
13 | \n", "Mon Jan 11 10:02:10 +0000 2016 | \n", "<a href=\"http://dlvr.it\" rel=\"nofollow\">dlvr.i... | \n", "Parties de Laser Quest entre amis à 22.00€ au ... | \n", "@keepmymindfree | \n", "
14 | \n", "Mon Jan 11 10:02:10 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "RT @jose_garde: Why a Simple Data Analytics St... | \n", "@martingeldish | \n", "
15 | \n", "Mon Jan 11 10:02:11 +0000 2016 | \n", "<a href=\"http://twitter.com/download/iphone\" r... | \n", "芸能人ã®äººãŸãã•ã‚“手ãŸãŸã笑ã„ã—ã¦ã‚‹ã‹ã‚‰ãŠã°ã•ã‚“ãŸãã•ã‚“ã«ãªã£ã¡ã‚ƒã†ã‚ˆwww\\n\\n#Rã®æ³•å‰‡ | \n", "@YK__0704 | \n", "
16 | \n", "Mon Jan 11 10:02:12 +0000 2016 | \n", "<a href=\"http://dlvr.it\" rel=\"nofollow\">dlvr.i... | \n", "Découvrez le jeu Pure Mission entre amis à 22.... | \n", "@keepmymindfree | \n", "
17 | \n", "Mon Jan 11 10:02:12 +0000 2016 | \n", "<a href=\"http://dlvr.it\" rel=\"nofollow\">dlvr.i... | \n", "#bonplan Parties de bowling pour 4 Ã #POINCY :... | \n", "@Bons_Plans_ | \n", "
18 | \n", "Mon Jan 11 10:02:12 +0000 2016 | \n", "<a href=\"http://dlvr.it\" rel=\"nofollow\">dlvr.i... | \n", "20 min de vol découverte ULM pour 1 ou 2 à 79.... | \n", "@CrationSiteWeb | \n", "
19 | \n", "Mon Jan 11 10:02:12 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "RT @hortonworks: Paris is the city of love but... | \n", "@bigdataparis | \n", "
20 | \n", "Mon Jan 11 10:02:12 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "RT @hynek: So #emacs / @spacemacs nerds: is th... | \n", "@fdiesch | \n", "
21 | \n", "Mon Jan 11 10:02:12 +0000 2016 | \n", "<a href=\"http://www.hootsuite.com\" rel=\"nofoll... | \n", ".@QonexCyber founder member of @IoT_SF is orga... | \n", "@QonexCyber | \n", "
22 | \n", "Mon Jan 11 10:02:13 +0000 2016 | \n", "<a href=\"http://dlvr.it\" rel=\"nofollow\">dlvr.i... | \n", "Parties de bowling pour 4 à #POINCY : 35.00€ a... | \n", "@keepmymindfree | \n", "
23 | \n", "Mon Jan 11 10:02:13 +0000 2016 | \n", "<a href=\"http://dlvr.it\" rel=\"nofollow\">dlvr.i... | \n", "#bonplan 30 séances de Squash à #LISSES : 39.9... | \n", "@Bons_Plans_ | \n", "
24 | \n", "Mon Jan 11 10:02:13 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "App: ExZeus 2 – free to play https://t.co/ZT... | \n", "@UniversalConsol | \n", "
25 | \n", "Mon Jan 11 10:02:13 +0000 2016 | \n", "<a href=\"http://dlvr.it\" rel=\"nofollow\">dlvr.i... | \n", "#discount Parties de bowling pour 4 Ã #POINCY ... | \n", "@PromosPromos | \n", "
26 | \n", "Mon Jan 11 10:02:13 +0000 2016 | \n", "<a href=\"http://www.google.com/\" rel=\"nofollow... | \n", "spiegel.de : Tier macht Sachen: Python beißt ... | \n", "@arminfischer_de | \n", "
27 | \n", "Mon Jan 11 10:09:02 +0000 2016 | \n", "<a href=\"http://twitter.com/download/android\" ... | \n", "è‹¥ã„ã£ã¦ã„ã„ããˆâ€¦ã£ã¦ã‚ˆã言ã†w #Rã®æ³•å‰‡ | \n", "@naco75x | \n", "
28 | \n", "Mon Jan 11 10:09:17 +0000 2016 | \n", "<a href=\"http://twitter.com/download/iphone\" r... | \n", "最近ã®è‹¥ã„åã¯æœ€è¿‘使ã£ãŸ\\n#Rã®æ³•å‰‡ | \n", "@K1224West | \n", "
29 | \n", "Mon Jan 11 10:09:19 +0000 2016 | \n", "<a href=\"http://twitter.com/download/android\" ... | \n", "#Rã®æ³•å‰‡\\n自分も若者ãªã®ã«ç¬‘ | \n", "@V6ZRRT7Q22BZ1cF | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
2221 | \n", "Mon Jan 11 10:29:40 +0000 2016 | \n", "<a href=\"http://201512291327-7430af.bitnamiapp... | \n", "https://t.co/BTAAq6HuuJ - pcgamer - #machinele... | \n", "@vinceyue | \n", "
2222 | \n", "Mon Jan 11 10:29:40 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "RT @jose_garde: The Big Data Analytics Softwar... | \n", "@LJ_Blanchard | \n", "
2223 | \n", "Mon Jan 11 10:29:41 +0000 2016 | \n", "<a href=\"http://www.linkedin.com/\" rel=\"nofoll... | \n", "What is data mining? Do you have to be a mathe... | \n", "@ednuwan | \n", "
2224 | \n", "Mon Jan 11 10:29:41 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "RT @AgroKnow: A #BigData platform for the futu... | \n", "@albertspijkers | \n", "
2225 | \n", "Mon Jan 11 10:29:42 +0000 2016 | \n", "<a href=\"http://www.linkedin.com/\" rel=\"nofoll... | \n", "Big Data: Is It A Tsunami, The New Oil, Or Sim... | \n", "@Summerlovegrove | \n", "
2226 | \n", "Mon Jan 11 10:29:43 +0000 2016 | \n", "<a href=\"https://www.jobfindly.com/php-jobs.ht... | \n", "Sr Software Engineer C Php Python Linux Jobs i... | \n", "@jobfindlyphpdev | \n", "
2227 | \n", "Mon Jan 11 10:29:43 +0000 2016 | \n", "<a href=\"http://twitter.com/download/iphone\" r... | \n", "RT @bigdataparis: #Bigdata bang : un marché en... | \n", "@LifeIsWeb | \n", "
2228 | \n", "Mon Jan 11 10:29:43 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "Learn from the best professors in India .. cou... | \n", "@ashwaniapex | \n", "
2229 | \n", "Mon Jan 11 10:29:45 +0000 2016 | \n", "<a href=\"http://getsmoup.com\" rel=\"nofollow\">S... | \n", "RT @rebrandtoday: #startup or #rebrand -Buy Cr... | \n", "@SmartData_Fr | \n", "
2230 | \n", "Mon Jan 11 10:29:45 +0000 2016 | \n", "<a href=\"http://www.ajaymatharu.com/\" rel=\"nof... | \n", "¿Cómo será el futuro del Big Data? https://t.c... | \n", "@eduardogarsanch | \n", "
2231 | \n", "Mon Jan 11 10:29:46 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "RT @jose_garde: 3 Ways to Transform Your Compa... | \n", "@LJ_Blanchard | \n", "
2232 | \n", "Mon Jan 11 10:29:46 +0000 2016 | \n", "<a href=\"http://publicize.wp.com/\" rel=\"nofoll... | \n", "Woman Tries To Kiss Python, Gets Bitten In The... | \n", "@NAIJA_VIBEZ | \n", "
2233 | \n", "Mon Jan 11 10:29:46 +0000 2016 | \n", "<a href=\"http://www.itknowingness.com\" rel=\"no... | \n", "RT @jose_garde: 3 Ways to Transform Your Compa... | \n", "@itknowingness | \n", "
2234 | \n", "Mon Jan 11 10:29:48 +0000 2016 | \n", "<a href=\"http://twitter.com/download/iphone\" r... | \n", "RT @ErikaPauwels: Building a #BigData platform... | \n", "@impulsater | \n", "
2235 | \n", "Mon Jan 11 10:29:49 +0000 2016 | \n", "<a href=\"http://twitter.com/download/android\" ... | \n", "En 2016 j'aimerais moins râler. #résolution. S... | \n", "@ce1ce2makarenko | \n", "
2236 | \n", "Mon Jan 11 10:29:51 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "RT @jose_garde: How Marketing Can Be Better Au... | \n", "@LJ_Blanchard | \n", "
2237 | \n", "Mon Jan 11 10:29:51 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "Hey @Pontifex accueille ces réfugiées dans ta ... | \n", "@Atmosfive | \n", "
2238 | \n", "Mon Jan 11 10:29:51 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "RT @Ubixr: .@GroupeLaPoste choisit le toulousa... | \n", "@The_Nextwork | \n", "
2239 | \n", "Mon Jan 11 10:29:56 +0000 2016 | \n", "<a href=\"http://twitterfeed.com\" rel=\"nofollow... | \n", "Thanks @hackplayers Blade: un webshell en Pyth... | \n", "@Navarmedia | \n", "
2240 | \n", "Mon Jan 11 10:29:56 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "RT @jose_garde: Which big data personality are... | \n", "@LJ_Blanchard | \n", "
2241 | \n", "Mon Jan 11 10:29:56 +0000 2016 | \n", "<a href=\"http://ifttt.com\" rel=\"nofollow\">IFTT... | \n", "Cybersecurity Forum tackles challenges with th... | \n", "@wulfsec | \n", "
2242 | \n", "Mon Jan 11 10:29:56 +0000 2016 | \n", "<a href=\"http://publicize.wp.com/\" rel=\"nofoll... | \n", "Woman Tries To Kiss Python, Gets Bitten In The... | \n", "@Lola2Records | \n", "
2243 | \n", "Mon Jan 11 10:29:56 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "RT @TeamAnodot: Join David Drai, CEO of Anodot... | \n", "@iottechexpo | \n", "
2244 | \n", "Mon Jan 11 10:29:57 +0000 2016 | \n", "<a href=\"http://getsmoup.com\" rel=\"nofollow\">A... | \n", "RT @rebrandtoday: #startup or #rebrand -Buy Cr... | \n", "@AI__news | \n", "
2245 | \n", "Mon Jan 11 10:29:57 +0000 2016 | \n", "<a href=\"http://www.twitter.com\" rel=\"nofollow... | \n", "RT @Matthis__VERNON: \"@Fred_Poquet Sans #confi... | \n", "@sibueta | \n", "
2246 | \n", "Mon Jan 11 10:29:57 +0000 2016 | \n", "<a href=\"https://social.zoho.com\" rel=\"nofollo... | \n", "The right place for #BigData is #Cloud #Storag... | \n", "@TyroneSystems | \n", "
2247 | \n", "Mon Jan 11 10:29:59 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "RT @PEBlanrue: Il a toujours le mot pour rire,... | \n", "@lesroisduring | \n", "
2248 | \n", "Mon Jan 11 10:29:58 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "RT @DigitalAgendaEU: €15 million for a #IoT so... | \n", "@ImproveNPA | \n", "
2249 | \n", "Mon Jan 11 10:29:59 +0000 2016 | \n", "<a href=\"http://twitter.com\" rel=\"nofollow\">Tw... | \n", "Neat IoT innovation https://t.co/atARX0m5Bj | \n", "@sherwinnovator | \n", "
2250 | \n", "Mon Jan 11 10:30:00 +0000 2016 | \n", "<a href=\"http://www.hubspot.com/\" rel=\"nofollo... | \n", "Check out our #Mobile App Predicitions for 201... | \n", "@B60uk | \n", "
2251 rows × 4 columns
\n", "\n", " | word | \n", "count | \n", "
---|---|---|
0 | \n", "https | \n", "1986 | \n", "
1 | \n", "co | \n", "1907 | \n", "
2 | \n", "rt | \n", "804 | \n", "
3 | \n", "de | \n", "550 | \n", "
4 | \n", "rã®æ³•å‰‡ | \n", "408 | \n", "
5 | \n", "iot | \n", "374 | \n", "
6 | \n", "the | \n", "358 | \n", "
7 | \n", "bigdata | \n", "293 | \n", "
8 | \n", "00 | \n", "275 | \n", "
9 | \n", "data | \n", "250 | \n", "
10 | \n", "in | \n", "234 | \n", "
11 | \n", "python | \n", "219 | \n", "
12 | \n", "to | \n", "212 | \n", "
13 | \n", "au | \n", "199 | \n", "
14 | \n", "of | \n", "188 | \n", "
15 | \n", "lieu | \n", "168 | \n", "
16 | \n", "réduction | \n", "166 | \n", "
17 | \n", "big | \n", "157 | \n", "
18 | \n", "on | \n", "143 | \n", "
19 | \n", "is | \n", "142 | \n", "
20 | \n", "and | \n", "140 | \n", "
21 | \n", "for | \n", "136 | \n", "
22 | \n", "analytics | \n", "107 | \n", "
23 | \n", "le | \n", "89 | \n", "
24 | \n", "via | \n", "86 | \n", "
25 | \n", "you | \n", "86 | \n", "
26 | \n", "thingsexpo | \n", "86 | \n", "
27 | \n", "by | \n", "85 | \n", "
28 | \n", "2016 | \n", "84 | \n", "
29 | \n", "snake | \n", "80 | \n", "
30 | \n", "en | \n", "76 | \n", "
31 | \n", "bowie | \n", "75 | \n", "
32 | \n", "la | \n", "74 | \n", "
33 | \n", "thief | \n", "74 | \n", "
34 | \n", "video | \n", "73 | \n", "
35 | \n", "m2m | \n", "70 | \n", "
36 | \n", "jose_garde | \n", "68 | \n", "
37 | \n", "19 | \n", "67 | \n", "
38 | \n", "david | \n", "66 | \n", "
39 | \n", "with | \n", "63 | \n", "
40 | \n", "how | \n", "61 | \n", "
41 | \n", "it | \n", "60 | \n", "
42 | \n", "will | \n", "55 | \n", "
43 | \n", "un | \n", "54 | \n", "
44 | \n", "amp | \n", "53 | \n", "
45 | \n", "des | \n", "53 | \n", "
46 | \n", "réparation | \n", "53 | \n", "
47 | \n", "new | \n", "52 | \n", "
48 | \n", "39 | \n", "52 | \n", "
49 | \n", "at | \n", "51 | \n", "