2015-04-20 3 views
1

Я хотел бы создать набор данных твитов по определенному ключевому слову, используя API Streaming Stream и модуль Tweepy для Python.Получать те же твиты только один раз в Tweedy Streaming API

До сих пор так хорошо, но кто-нибудь знает, как получать твиты, которые являются точно такими же (в основном, ретвитами) только один раз? Для моего анализа данных не очень полезно получать один и тот же твит несколько раз.

Есть ли фильтр, который удаляет твиты, которые уже были загружены в набор данных?

+0

Если вы сохраняете загруженные твиты в списке, вы можете проверить принадлежность или преобразовать список в набор, поскольку набор может содержать только уникальные элементы. – reticentroot

ответ

-1

Вы могли бы сделать набор @ Текст в

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

набор ([ 'это еще один твит.', 'Это чириканье #Twitter'])

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

набор ([ «это еще один твит». «Это новый твит», «это твит #Twitter»])

+0

Не использовать 'sets', это не решение этой проблемы, так как в реальном мире в данном наборе данных не будет всего 3-4 твита, это может содержать тысячи твитов, и набор методов действительно будет слишком медленный, он может остановить скрипт, а также – ZdaR

+0

вы можете использовать -filter: ретвиты в конце вашего запроса, но если вы хотите проверить дублированный текст, вам нужно проверить ваши твиты. * Я думаю – kpie

+0

То, что вы считаете правильным, но нужно иметь в виду, что набор данных может достигать сотни тысяч строк, этот подход не будет работать, извините, лучшее, что я могу вспомнить использует какой-то алгоритм Хеширования и конвертирует каждый текст твита в хэш (целое число), а затем сохраняет эти хеши в словаре и удаляет дубликаты. Было бы очень быстро, я полагаю, из O (n * m) сложность теперь будет снижаться к O (log (n)). – ZdaR

0

Если вы обнаружите, что время выполнения неприменимо для данных заданного размера, тогда пришло время сделать что-то лучше. Некоторое хеширование Ad-Hawk может состоять в том, чтобы перебирать пакет, который вы извлекаете, и хранить его в словаре наборов, где ключи - это количество каждой буквы/небольшого размера. Это позволит разделить ваши твиты на более разумные наборы и позволить операциям в линейном времени сокращаться на некоторый постоянный коэффициент, основываясь на вашем размере ведра. Определение вашего вектора будет определять поведение результирующего объекта данных. Например, если вы используете только символы алфавита, то клоны с дополнительными кавычками и эмоциями, скорее всего, будут в одном и том же ковше при достаточно большом размере ковша. с другой стороны, если вы хешировали количество разных, попавших в твит, вы, вероятно, не увидите большого эффекта.

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 случая здесь:

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