Python 在Tweepy流媒体API中只接收一次相同的推文
我想使用Twitter流API和Python的Tweepy模块,在某个关键字上构建一组推文数据 到目前为止还不错,但有人知道如何接收与转发内容完全相同的推文吗?对于我的数据分析来说,多次接收同一条推文并不是很有用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) 设置[“这是另
是否有一个过滤器可以删除已经下载到数据集中的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。