Фильтрация твитов, полученных из статусов /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

Другие вопросы по тегам