Python 在Tweepy流媒体API中只接收一次相同的推文

Python 在Tweepy流媒体API中只接收一次相同的推文,python,tweepy,twitter-streaming-api,Python,Tweepy,Twitter Streaming Api,我想使用Twitter流API和Python的Tweepy模块,在某个关键字上构建一组推文数据 到目前为止还不错,但有人知道如何接收与转发内容完全相同的推文吗?对于我的数据分析来说,多次接收同一条推文并不是很有用 是否有一个过滤器可以删除已经下载到数据集中的tweet?您可以制作一组tweet文本 setOfTweets = set(['this is a tweet #Twitter','this is another tweet.']) print(setOfTweets) 设置[“这是另

我想使用Twitter流API和Python的Tweepy模块,在某个关键字上构建一组推文数据

到目前为止还不错,但有人知道如何接收与转发内容完全相同的推文吗?对于我的数据分析来说,多次接收同一条推文并不是很有用


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

您可以制作一组tweet文本

setOfTweets = set(['this is a tweet #Twitter','this is another tweet.'])
print(setOfTweets)
设置[“这是另一条推特。”,“这是一条推特推特”]

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

set[‘这是另一条推文’、‘这是一条新推文’、‘这是一条推文’]

如果您发现运行时不适用于给定大小的数据,那么是时候做一些更好的事情了。一些AdHawk散列可能是迭代获取的批并将其存储在集合字典中,其中键是每个字母的编号/某个桶大小。这将把你的tweet划分成更合理的集合,并根据你的bucket大小,允许线性时间内的操作减少一些常数因子。定义has向量将决定结果数据对象的行为。例如,如果您只使用字母字符,那么如果存储桶大小足够大,则带有额外引号和表情的克隆可能位于同一个存储桶中。另一方面,如果你对tweet中不同did的数量进行哈希运算,你可能不会看到太多的效果

setOfTweets.add('this is a new tweet')
setOfTweets.add('this is another tweet.')#Duplicate is not added
print(setOfTweets)
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。但当数据很大时,它显然比一个大数据集要快。

这里有两种情况:

1推文完全匹配 2这条推文几乎是一样的

在这两种情况下,我都会这样做。您可以选择自己的相似性\u阈值:

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

如果您将下载的推文存储在列表中,您可以检查其成员资格,或者将列表转换为一个集合,因为集合只能包含唯一的元素。不使用集合并不能解决此问题,因为在现实世界中,给定数据集中不会只有3-4条推文,它可能包含数千条推文,而且集合方法会变得太慢,它也可能会停止脚本。您可以在查询结束时使用-filter:retweets,但如果您想检查重复的文本,则必须通过已有的tweet进行检查*我认为你的想法是对的,但要记住的是,数据集可能有几十万行那么大,这种方法行不通,对不起,我能想到的最好的事情就是使用某种散列算法,将每条推文文本转换成一个散列整数,然后将这些散列存储在字典中并删除重复项,我想这会非常快,从现在开始,复杂性将下降到Ologn。