我想使用Twitter Streaming API和Python的Tweepy模块构建一个关于某个关键字的推文数据集。
到目前为止一直很好,但是有没有人知道如何只接收一次完全相同的推文(主要是转推)?对于我的数据分析,多次接收相同的推文并不是真的有用。
是否有可能会删除已下载到数据集的推文的过滤器?
答案 0 :(得分:1)
这里有2个案例:
1)推文完全匹配 2)推文几乎相同
两种情况都是这样的(你可以选择你自己的similarity_threshold):
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
答案 1 :(得分:0)
如果您发现运行时不适用于给定大小的数据,那么是时候做更好的事情了。某些Ad-Hawk哈希可能会迭代您获取的批处理并将其存储在集合字典中,其中键是每个字母的数量/某个存储桶大小。这会将您的推文分成更合理的集合,并允许线性时间内的操作根据您的存储桶大小减少一些常数因子。定义has向量将确定结果数据对象的行为。例如,如果您只使用字母字符,那么具有额外引号和emogies的克隆可能会在给定足够大的存储桶大小的情况下位于同一个存储桶中。另一方面,如果你对推文中不同的数量进行了深入研究,你可能看不到多少效果。
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.但是当数据很大时,它比一个大集合更快。
答案 2 :(得分:-1)
您可以制作一组推文文本
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)
设置(['这是另一条推文。','这是一条新推文','这是推文#Twitter'])