【问题标题】:Receive same tweets only once in Tweepy Streaming API在 Tweepy Streaming API 中只接收一次相同的推文
【发布时间】:2015-06-27 15:20:47
【问题描述】:

我想使用适用于 Python 的 Twitter Streaming API 和 Tweepy 模块构建关于某个关键字的推文数据集。

到目前为止一切顺利,但有谁知道如何只接收一次完全相同的推文(主要是转发)?因为我的数据分析对于多次接收同一条推文并没有什么用处。

是否有一个过滤器可以删除已经下载到数据集中的推文?

【问题讨论】:

  • 如果您将下载的推文存储在列表中,您可以检查成员资格,或者将列表转换为集合,因为集合只能包含唯一元素。

标签: python tweepy twitter-streaming-api


【解决方案1】:

这里有两种情况:

1) 推文完全匹配 2)推文几乎相同

两种情况,我都是这样做的(你可以选择自己的相似度阈值):

from difflib import SequenceMatcher

similarity_threshold = 0.7

def similarity(a, b):
        return SequenceMatcher(None, a, b).ratio()

latest_tweets = ()
duplicate_tweet = next((t for t in latest_tweets if similarity(data.text, t) > similarity_threshold), None)

def on_status(self, data):
    tw = next((t for t in latest_tweets if similarity(data.text, t) > similarity_threshold), None)

    if tw == None:
        ## this is a new tweet
        latest_tweets.append(tw)

    return True

【讨论】:

    【解决方案2】:

    如果您发现运行时不适用于给定大小的数据,那么是时候做一些更好的事情了。一些 Ad-Hawk 散列可能是遍历您获取的批次并将其存储在集合字典中,其中键是每个字母的数量/某个桶大小。这会将您的推文划分为更合理的集合,并允许根据您的存储桶大小将线性时间的操作减少某个常数因子。定义你的 has 向量将决定结果数据对象的行为。例如,如果您只使用字母字符,那么在具有足够大的桶大小的情况下,带有额外引号和表情符号的克隆可能会在同一个桶中。另一方面,如果你对推文中不同的确实得到的数量进行散列,你可能不会看到太大的影响。

    setOfTweets = ['this is a tweet #Twitter','this is another tweet.']
    alphabetLetters=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    MyHash={} # not actually a pythonic hash
    for k in setofTweets:
        counts = {'a': 0, 'c': 0, 'b': 0, 'e': 0, 'd': 0, 'g': 0, 'f': 0, 'i': 0, 'h': 0, 'k': 0, 'j': 0, 'm': 0, 'l': 0, 'o': 0, 'n': 0, 'q': 0, 'p': 0, 's': 0, 'r': 0, 'u': 0, 't': 0, 'w': 0, 'v': 0, 'y': 0, 'x': 0, 'z': 0}
        twiddle = False
        for k2 in k:
            try:
               counts[k2.lower()]+=1
            except(KeyError):
               twiddle = !twiddle
        key = tuple([counts[k]/3 for k in alphabetLetters])
        try:
            MyHash[key].add(k)
        except(KeyError):
            MyHash[key]=set()
            MyHash[key].add(k)
    

    我不想将其称为线性过滤器,因为桶上的负载因子将大于 1。但是当数据很大时,它绝对比一个大集合快。

    【讨论】:

      【解决方案3】:

      你可以制作一组推文

      setOfTweets = set(['this is a tweet #Twitter','this is another tweet.'])
      print(setOfTweets)
      

      set(['这是另一条推文。', '这是一条推文#Twitter'])

      setOfTweets.add('this is a new tweet')
      setOfTweets.add('this is another tweet.')#Duplicate is not added
      print(setOfTweets)
      

      set(['这是另一条推文。', '这是一条新推文', '这是一条推文#Twitter'])

      【讨论】:

      • 不使用sets 不能解决这个问题,因为在现实世界中,给定数据集中不会只有 3-4 条推文,它可能包含数千条推文,并且set 方法真的会变得太慢,它也可能会停止脚本
      • 您可以在查询结束时使用 -filter:retweets 但如果您想检查重复的文本,您必须检查您拥有的推文。 *我认为
      • 你认为是对的,但要记住的是,数据集可能有几十万行,这种方法行不通,对不起,最好的事情是我可以记住的是使用某种散列算法并将每个推文文本转换为散列(整数),然后将这些散列存储在字典中并删除重复项,我猜这会非常快,从 O(n*m)复杂性现在将降至 O(log(n))。
      猜你喜欢
      • 2014-01-18
      • 2018-06-27
      • 2019-03-10
      • 2018-11-01
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      • 2016-06-29
      相关资源
      最近更新 更多