繁体   English   中英

在Tweepy Streaming API中仅接收一次相同的推文

[英]Receive same tweets only once in Tweepy Streaming API

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

到目前为止,一切都很好,但是没有人知道如何只接收一次完全相同的推文(主要是转发)吗? 对我来说,数据分析多次接收相同的推文并不是很有用。

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

这里有2种情况:

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

如果发现运行时不适用于给定大小的数据,那么是时候做些更好的事情了。 一些Ad-Hawk散列可能会遍历您获取的批处理并将其存储在集合字典中,其中键是每个字母的编号/某个存储桶大小。 这会将您的tweet划分为更合理的集合,并根据存储桶的大小,将线性时间的操作减少一定的系数。 定义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。但是,当数据很大时,它的速度要比一个大集合快。

您可以制作一组推文

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

set([['this is another tweet。','this is a tweet #Twitter'])

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM