تحلیل احساسات در توییتر با پایتون — راهنمای جامع و کاربردی
در این مطلب به منظور انجام تحلیل احساسات (Sentiment Analysis) در شبکه اجتماعی «توئیتر»، با اتصال به Twitter Streaming API، توئیتها (Tweets) را گردآوری (بر اساس یک کلیدواژه) و احساسات هر توئیت را محاسبه کرده و یک دشبورد «زمان واقعی» (real-time) با استفاده از «الاستیکسرچ» (Elasticsearch) و «کیبانا» (Kibana) به منظور بصریسازی نتایج ساخته میشود. ابزارهای مورد استفاده در این راستا به شرح زیر هستند.
- Docker v1.3.0 (+)
- boot2docker v1.3.0 (+)
- Tweepy v2.3.0 (+)
- TextBlob v0.9.0 (+)
- Elasticsearch v1.3.5 (+)
- Kibana v3.1.2 (+)
معرفی ابزارهای مورد استفاده
در ادامه، سه ابزار اصلی مورد استفاده در این راهنما به صورت اجمالی معرفی شدهاند.
داکر
«داکر» (Docker)، یک برنامه کامپیوتری برای انجام مجازیسازی در سطح سیستمعامل است که به آن «containerization» نیز گفته میشود. داکر برای اجرای بستههای نرمافزاری که «ظرف» (کانتینر | container) نامیده میشوند مورد استفاده قرار میگیرد.
کیبانا
«کیبانا» (Kibana) یک پلاگین بصریسازی دادههای متنباز برای Elasticsearch است. این پلاگین، قابلیت «بصریسازی» (visualization) را براساس محتوای اندیسگذاری شده در خوشه Elasticsearch فراهم میکند. کاربران میتوانند «نوار» (bar)، نمودارهای نقطهای، خطی، نمودار دایرهای و نقشهها را براساس حجم بالایی از دادهها ایجاد کنند.
الاستیک سرچ
«الاستیک سرچ» (Elasticsearch) یک موتور جستوجو بر اساس کتابخانه بازیابی اطلاعات «متنباز» (Open Source) «آپاچی لوسین» (Apache Lucene) و دارای قابلیت «چند مستاجری» (Multitenancy) تمام متن با یک رابط وب HTTP و مستندات JSON است.
محیط داکِر
برای نصب «داکِر» (Docker) و boot2docker مطالعه مستندات رسمی آن (+) توصیه میشود. پس از نصب، با boot2docker در حال اجرا، باید دستور docker version را برای بررسی نصب داکر (Docker) در «شِل» (Shell) وارد کرد.
همچنین، کاربران باید یک دایرکتوری برای نگهداری پروژه خود بسازند و Dockerfile را از مخزن گرفته و یک «ایمیج» (image) ایجاد کنند.
1$ docker build -rm -t=elasticsearch-kibana .
پس از ساخت، «کانتینر» (container | ظرف) را میتوان با بهرهگیری از دستور زیر اجرا کرد.
1$ docker run -d -p 8000:8000 -p 9200:9200 elasticsearch-kibana
در نهایت، باید دو دستور بعدی را در ترمینال جدید ویندوز برای نگاشت آدرس port combo/IP استفاده شده در boot2docker VM در «لوکالهاست» (localhost) (متعلق به کاربر)، اجرا کرد.
1$ boot2docker ssh -L8000:localhost:8000
2$ boot2docker ssh -L9200:localhost:9200
اکنون، میتوان به Elasticsearch در مسیر http://localhost:9200 و Kibana در مسیر http://localhost:8000 دسترسی داشت.
Twitter Streaming API
به منظور دسترسی داشتن به Twitter Streaming API، نیاز به نصب ثبت یک نرمافزار کاربردی در اینجا (+) است. پس از ساخت، کاربر باید به صفحه برنامه کاربردی خودش هدایت شود که در آنجا میتواند «کلید مصرفکننده» (consumer key) و «رمز مصرفکننده» (consumer secret) را دریافت کند و یک توکن دسترسی در «سربرگ» (tab) با نام «Keys and Access Tokens» بسازد.
این موارد را باید به یک فایل جدید با نام config.py افزود.
1consumer_key = "add_your_consumer_key"
2consumer_secret = "add_your_consumer_secret"
3access_token = "add_your_access_token"
4access_token_secret = "add_your_access_token_secret"
تذکر: با توجه به آنکه این فایل حاوی اطلاعات حساسی است، کاربران نباید آن را به مخزن گیت خود بیافزایند.
مطابق مستندات Twitter Streaming (+)، راهاندازی یک اتصال به streaming API به معنای ایجاد یک درخواست HTTP با طول عمر بالا و تجزیه پاسخ به صورت افزایشی است. به لحاظ مفهومی، میتوان به آن به عنوان دانلود کردن یک فایل بینهایت بلند از طریق HTTP نگاه کرد. بنابراین، کاربر باید یک درخواست ایجاد و آن را با کلیدواژههای خاص، کاربر و یا ناحیه جغرافیایی فیلتر کند، و سپس اتصال را باز نگه دارد تا بتواند به اندازه ممکن توییت گردآوری کند. این کار ظاهرا پیچیده به نظر میرسد اما Tweepy انجام آن را آسان ساخته است.
Tweepy Listener
Tweepy از یک «listener» نه فقط برای گردآوری توئیتهای استریم شده، بلکه فیلتر کردن آنها نیز استفاده میکند.
کد
کاربر باید کد زیر را با نام sentiment.py ذخیره کند.
1import json
2from tweepy.streaming import StreamListener
3from tweepy import OAuthHandler
4from tweepy import Stream
5from textblob import TextBlob
6from elasticsearch import Elasticsearch
7
8# import twitter keys and tokens
9from config import *
10
11# create instance of elasticsearch
12es = Elasticsearch()
13
14
15class TweetStreamListener(StreamListener):
16
17 # on success
18 def on_data(self, data):
19
20 # decode json
21 dict_data = json.loads(data)
22
23 # pass tweet into TextBlob
24 tweet = TextBlob(dict_data["text"])
25
26 # output sentiment polarity
27 print tweet.sentiment.polarity
28
29 # determine if sentiment is positive, negative, or neutral
30 if tweet.sentiment.polarity < 0:
31 sentiment = "negative"
32 elif tweet.sentiment.polarity == 0:
33 sentiment = "neutral"
34 else:
35 sentiment = "positive"
36
37 # output sentiment
38 print sentiment
39
40 # add text and sentiment info to elasticsearch
41 es.index(index="sentiment",
42 doc_type="test-type",
43 body={"author": dict_data["user"]["screen_name"],
44 "date": dict_data["created_at"],
45 "message": dict_data["text"],
46 "polarity": tweet.sentiment.polarity,
47 "subjectivity": tweet.sentiment.subjectivity,
48 "sentiment": sentiment})
49 return True
50
51 # on failure
52 def on_error(self, status):
53 print status
54
55if __name__ == '__main__':
56
57 # create instance of the tweepy tweet stream listener
58 listener = TweetStreamListener()
59
60 # set twitter keys/tokens
61 auth = OAuthHandler(consumer_key, consumer_secret)
62 auth.set_access_token(access_token, access_token_secret)
63
64 # create instance of the tweepy stream
65 stream = Stream(auth, listener)
66
67 # search twitter for "congress" keyword
68 stream.filter(track=['congress'])
آنچه در کد بالا اتفاق میافتد به صورت موجز به شرح زیر است:
- اتصال به Twitter Streaming API
- فیلتر کردن دادهها با کلیدواژه «congress»
- «رمزگشایی» (دیکد | Decode) کردن نتایج (توئیتها)
- محاسبه تحلیل احساسات با TextBlob
- تعیین اینکه احساسات کلی مثبت، منفی و یا خنثی هستند.
- در نهایت دادههای توییتها و احساسات مرتبط به آن ها به Elasticsearch DB افزوده میشود.
برای آگاهی از جزئیات بیشتر، مطالعه «توضیحات» (Comments) موجود در کد توصیه میشود.
مبانی محاسبه احساسات با TextBlob
برای محاسبه عواطف کلی، باید به درجه قطبش (قطبیت) نگاه شود:
- مثبت: از ۰/۰۱ تا ۱/۰
- خنثی: ۰
- منفی: از ۰/۰۱- تا ۱/۰-
برای آگاهی از جزئیات چگونگی محاسبه احساسات توسط TextBlob، مراجعه به صفحه رسمی آن توصیه میشود.
تحلیلهای الاستیکسرچ
در طول یک بازه زمانی دو ساعتی، ۹۵۰۰ توئیت با کلیدواژه «congress» گردآوری شده است. پژوهشگران میتوانند از کلیدواژه مورد نظر خود برای گردآوری توئیتها استفاده کنند. پس از آنکه حجم قابل توجهی توئیت گردآوری شد، میتوان به کار اسکریپت پایان داد.
سپس، این امکان وجود دارد که اندکی تحلیل روی نتایج انجام داد. با استفاده از اندیس «sentiment» از اسکریپت «sentiment.py»، میتوان از Elasticsearch search API برای گردآوری بینش اولیه استفاده کرد. برای مثال:
- متن کامل جستوجو برای «obama» (+)
- جستوجوی نام کاربری توییتر/نویسنده (+)
- جستوجوی احساسات (+)
- جستوجوی «obama» و احساسات (+)
کارهای بسیار زیادی وجود دارد که میتوان صرفا با جستوجو و فیلتر کردن نتابج با استفاده از الاستیکسرچ (Elasticsearch) انجام داد. برای دریافت اطلاعات بیشتر پیرامون چگونگی تحلیل و مدلسازی دادهها مطالعه «Elasticsearch - The Definitive Guide» (+) توصیه میشود.
با سلام مطلب بسیار با ارزشی بود فقط برای بدست آوردن چهارتا توکن هیچ راه دیگه ای وجود ندارد ؟
چون تویتر به هر کسی توکن نمی دهد. درخواست من برای بدست آوردن توکن ها رد شد.
با سلام مطلب بسیار با ارزشی بود فقط برای بدست آوردن چهارتا توکن هیچ راه دیگه ای وجود ندارد ؟
چون تویتر از ژون ۲۰۱۸ سختگیری اعمال کرده و به هر کسی توکن نمی دهد. درخواست من برای بدست آوردن توکن ها رد شد.
اگه راه دیگه ای رو سراغ دارید لطفا ذکر نمایید.