Topic: Scaricare e manipolare tweet  (Letto 61 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Simone3

  • python unicellularis
  • *
  • Post: 8
  • Punti reputazione: 0
    • Mostra profilo
Scaricare e manipolare tweet
« il: Giugno 24, 2019, 17:06 »
Sono da poco entrato in questo forum e da poco ho iniziato a mettere mano su python ma devo effettuare un progetto riguardante il riuscire a scaricare tweet da twitter manipolarli per poi effettuare uno studio sul sentiment ma partiamo dall' "inizio".
Vi volevo chiedere una mano in quanto vorrei riuscire a scaricare tweet attraverso una determinata parola o hastag per poi salvarmeli in un file csv.
import tweepy
import csv
import pandas as pd
import sys
from textblob import TextBlob
import re
####input your credentials here
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth,wait_on_rate_limit=True)

# Open/Create a file to append data
csvFile = open('file.csv', 'a')
#Use csv Writer
csvWriter = csv.writer(csvFile)

tweets=[]
categorie=["text","sentiment"]
csvWriter.writerow(categorie)
for tweet in tweepy.Cursor(api.search,q="plastica",tweet_mode="extended",count=5,
                           lang="it",
                           since="2019-04-23").items():
   

   
    if tweet.retweet_count<2:
        testo=tweet.full_text
       
       
        testo = re.sub('<[^>]*>', '', testo)
        emoticons = re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)', testo)
        testo = re.sub('[\W]+', ' ', testo.lower()) +\
        ' '.join(emoticons).replace('-', '')
       

       
        analysis = TextBlob(testo)
       
        # classifico il sentimento riguardante quel tweet
        if analysis.sentiment.polarity > 0:
             sentimento_tweet ='positive'
        elif analysis.sentiment.polarity == 0:
            sentimento_tweet ='neutral'
        else:
            sentimento_tweet ='negative'
       
       
        tweets=[testo,sentimento_tweet]
        csvWriter.writerow([testo.encode('utf-8'),sentimento_tweet])
       

csvFile.close()


I miei problemi sono:
  • -mi vengono scaricati tweet uguali
  • -avendo le api dei limiti vorrei poter scaricare i tweet da una certa data a un altra per suddividerli e richiamandola in vari giorni avere poi un set di dati buono (sui 1000 vorei arrivare)
Se potete darmi dei suggerimenti ve ne sarei molto grato
[/list]

Offline bebo

  • python erectus
  • ***
  • Post: 230
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Scaricare e manipolare tweet
« Risposta #1 il: Giugno 25, 2019, 15:19 »
Sicuro che siano uguali e non siano retweet?

Inoltre io separerei le due azioni, una di ingestione dei tweet e una di analisi, altrimenti rischi di perderti molti tweet mentre fai l'analisi, e non lo vuoi. Per un progetto uguale a lavoro, avevamo un servizio che restava solo in ascolto di certi hashtag e scriveva in un db. mentre c'era un secondo servizio di analisi on-demand, con alcune operazioni di pre-processing che venivano effettuate ogni tot.

Per la seconda domanda: dipende se twitter te lo lascia fare e se la libreria che usi lo supporta. Cerca nelle docs.

Offline Simone3

  • python unicellularis
  • *
  • Post: 8
  • Punti reputazione: 0
    • Mostra profilo
Re:Scaricare e manipolare tweet
« Risposta #2 il: Giugno 25, 2019, 17:43 »
Hai centrato il punto, vorrei riuscire ad avere dei tweet tutti diversi quindi vorrei non importare nel mio file CSV anche i retweet.
In questo momento il mio intento è quello appunto di reperire i maggior tweet possibili (avevo pensato di effettuare una ricerca di tweet per periodo,da tot data a tot,per "eludere" i limiti imposti  ) per poter avere una raccolta esaustiva per la seconda fase,quella di analisi.

In questa prima fase quindi in maniera semi-automatica(in quando non addestrando i dati non credo sia possibile avere dei risulti idonei) sto recuperando il testo dei tweet e attraverso il TextBlob un "sentimento",che può essere positivo o negativo, per poi andarli a rivisionare "manualmente".Fatto tutto ciò allora passerei alla fase di analisi

Non so se il mio ragionamento sia giusto in quanto per me questo campo è nuovo e spero di riuscire a schiarirmi le idee e implementare il tutto grazie anche al vostro aiuto

