
Come creare una Bitcoin Sentiment Analysis utilizzando Python e Twitter
18 Novembre 2020La Sentiment Analysis è una pratica molto di moda, infatti, si trovano già diversi prodotti in rete che analizzano uno o più social media per ricavarne il sentimento su di un certo asset finanziario. Alcuni di questi modelli sono validi, altri meno.
Perché crearsi la propria Sentiment Analysis?
Il punto è che nei modelli generalisti fatti da altri solitamente non ritroviamo il dettaglio di cui abbiamo bisogno, ed inoltre non sono abbastanza malleabili alle nostre esigenze.
Dal momento che le risorse necessarie per crearsi un analisi del sentiment sono del tutto gratuite, ho pensato di creare una breve guida fai da te, in modo che ognuno possa scegliere come implementare la propria analisi e trarne gli spunti.
Prerequisiti.
Ci sono alcune risorse a cui dovrai iscriverti ed alcune librerie che dovrai installare perché lo script Python che analizza il sentimento dei Tweet venga eseguito correttamente. Inoltre le risorse che vado ad elencare di seguito sono state installate su di un mac, con Python 3.9, per cui il risultato potrebbe non funzionare o necessitare di piccoli cambiamenti utilizzi un ambiente diverso. Ad ogni modo per ogni eventuale ostacolo c’è sempre il santissimo Stackoverflow a venirci in aiuto.
• Python 3 installato con le seguenti librerie:o Tweepy (pip install tweepy)
o Google Clound Language (pip install --upgrade google-cloud-language)
o Pandas (pip install pandas openpyxl
• Iscrizione a Twitter development e credenziali Oauth
• Inscrizione a Google Cloud e credenziali Oauth per la libreria NLP
import tweepy
import os
from google.cloud import language_v1
import pandas as pd
Scraping delle risorse da Twitter
Twitter ha una API pubblica che restituisce tweet in base ad una ricerca fatta in formato Json. Quello che ci interessa è avere informazioni sul Bitcoin per cui faremo una ricerca su #Bitcoin come dal codice sottostante. In ogni caso modificare questo script semplicemente mettendo un altro coin o altri hashtags correlati (per esempio #BTC) permetterebbe di estendere o raffinare la ricerca.
Dopo aver modificato gli access tokens (insert-your-twitter-access-token-here)
Si possono modificare i parametri di ricerca per stability quanti tweet perndere per ricerca ed il massimo di tweet (rispettivamente tweetsPerQry e maxTweets). Ti consiglio di fare alcune query di prova per verificare i risultati e capire se i tweet sono rilevanti.
Altre modifiche che si possono fare al codice sono quelle volte a raffinare i tweets, ad esempio eliminando i retweets. Dai uno guardo alle API di Tweepy per capire le opzioni disponibili.
Da qui estraggo solamente il testo dei tweets e li metto in una lista (listposts) che verrà successivamente elaborata da Google NLP per l’analisi vera e propria.
consumer_key = 'insert-your-twitter-access-token-here'
consumer_secret = 'insert-your-twitter-access-token-here'
access_token = '92772778-insert-your-twitter-access-token-here'
access_token_secret = 'insert-your-twitter-access-token-here'
tweetsPerQry = 100
maxTweets = 100
hashtag = "#Bitcoin"
authentication = tweepy.OAuthHandler(consumer_key, consumer_secret)
authentication.set_access_token(access_token, access_token_secret)
api = tweepy.API(authentication, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
maxId = -1
tweetCount = 0
listposts = []
while tweetCount < maxTweets:
if(maxId <= 0):
newTweets = api.search(q=hashtag, count=tweetsPerQry, result_type="recent", tweet_mode="extended")
else:
newTweets = api.search(q=hashtag, count=tweetsPerQry, max_id=str(maxId - 1), result_type="recent", tweet_mode="extended")
if not newTweets:
print("Tweet Habis")
break
for tweet in newTweets:
d={}
d["text"] = tweet.full_text.encode('utf-8')
print (d["text"])
listposts.append(d)
tweetCount += len(newTweets)
maxId = newTweets[-1].id
print (listposts)
print (listposts)
Lo script originale che ho modificato è stato preso da: https://gist.github.com/DeaVenditama/40ed30cb4bc793ab1764fc3105258d8a
Dare in pasto i Tweets a Google NLP
Google NLP è la library che andiamo ad utilizzare per fare il Natural Language Processing del testo che abbiamo estratto da Twitter. Ho scelto di provare questa perché ne ho provate altre in passato che non mi hanno convinto molto. Premesso che è abbastanza difficile capire il Sentiment da poche parole, credo questa library di Google sia molto elaborata in quanto mette a disposizione due misurazioni: score and magnitude.
- In particolare lo score è il valore che indica se il testo ha un atteggiamento Posivo, Negativo o Neutrale ed ha un punteggio che puà variare da -1 a 1. -1 indica un atteggiamento negativo, 0 neutrale ed 1 positivo.
- La magnitude indica invece il peso di tale score. Ovvero quanto il testo è emotivo. Valori tendenti a 0 rivelano una bassa emotività del testo, mentre valori tendenti a 2 sono indicatori di una alta emotività.
Prima di lanciare lo script, è necessario avere un account Google Cloud e seguire i passi a questa URL (https://cloud.google.com/natural-language/docs/reference/libraries#cloud-console) per installare le librerie necessarie e scaricare il file JSON che contiene le credenziali per l’autenticazione. Una volta scaricato il file sulla vostra macchina dovrete mettere il PATH completo del vostro fil al posto di (insert-the-path-to-your-json-key-here)
In questa parte di codice non facciamo altro che scorrere la lista con i tweet ricavati prima e chiamare la funzione che di Google NLP che ne analizza il Sentiment, ritornando per ciascun tweet una coppia di valori (score, magnitude)
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "insert-the-path-to-your-json-key-here"
client = language_v1.LanguageServiceClient()
for x in range (len(listposts)):
try:
document = language_v1.Document(content=listposts[x]["text"], type_=language_v1.Document.Type.PLAIN_TEXT)
sentiment = client.analyze_sentiment(document=document).document_sentiment
sscore = round(sentiment.score,4)
smag = round(sentiment.magnitude,4)
listposts[x]["score"] = sscore
listposts[x]["magnitude"] = smag
except Exception as e:
print(e)
listposts[x]["score"] = 0
listposts[x]["magnitude"] = 0
Lo script per le Google NLP mi è stato fornito da Daniel Heredia. In questa pagina puoi trovare anche un esempio generico di analisi partendo dai post di Facebook.
Analisi dei risultati su File Excel
Nelle ultime due righe la lista dei tweet con i relativi score e magnitude vengono elaborate grazie alla libreria Pandas e scritti su un file excel a tua scelta (insert-you-file-excel-path-here)
df = pd.DataFrame(listposts)
df.to_excel('insert-you-file-excel-path-here', header=True, index=False)
Quando lo script ha finito di girare avrai come risultato un excel file simile a quello della figura qui sotto:
Dai risultati si nota come sia necessario un successivo raffinamento dei tweet che vengono estratti, in quanto è facile incappare in tweet che non sono molto rilevanti o ancor peggio promozionali. Credo che il valore finale di questa analisi sia tanto accurato quanto lavoro di raffinamento .
Nel mio caso, su 100 tweets lo score medio è stato di -0,025 per una magnitude di 0,0517.
Sviluppi Futuri
Ci sono una serie di azioni che possono aumentare il valore di questo tipo di analisi oltre al raffinamento dei tweets, per esempio:
- Estrarre i valori del Bitcoin (la maggior parte degli exchanges ha APIs gratis) e correlarle con lo score.
- Utilizzare diverse ricerche provando diversi hashtags
- Utilizzare una criptovaluta minore, e quindi con meno seguito, per capire se presenta valori più correlati in quanto meno spammata
- Capire quali siano i timeframes corretti: Il sentimento potrebbe correlarsi molto bene nel breve termine e meno nel lungo, oppure nel caso opposto.
