如何在tweetstream(Python)中实时过滤单词?

2024-09-27 07:21:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将来自Twitter流媒体API的所有tweets实时保存到数据库中,当然,要过滤掉特定的单词列表。我通过使用tweetstream,在调用FilterStream()之前定义列表单词

words = ["word1","two words","anotherWord"]

我想做的是能够添加/更改/删除这些值,而不停止脚本。为此,我创建了一个纯文本文件,其中包含要过滤掉的单词,并用换行符隔开。使用这段代码,我得到了一个完美的列表:

^{pr2}$

我让这些行在它开始的时候工作,但我需要它在每次检查流时都这样做。有什么想法吗?在


Tags: 脚本api数据库列表定义twitter单词tweets
2条回答

也许这样的方法会奏效:

def rebuild_wordlist(s):
    with open('words.txt','r') as f:
        return set(f.read().split('\n'))

def match(tweet):
    return any(w in tweet for w in words)

words, timestamp = rebuild_wordlist(), time.time()
stream = tweetstream.SampleStream("username", "password")
fstream = ifilter(match, stream)

for tweet in fstream:
    do_some_with_tweet(tweet)
    if time.time() > timestamp + 5.0:
        # refresh the wordlist every 5 seconds
        words, timestamp = rebuild_wordlist(), time.time()

words集合是一个全局的,在过滤器运行时每隔几秒钟刷新一次。在

您可以在一个线程中读取更新的单词列表,并在另一个线程中使用Queue进行通信来处理tweet。在

示例:

读取tweets的线程:

def read_tweets(q):
    words = q.get()
    while True:
        with tweetstream.FilterStream(..track=words,..) as stream:
             for tweet in stream: #NOTE:it requires special handling if it blocks
                 process(tweet)
                 try: words = q.get_nowait() # try to read a new word list
                 except Empty: pass
                 else: break # start new connection

读单词的线程:

^{pr2}$

主脚本可能看起来像:

 q = Queue(1)
 t = Thread(target=read_tweets, args=(q,))
 t.daemon = True
 t.start()
 read_words(q)

您可以使用inotify或类似方法来监视'words.txt'文件的更改,而不是轮询。在

相关问题 更多 >

    热门问题