Offline bebo

  • python erectus
  • ***
  • Post: 230
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Scaricare e manipolare tweet
« Risposta #3 il: Giugno 26, 2019, 16:37 »
Hai centrato il punto, vorrei riuscire ad avere dei tweet tutti diversi quindi vorrei non importare nel mio file CSV anche i retweet.
Devi guardare l'oggetto 'tweet' su cui iteri, probabilmente avra' qualche flag che indica se e' un retweet, e a quel punto scartarlo. Leggi la doc di tweepy.

In questo momento il mio intento è quello appunto di reperire i maggior tweet possibili (avevo pensato di effettuare una ricerca di tweet per periodo,da tot data a tot,per "eludere" i limiti imposti  ) per poter avere una raccolta esaustiva per la seconda fase,quella di analisi.

In questa prima fase quindi in maniera semi-automatica(in quando non addestrando i dati non credo sia possibile avere dei risulti idonei) sto recuperando il testo dei tweet e attraverso il TextBlob un "sentimento",che può essere positivo o negativo, per poi andarli a rivisionare "manualmente".Fatto tutto ciò allora passerei alla fase di analisi
Pero' c'e' un problema, che ti avevo gia' esposto:
Citazione da: bebo
Inoltre io separerei le due azioni, una di ingestione dei tweet e una di analisi, altrimenti rischi di perderti molti tweet mentre fai l'analisi, e non lo vuoi.
Cioe', il tempo che perdi a fare quella prima analisi di sentimento ti fa perdere molti tweet, che e' male.
Quindi fai un processo che stia solo in ascolto di twitter e salvi i tweet. Fine.

Un secondo processo, *separato* dal primo, *in un secondo momento* prende delle manciate di tweet e fa sentiment analysis, o quello che ti serve.

Sconsiglio fortemente di usare un csv, e' il formato peggiore per la consistenza. Nei tweet c'e' di tutto, e rischi di avere casini poi a rileggere dal csv, a meno di non fare escape magici con la libreria csv, oppure di salvare in tab-separated values.

Consiglio invece di usare un db: mi pare che postgresql10 ha anche un driver async, che quindi puoi bombardare di richieste e non perdere niente.

Consiglio di salvarsi anche i metadata dei vari tweet.

Offline Simone3

  • python unicellularis
  • *
  • Post: 8
  • Punti reputazione: 0
    • Mostra profilo
