2013-05-17 12 views
5

私はトラッキングしているN個の異なるキーワードを持っています(簡単にするため、N = 3とします)。ですから、GETステータス/フィルタでは、 "track"引数に3つのキーワードを指定します。ステータス/フィルタ(ストリーミングAPI)から受け取ったツイートのフィルタリング

今、私が受け取るつぶやきは、私が言及した3つのキーワードのどれでもかまいません。 問題は、どのツイートがどのキーワードに対応しているかを解決したいのです。 、つまりツイートとキーワード(「track」引数に記載されている)との間のマッピングです。

どうやら、受け取ったつぶやきの処理を行わなければ、これを行う方法はありません。

だから私はこの処理を行うための最良の方法は何ですか? ツイートのテキストでキーワードを検索しますか?大文字小文字を区別しないのはどうですか?同じキーワードに複数の単語が含まれている場合はどうでしょうか(例:「Katrina Kaif」)?

私は現在、いくつかの正規表現を策定しようとしています...

私はもともとステータス/フィルタAPIも使用されているのと同じロジック(正規表現など)を使用するでしょう最善の方法を考えていました。どのようなロジックがTwitterのAPIステータスで使用されているか知っている/どのようにキーワードをつぶやくに一致するフィルタ自体?

アドバイス?助けて?

PS:私は、Python、Tweepy、正規表現、MongoDBの/ ApacheのS4(分散コンピューティングのための)

+1

大規模なNの正規表現は非常に苦しいかもしれません。最も単純な方法は、テキストを小文字に変換することであり、各キーワードチェックツイートの存在を確認することです。正確な一致を確認したい場合は、あなたのつぶやきをトークン化し、キーワードセットとトークンセットの共通部分を取得します。交差点は、ツイートと一致するキーワードになります。 – cubbuk

+0

@cubbuk:現在、N = 100です。ツイートの「テキスト」部分のみでキーワードを検索するのが好ましいですか? – user1599964

+1

私の知る限り、ツイッターはツイートのみのテキスト部分にマッチするので、テキスト部分をチェックする方が適しています。 – cubbuk

答えて

2

を使用しています私の心に入ってくる最初のことは、すべてのキーワードに個別のストリームを作成し、別々ので、それを起動することですスレッドには、次のように:あなたはまだ単一のストリームに自分でキーワードでつぶやきを区別したい場合

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

、ここsome infoはツイッターをtrackリクエストパラメータを使用する方法についてです。問題を引き起こす可能性のあるエッジケースがいくつかあります。

希望に役立ちます。いずれかの

+2

TwitterのAPIは、可能な限り個々のストリームの数を減らそうとするべきだということを示唆しています。同じIP /アカウントからのストリーム接続が多すぎるとブラックリストに登録されるためです。この参照してください:https://dev.twitter.com/discussions/921 – user1599964

+0

うん、右、これは、一般的に共有するためのおかげでオプションではありません。 – alecxe

+0

今私はちょうどつぶやきやキーワード(複数可)との間のマッピングを形成するように、各つぶやきのテキストで(大文字と小文字を区別しない、それを行った後に)各キーワードのマッチングに固執する必要がありますためうーん...よく私は、推測します。 – user1599964

0

リターンリストは/すべて、私は非常に関連する問題があったと私はリスト内包ことによってそれを解決した「トリガー」トラック用語

。つまり、私は生のつぶやきのリストと、トラックフィルタの用語を 'listoftermstofind'と 'rawtweetlist'として持っていました。次に、以下を実行すると、各ツイートに見つかったすべてのトラック用語のリストを返すことができます。

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

APIのトラックフィルターではなく任意の自然言語検索処理またはそのような何よりも(キャラクターレベルまで)固有のものですので、これは、うまく動作します。私はAPIのドキュメントを詳細に読むことをお勧めします。それはかなりよく使われています。https://dev.twitter.com/streaming/overview/request-parameters

関連する問題