7

我有 N 个要跟踪的不同关键字(为简单起见,设 N=3)。所以在 GET statuses/filter 中,我将在“track”参数中给出 3 个关键字。

现在,我将收到的推文可以来自我提到的 3 个关键字中的任何一个。问题是我想解决哪个推文对应哪个关键字。即推文和关键字之间的映射(在“track”参数中提到)。

显然,如果不对收到的推文进行任何处理,就无法做到这一点。

所以我想知道进行此处理的最佳方法是什么?在推文的文本中搜索关键字?不区分大小写怎么办?如果同一关键字中有多个单词,例如:“Katrina Kaif”,该怎么办?

我目前正在尝试制定一些正则表达式...

我在想最好的方法是使用与最初使用的状态/过滤器 API 相同的逻辑(正则表达式等)。如何知道 Twitter API 状态/过滤器本身使用什么逻辑将推文与关键字匹配?

建议?帮助?

PS:我正在使用 Python、Tweepy、Regex、MongoDb/Apache S4(用于分布式计算)

4

2 回答 2

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

如果您仍然想在单个流中自己通过关键字区分推文,这里有一些关于 twitter 如何使用track请求参数的信息。有一些边缘情况可能会导致问题。

希望有帮助。

于 2013-05-17T11:41:11.073 回答
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

于 2017-04-27T16:02:36.187 回答