2013-05-17 93 views
5

我有N個不同的關鍵字,我跟蹤(爲了簡單起見,讓N = 3)。所以在GET狀態/過濾器中,我會在「track」參數中給出3個關鍵字。過濾從狀態/過濾器(流API)接收的鳴叫

現在我將收到的推文可以來自我提到的3個關鍵詞中的任何一個。 問題是,我想解決哪個推文對應哪個關鍵字。 即推文和關鍵字之間的映射(在「track」參數中提到)。

顯然,如果不對收到的推文進行任何處理,就無法做到這一點。

所以我想知道什麼是做這個處理的最好方法? 在推文中搜索關鍵字?大小寫不敏感?如果在同一個關鍵字中出現多個詞,例如:「Katrina Kaif」?

我目前正在制定一些正則表達式...

我想最好的辦法使用相同的邏輯(正則表達式等)被用於最初是狀態/過濾器API。如何知道Twitter API的狀態/過濾器使用什麼邏輯將推文與關鍵字進行匹配?

建議?幫幫我?

PS:我使用Python,Tweepy,正則表達式,MongoDB的/阿帕奇S4(分佈式計算)

+1

對於較大的N正則表達式可能會非常痛苦。最簡單的方法是將文本轉換爲小寫,併爲每個關鍵字檢查推文的存在。如果你想檢查確切的匹配,那麼你可以標記你的推文,並得到你的關鍵字集和令牌集的交集。交集將是與推文匹配的關鍵字。 – cubbuk

+0

@cubbuk:目前,我有N = 100.最好只在推文的「文本」部分搜索關鍵字,對嗎? – user1599964

+1

是的,據我所知Twitter只匹配推文的文本部分,因此檢查文本部分將更適合您。 – 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在twitter上如何使用track請求參數。有一些邊緣情況可能會導致問題。

希望有所幫助。

+2

問題在於twitter API建議我們應儘可能地減少INDIVIDUAL流的數量。因爲如果來自同一IP /帳戶的流連接過多,則會被列入黑名單。看到這個:https://dev.twitter.com/discussions/921 – user1599964

+0

是的,對,這不是一個普遍的選擇,謝謝分享。 – alecxe

+0

嗯......我想,現在我只需要堅持使用每個推文的文本來匹配EACH關鍵字(使其不區分大小寫),以便在推文和關鍵字之間形成映射。 – 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