2013-05-17 12 views
5

Ho N parole chiave diverse che sto monitorando (per semplicità, sia N = 3). Quindi in GET stati/filtro, darò 3 parole chiave nell'argomento "traccia".filtraggio dei tweet ricevuti dagli stati/filtro (API di streaming)

Ora i tweets che riceverò possono provenire da QUALUNQUE delle 3 parole chiave che ho menzionato. Il problema è che voglio decidere in merito a quale tweet corrisponde a quale parola chiave. ovvero mappatura tra i tweet e le parole chiave (che sono menzionate nell'argomento "traccia").

Apparentemente, non c'è modo di farlo senza eseguire alcuna elaborazione sui tweet ricevuti.

Quindi mi chiedevo qual è il modo migliore per eseguire questa elaborazione? Cerca parole chiave nel testo del tweet? Per quanto riguarda case-insensitive? Che dire quando più parole ci sono nella stessa parola chiave, ad esempio: "Katrina Kaif"?

Attualmente sto provando a formulare qualche espressione regolare ...

Stavo pensando il modo migliore sarebbe di usare la stessa logica (espressioni regolari, ecc), come viene utilizzato in origine essere stati/filtro API. Come sapere quale logica viene utilizzata dagli stati dell'API di Twitter/filtrare se stessa per far corrispondere i tweet alle parole chiave?

Consigli? Aiuto?

PS: Sto usando Python, Tweepy, Regex, MongoDb/Apache S4 (per il calcolo distribuito)

+1

Per un'espressione regolare N di dimensioni maggiori potrebbe essere piuttosto doloroso. Il modo più semplice sarebbe quello di trasformare il testo in minuscolo e per ogni parola chiave controllare il tweet per la sua esistenza. Se si desidera verificare la corrispondenza esatta, è possibile sincronizzare i tweet e ottenere l'intersezione tra il set di parole chiave e il set di token. L'intersezione saranno le parole chiave che corrispondono al tweet. – cubbuk

+0

@cubbuk: Attualmente ho N = 100. È preferibile cercare la parola chiave solo nella parte "testo" di tweet, giusto? – user1599964

+1

Sì, per quanto ne so, Twitter corrisponde solo alla parte del testo del tweet, quindi è più adatto per te controllare la parte del testo. – cubbuk

risposta

2

La prima cosa a venire in mente è quello di creare un flusso separato per ogni parola chiave e avviarlo in un separato filo, in questo modo:

from threading import Thread 
import tweepy 


class StreamListener(tweepy.StreamListener): 
    def __init__(self, keyword, api=None): 
     super(StreamListener, self).__init__(api) 
     self.keyword = keyword 

    def on_status(self, tweet): 
     print 'Ran on_status' 

    def on_error(self, status_code): 
     print 'Error: ' + repr(status_code) 
     return False 

    def on_data(self, data): 
     print self.keyword, data 
     print 'Ok, this is actually running' 


def start_stream(auth, track): 
    tweepy.Stream(auth=auth, listener=StreamListener(track)).filter(track=[track]) 


auth = tweepy.OAuthHandler(<consumer_key>, <consumer_secret>) 
auth.set_access_token(<key>, <secret>) 

track = ['obama', 'cats', 'python'] 
for item in track: 
    thread = Thread(target=start_stream, args=(auth, item)) 
    thread.start() 

Se si vuole ancora di distinguere tweet tramite parole chiave da soli in un unico flusso, ecco some info su come Twitter utilizza track parametro di richiesta. Ci sono alcuni casi limite che potrebbero causare problemi.

Spero che questo aiuti.

+2

Il fatto è che l'API di Twitter ci suggerisce che dovremmo cercare di ridurre il numero di stream INDIVIDUAL il più lontano possibile. Perché se ci sono troppe connessioni di streaming dallo stesso IP/account, questo verrà inserito nella lista nera. Vedi questo: https://dev.twitter.com/discussions/921 – user1599964

+0

Sì, giusto, questa non è un'opzione in generale, grazie per la condivisione. – alecxe

+0

Hmm ... beh, immagino, per ora dovrò limitarmi a far corrispondere la parola chiave EACH (dopo averla distinta tra maiuscole e minuscole) con il testo di OGNI tweet, in modo da formare il mapping tra tweet e parole chiave. – user1599964

0

lista ritorno di qualsiasi/tutti 'scatenato' termini della pista

Ho avuto un problema molto relativo e ho risolto dalla lista comprensione. Cioè, avevo una lista di tweet grezzi, e i miei termini di filtro di traccia come 'listoftermstofind' e 'rawtweetlist'. Quindi è possibile eseguire quanto segue per restituire un elenco di elenchi di tutti i termini di traccia trovati in ciascun tweet.

j=[x.upper() for x in listoftermstofind] #your track filters, but making case insensitive 
ListOfTweets=[x.upper() for x in rawtweetlist] #converting case to upper for all tweets 
triggers=list(map(lambda y: list(filter(lambda x: x in y, j)), ListOfTweets)) 

Questo funziona bene, perché i filtri della pista nell'API sono specifici (fino al livello del personaggio) piuttosto che qualsiasi elaborazione del linguaggio naturale di ricerca o qualcosa di simile. Raccomando di leggere i documenti API sul filtraggio in dettaglio, l'utilizzo è abbastanza buono: https://dev.twitter.com/streaming/overview/request-parameters

Problemi correlati