Фильтрация твитов, полученных из статусов /filter (streaming API)
У меня N разных ключевых слов, которые я отслеживаю (для простоты, пусть N=3). Итак, в GET statuses/filter я дам 3 ключевых слова в аргументе "track".
Теперь твиты, которые я получу, могут быть от ЛЮБОГО из 3 упомянутых мною ключевых слов. Проблема в том, что я хочу решить, какой твит соответствует какому ключевому слову. то есть сопоставление между твитами и ключевыми словами (которые упоминаются в аргументе "track").
По-видимому, нет способа сделать это без какой-либо обработки полученных твитов.
Так что мне было интересно, как лучше всего выполнить эту обработку? Искать ключевые слова в тексте твита? А как насчет без учета регистра? Как насчет того, когда в одном ключевом слове есть несколько слов, например: "Катрина Кайф"?
В настоящее время я пытаюсь сформулировать некоторые регулярные выражения...
Я думал, что ЛУЧШИЙ способ - использовать ту же логику (регулярные выражения и т. Д.), Которая изначально использовалась в API-статусах / фильтрах. Как узнать, какая логика используется самими статусами / фильтром API Twitter для сопоставления твитов с ключевыми словами?
Совет? Помогите?
PS: я использую Python, Tweepy, Regex, MongoDb/Apache S4 (для распределенных вычислений)
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()
Если вы все еще хотите различать твиты по ключевым словам самостоятельно в одном потоке, вот некоторая информация о том, как использует твиттер track
параметр запроса. Есть некоторые крайние случаи, которые могут вызвать проблемы.
Надеюсь, это поможет.
Возврат списка любых / всех "запущенных" треков
У меня была очень связанная проблема, и я решил ее путем понимания списка. То есть у меня был список необработанных твитов и термины фильтра треков, такие как "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