2013-05-17 24 views
5

Tôi có N từ khóa khác nhau mà tôi đang theo dõi (vì mục đích đơn giản, hãy N = 3). Vì vậy, trong trạng thái/bộ lọc GET, tôi sẽ cung cấp cho 3 từ khóa trong đối số "theo dõi".lọc các tweet nhận được từ trạng thái/bộ lọc (API trực tuyến)

Bây giờ, các tweet mà tôi sẽ nhận được có thể là BẤT K of từ khóa nào trong số 3 từ khóa mà tôi đã đề cập. Vấn đề là tôi muốn giải quyết xem tweet nào tương ứng với từ khóa nào. tức là ánh xạ giữa các tweet và (các) từ khóa (được đề cập trong đối số "theo dõi").

Rõ ràng, không có cách nào để thực hiện việc này mà không thực hiện bất kỳ quá trình xử lý nào trên các tweet nhận được.

Vì vậy, tôi đã tự hỏi cách tốt nhất để thực hiện việc xử lý này là gì? Tìm kiếm các từ khóa trong văn bản của tweet? Điều gì về phân biệt chữ hoa chữ thường? Điều gì xảy ra khi nhiều từ trong cùng một từ khóa, ví dụ: "Katrina Kaif"?

Tôi hiện đang cố gắng để xây dựng một số biểu hiện thường xuyên ...

Tôi đã suy nghĩ cách tốt nhất là sử dụng cùng một logic (biểu thức thông thường vv) như được sử dụng ban đầu được trạng thái/lọc API. Làm cách nào để biết trạng thái API được sử dụng bởi trạng thái API Twitter/lọc chính nó để so khớp các tweet với từ khóa?

Lời khuyên? Cứu giúp?

PS: Tôi đang sử dụng Python, Tweepy, Regex, MongoDB/Apache S4 (đối với tính toán phân tán)

+1

Đối với biểu thức chính quy lớn hơn N có thể khá đau. Cách đơn giản nhất sẽ là biến văn bản thành chữ thường và cho mỗi tweet kiểm tra từ khóa cho sự tồn tại của nó. Nếu bạn muốn kiểm tra đối sánh chính xác thì bạn có thể mã hóa các tweet của mình và nhận được giao điểm của tập hợp từ khóa và bộ mã thông báo. Giao lộ sẽ là các từ khóa phù hợp với tweet. – cubbuk

+0

@cubbuk: Hiện tại, tôi có N = 100. Tốt hơn là chỉ tìm kiếm từ khóa trong phần "văn bản" của tweet, đúng không? – user1599964

+1

Đúng như tôi biết, twitter khớp với phần văn bản của tweet, vì vậy việc kiểm tra phần văn bản sẽ phù hợp hơn với bạn. – cubbuk

Trả lời

2

Điều đầu tiên đi vào tâm trí của tôi là tạo ra một dòng riêng biệt cho mỗi từ khóa và bắt đầu nó trong một riêng biệt chủ đề, như thế này:

from threading import Thread 
import tweepy 


class StreamListener(tweepy.StreamListener): 
    def __init__(self, keyword, api=None): 
     super(StreamListener, self).__init__(api) 
     self.keyword = keyword 

    def on_status(self, tweet): 
     print 'Ran on_status' 

    def on_error(self, status_code): 
     print 'Error: ' + repr(status_code) 
     return False 

    def on_data(self, data): 
     print self.keyword, data 
     print 'Ok, this is actually running' 


def start_stream(auth, track): 
    tweepy.Stream(auth=auth, listener=StreamListener(track)).filter(track=[track]) 


auth = tweepy.OAuthHandler(<consumer_key>, <consumer_secret>) 
auth.set_access_token(<key>, <secret>) 

track = ['obama', 'cats', 'python'] 
for item in track: 
    thread = Thread(target=start_stream, args=(auth, item)) 
    thread.start() 

Nếu bạn vẫn muốn phân biệt tweets theo từ khóa của mình trong một dòng duy nhất, đây là some info về cách sử dụng twitter request parameter track. Có một số trường hợp cạnh có thể gây ra vấn đề.

Hy vọng điều đó sẽ hữu ích.

+2

Vấn đề là API twitter cho chúng ta biết rằng chúng ta nên cố gắng giảm số lượng các luồng độc lập càng nhiều càng tốt. Bởi vì nếu có quá nhiều kết nối luồng từ cùng một IP/tài khoản thì nó sẽ bị liệt vào danh sách đen. Xem này: https://dev.twitter.com/discussions/921 – user1599964

+0

Vâng, đúng, đây không phải là một lựa chọn nói chung, cảm ơn bạn đã chia sẻ. – alecxe

+0

Hmm ... tôi đoán vậy, bây giờ tôi sẽ chỉ phải gắn bó với từ khóa M (I (sau khi làm cho nó không phân biệt chữ hoa chữ thường) với văn bản của MACHI tweet, để tạo thành ánh xạ giữa tweet và từ khóa. – user1599964

0

danh sách Return của bất kỳ/tất cả 'kích hoạt' về ca khúc

Tôi đã có một vấn đề rất có liên quan và tôi giải quyết nó bằng danh sách hiểu. Đó là, tôi đã có một danh sách các tweets thô, và các thuật ngữ lọc theo dõi của tôi là 'listoftermstofind' và 'rawtweetlist'. Sau đó, bạn có thể chạy phần sau để trả về danh sách các danh sách của bất kỳ và tất cả các cụm từ theo dõi được tìm thấy trong mỗi tweet.

j=[x.upper() for x in listoftermstofind] #your track filters, but making case insensitive 
ListOfTweets=[x.upper() for x in rawtweetlist] #converting case to upper for all tweets 
triggers=list(map(lambda y: list(filter(lambda x: x in y, j)), ListOfTweets)) 

này hoạt động tốt, vì các bộ lọc theo dõi trong API cụ thể (giảm đến mức nhân vật) chứ không phải bất kỳ chế biến tìm kiếm ngôn ngữ tự nhiên hoặc bất cứ điều gì như thế. Tôi khuyên bạn nên đọc các tài liệu API về lọc chi tiết, nó đi qua việc sử dụng khá tốt: https://dev.twitter.com/streaming/overview/request-parameters