Re:Scaricare e manipolare tweet
« Risposta #4 il: Giugno 27, 2019, 12:22 »
Guardi le espongo meglio il mio obiettivo cosi mi può indirizzare al meglio in quanto credo che forse mi sfugge qualcosa concettualmente.
Il mio obiettivo con il progetto che sto eseguendo è quello di riuscire a ricavare del sentimento da dei tweet di Twitter su tematiche come l'emergenza rifiuti o anche sull'opinione di un determito brand.
***PRIMA FASE***
Ricominciando da 0 e andando per  punti il primo passaggio è:
Ricavare il maggior numero di tweet per fornirmi un database di dati sui quali lavorare( 1*lei crede sia meglio ricavare tweet attraverso un ascolto con StreamListener?)
dei tweet mi occorrerà sapere:
  • Testo(nessuna analisi ma vorrei codicare i caratteri è,à ect in modo tale da avere un testo "pulito".. 2*come posso riuscirci?encode('utf-8) non mi fornisce i risultati desiderati esprimendo alcuni caratteri come \xc3\xa0 oppure \xc3\za8 )
  • Luogo del tweet(potrebbe essermi poi utile per fare grafici relativi a zone geografiche ect)
  • Sentimento
Per quanto riguarda il sentimento avevo pensato,correggimi se sbaglio,di farlo inizialmente restituire in maniera automatica per poi andarlo a "correggere" manualmente quelli che sono per me sbagliati.
Ecco cosi che avrei terminato la mia prima fase avendo un insieme di dati congrui per poi fare tutto quel processo di analisi.

***SECONDA FASE***
Nella seconda fase invece prenderei il file restituito dalla prima fase e inizierei a fare tuti i processi per un analisi del sentimento ovvero tokenizzazione,eliminazione caratteri speciali,stopword ect per poi vedere con Naive e altre soluzioni i vari risultati.

Offline bebo

  • python erectus
  • ***
  • Post: 230
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Scaricare e manipolare tweet
« Risposta #5 il: Giugno 27, 2019, 13:26 »
Diamoci pure del tu, probabilmente il piu' giovane dei due sono io  ;)

Citazione
Ricavare il maggior numero di tweet per fornirmi un database di dati sui quali lavorare
E questo lo fai mettendo un processo a fare solo questo lavoro, senza fargli fare pre-analisi di sentiment, altrimenti ti perdi i tweet.

Citazione
lei crede sia meglio ricavare tweet attraverso un ascolto con StreamListener?
Si, mi pare che avessimo usato anche noi StreamListener.

Citazione
vorrei codicare i caratteri è,à ect in modo tale da avere un testo "pulito".. come posso riuscirci? encode('utf-8) non mi fornisce i risultati desiderati esprimendo alcuni caratteri come \xc3\xa0 oppure \xc3\za8 )
Ecco che qui avere un buon database ti salvera' ore e ore di lavoro e ti assicurera' l'integrita' dei dati. Piuttosto se proprio un database "serio" ti pare eccessivo, prova ad usare sqlite, un mini-db su singolo file (con tutte le limitazioni del caso); oppure piuttosto ancora, json.
Sconsiglio fortemente l'approccio csv, non e' mai indolore.

Ricapitolando l'approccio:
  • 1 processo in ascolto per tweet, e che li scriva da qualche parte
  • N processi che facciano tutte le analisi che vuoi, separatamente dal primo processo

Il sentimento io lo considero gia' parte della seconda fase di analisi.
Per quanto riguarda le operazioni che vorrai fare nella seconda fase, ad occhio direi che vanno bene. Ma basta che cerchi in letteratura e troverai il mondo. (Consiglio di usare nltk, ma probabilmente lo saprai gia')

Offline Simone3

  • python unicellularis
  • *
  • Post: 8
  • Punti reputazione: 0
    • Mostra profilo
Re:Scaricare e manipolare tweet
« Risposta #6 il: Giugno 27, 2019, 15:40 »
Ho notato,sbirciando sui social dove ti ho anche cercato di contattare, che sei più piccolo di me di un solo anno.

1- Il mio dubbio sta nel fatto che se nella prima parte recupero solo i dati relativi al testo del tweet come faccio poi nella seconda a dare ad ogni tweet un sentimento se non gli do modo di potersi addestrare fornendogli degli "esempi" su cui lavorare?

2-Ho provato a buttare giù del codice dove salvare i tweet sul database mysql ma ho sempre il problema relativo ad alcuni caratteri speciali come è, à ect

Offline bebo

  • python erectus
  • ***
  • Post: 230
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Scaricare e manipolare tweet
« Risposta #7 il: Giugno 28, 2019, 09:48 »
Citazione
dove ti ho anche cercato di contattare
non rispondo in privato a domande che possono stare nel forum, sorry

Citazione
come faccio [..] a dare ad ogni tweet un sentimento se non gli do modo di potersi addestrare fornendogli degli "esempi" su cui lavorare?
Non capisco cosa intendi.. io ti sto solo dicendo di creare 2 script separati, uno banalissimo come quello che hai gia' postato, in cui raccogli solo tweet.
Nel secondo, iteri sui tweet, e ci fai le operazioni che vuoi.

Quindi, per evitare di "perdere tempo" e perdere tweet, ti sto dicendo di spostare quelle 10 righe in cui fai operazioni di analisi dal primo script al secondo script.
Cioe' il primo script deve contenere solo lo stream listener e la scrittura su file/db.

Ti dico questo perche' l'oggetto stream listener di tweepy ti fornisce dei tweet ogni volta che glielo chiedi, istantaneamente. Ma se tra una richiesta e l'altra ti fermi per fare altri calcoli, non puoi chiedergli tweet e lui non te li puo' dare, quindi perderai preziosi tweet.

Citazione
2-Ho provato a buttare giù del codice dove salvare i tweet sul database mysql ma ho sempre il problema relativo ad alcuni caratteri speciali come è, à ect
Questo e' un problema differente. Chissa' come hai inizializzato il driver. Consiglio di aprire una nuova discussione specifica.

PS: se non hai preferenze o conoscenze pregresse, io ti consiglierei postgresql >= 10; e' completamente open-source (a differenza del doppio modello community-enterprise di mysql), e gia' questo per me e' un grosso vantaggio.