2013-05-17 5 views
5

Ich habe N verschiedene Schlüsselwörter, die ich verfolgen (aus Gründen der Einfachheit, lassen Sie N = 3). In GET status/filter gebe ich also 3 Schlüsselwörter im "track" -Argument.Filterung von Tweets empfangen von Status/Filter (Streaming-API)

Jetzt können die Tweets, die ich bekomme, von jedem der 3 Schlüsselwörter sein, die ich erwähnte. Das Problem ist, dass ich lösen möchte, welcher Tweet mit welchem ​​Schlüsselwort übereinstimmt. , d. H. Zuordnung zwischen Tweets und den Schlüsselwörtern (die im "track" -Argument erwähnt werden).

Anscheinend gibt es keine Möglichkeit, dies zu tun, ohne die erhaltenen Tweets zu bearbeiten.

Also ich frage mich, was ist der beste Weg, um diese Verarbeitung zu tun? Suche nach Schlüsselwörtern im Text des Tweet? Was ist mit Groß- und Kleinschreibung? Was ist, wenn mehrere Wörter in demselben Schlüsselwort vorhanden sind, z. B .: "Katrina Kaif"?

ich derzeit versuche, einige reguläre Ausdrücke zu formulieren ...

ich war die beste Art und Weise denken würde die gleiche Logik (reguläre Ausdrücke etc.) zu verwenden, wie ursprünglich Status/Filter-API verwendet wird. Wie kann man wissen, welche Logik von Twitter-API-Status verwendet wird/Filter selbst, um Tweets mit den Keywords zu verknüpfen?

Beratung? Hilfe?

PS: Ich verwende Python, Tweepy, Regex, MongoDB/Apache S4 (für Distributed Computing)

+1

Für größere N regelmäßige Ausdruck könnte ziemlich schmerzhaft sein. Der einfachste Weg wäre, den Text in Kleinbuchstaben und für jeden Keyword-Check-Tweet zu transformieren. Wenn Sie nach einer genauen Übereinstimmung suchen möchten, können Sie Ihre Tweets mit einem Token versehen und die Schnittmenge von Keyword-Set und Token-Set erhalten. Die Schnittmenge sind die Schlüsselwörter, die dem Tweet entsprechen. – cubbuk

+0

@cubbuk: Derzeit habe ich N = 100. Es ist besser, nur im "Text" -Teil des Tweets nach einem Schlüsselwort zu suchen, oder? – user1599964

+1

Ja, soweit ich weiß, dass Twitter nur dem Textteil des Tweets entspricht, ist es besser, den Textteil zu überprüfen. – cubbuk

Antwort

2

Das erste, was mir in den Sinn kommt, ist ein separater Strom für jedes Keyword zu erstellen und sie in einem separaten starten Gewinde, wie folgt aus:

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() 

Wenn Sie noch von Keywords selbst unterscheiden Tweets wollen in einem einzigen Strom, hier some info wie twitter verwendet track Anforderungsparameter. Es gibt einige Randfälle, die Probleme verursachen könnten.

Hoffe, dass hilft.

+2

Die Sache ist, dass Twitter-API uns vorschlägt, dass wir versuchen sollten, die Anzahl der INDIVIDUAL-Streams so weit wie möglich zu reduzieren. Wenn es zu viele Stream-Verbindungen von derselben IP/demselben Konto gibt, wird es auf die schwarze Liste gesetzt. Sehen Sie dies: https://dev.twitter.com/discussions/921 – user1599964

+0

Ja, richtig, das ist im Allgemeinen keine Option, danke fürs Teilen. – alecxe

+0

Hmm ... naja, ich denke, jetzt muss ich mich nur noch an jedes passende Keyword halten (nachdem ich die Groß-/Kleinschreibung nicht beachtet habe) mit jedem Text, um eine Zuordnung zwischen Tweet und Keyword zu erstellen. – user1599964

0

Zurück Liste der/die alle ‚ausgelöst‘ Spur Begriffe

Ich hatte ein sehr ähnliches Problem und ich löste es durch Liste Verständnis. Das heißt, ich hatte eine Liste von rohen Tweets und meine Track-Filter-Begriffe wie "listofermstofind" und "rawtweetlist". Dann können Sie Folgendes ausführen, um eine Liste von Listen aller Trackbegriffe, die in jedem Tweet gefunden wurden, zurückzugeben.

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)) 

Das funktioniert gut, weil die Spur Filter in der API-spezifisch sind (bis auf die Zeichenebene) eher als jede natürliche Sprache Suchverarbeitung oder etwas ähnliches. Ich empfehle, die API-Dokumentation zum Filtern im Detail zu lesen, es geht durch die Verwendung ziemlich gut: https://dev.twitter.com/streaming/overview/request-parameters