【问题标题】:filtering of tweets received from statuses/filter (streaming API)过滤从状态/过滤器收到的推文(流 API)
【发布时间】:2013-05-12 05:37:51
【问题描述】:

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

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

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

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

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

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

建议?帮忙?

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

【问题讨论】:

  • 对于较大的 N 正则表达式可能会很痛苦。最简单的方法是将文本转换为小写,并为每个关键字检查推文是否存在。如果您想检查精确匹配,那么您可以标记您的推文并获取关键字集和标记集的交集。交集将是与推文匹配的关键字。
  • @cubbuk : 目前,我有 N = 100。最好只在推文的“文本”部分搜索关键字,对吧?
  • 是的,据我所知,twitter 只匹配推文的文本部分,所以检查文本部分会更适合你。
  • @user1599964 我有同样的用例。你确定解决方案了吗?如果是这样,您介意分享您的方法吗?

标签: python twitter tweepy tweetstream


【解决方案1】:

我首先想到的是为每个关键字创建一个单独的流并在单独的线程中启动它,如下所示:

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 请求参数。有一些边缘情况可能会导致问题。

希望对您有所帮助。

【讨论】:

  • 问题是 twitter API 建议我们应该尽量减少 INDIVIDUAL 流的数量。因为如果来自同一个 IP/帐户的流连接太多,那么它将被列入黑名单。看到这个:dev.twitter.com/discussions/921
  • 是的,对,一般情况下这不是一个选项,谢谢分享。
  • 嗯...好吧,我想,现在我只需要坚持匹配每个关键字(在使其不区分大小写之后)与每个推文的文本,以便在推文和推文之间形成映射关键字。
【解决方案2】:

返回任何/所有“触发”跟踪术语的列表

我有一个非常相关的问题,我通过列表理解解决了它。也就是说,我有一个原始推文列表,我的跟踪过滤器术语为“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

【讨论】:

    猜你喜欢
    • 2014-08-09
    • 2016-09-13
    • 1970-01-01
    • 2013-02-22
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2017-06-19
    相关资源
    最近更新 更多