2013-05-17 5 views
5

मेरे पास एन अलग-अलग कीवर्ड हैं जिन्हें मैं ट्रैक कर रहा हूं (सादगी के लिए, एन = 3 दें)। तो स्थिति/फ़िल्टर प्राप्त करने में, मैं "ट्रैक" तर्क में 3 कीवर्ड दूंगा।स्थिति/फ़िल्टर (स्ट्रीमिंग एपीआई) से प्राप्त ट्वीट्स का फ़िल्टरिंग

अब जो ट्वीट्स मैं प्राप्त कर रहा हूं वह मेरे द्वारा वर्णित 3 कीवर्ड में से किसी एक से हो सकता है। समस्या यह है कि मैं यह हल करना चाहता हूं कि कौन सा ट्वीट किस कीवर्ड से मेल खाता है। यानी ट्वीट्स और कीवर्ड (जैसे "ट्रैक" तर्क में उल्लिखित) के बीच मैपिंग।

जाहिर है, प्राप्त ट्वीट्स पर कोई प्रसंस्करण किए बिना ऐसा करने का कोई तरीका नहीं है।

तो मैं सोच रहा था कि इस प्रसंस्करण को करने का सबसे अच्छा तरीका क्या है? ट्वीट के टेक्स्ट में कीवर्ड खोजें? केस-असंवेदनशील के बारे में क्या? एक ही कीवर्ड में कई शब्द कब होते हैं, उदाहरण के लिए: "कैटरीना कैफ"?

मैं वर्तमान में कुछ नियमित अभिव्यक्ति तैयार करने के लिए कोशिश कर रहा हूँ ...

मैं सबसे अच्छा तरीका के रूप में मूल रूप से स्थितियों/फिल्टर एपीआई होना प्रयोग किया जाता है एक ही तर्क (नियमित अभिव्यक्ति आदि) का उपयोग करने के लिए सोच रहा था। कैसे पता चलेगा कि ट्विटर एपीआई स्टेटस द्वारा तर्क का उपयोग किस प्रकार किया जाता है/कीवर्ड पर ट्वीट्स से मिलान करने के लिए खुद को फ़िल्टर करता है?

सलाह? मदद?

पुनश्च: मैं अजगर, Tweepy, Regex, MongoDB/अपाचे एस 4 का उपयोग कर रहा (वितरित कंप्यूटिंग के लिए)

+1

बड़े एन नियमित अभिव्यक्ति के लिए काफी दर्द हो सकता है। सबसे आसान तरीका टेक्स्ट को लोअर-केस में बदलना होगा और प्रत्येक कीवर्ड के लिए अपने अस्तित्व के लिए ट्वीट ट्वीट करना होगा। यदि आप सटीक मिलान की जांच करना चाहते हैं तो आप अपनी ट्वीट्स को टोकननाइज़ कर सकते हैं और अपने कीवर्ड सेट और टोकन सेट का चौराहे प्राप्त कर सकते हैं। छेड़छाड़ ट्वीट से मेल खाने वाले कीवर्ड होंगे। – cubbuk

+0

@cubbuk: वर्तमान में, मेरे पास एन = 100 है। ट्वीट के केवल "टेक्स्ट" भाग में कीवर्ड खोजना बेहतर है, है ना? – user1599964

+1

हाँ जहां तक ​​मुझे पता है कि ट्विटर केवल ट्वीट के टेक्स्ट हिस्से से मेल खाता है, इसलिए टेक्स्ट भाग की जांच करना आपके लिए अधिक उपयुक्त होगा। – cubbuk

उत्तर

2

पहली बात मेरे मन में आ रहा है कि हर कीवर्ड के लिए अलग स्ट्रीम बनाने और एक अलग में इसे शुरू करने के लिए है धागा, इस तरह:

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() 

आप अभी भी एक एकल स्ट्रीम में अपने आप से कीवर्ड द्वारा ट्वीट्स भेद करने के लिए चाहते हैं, तो यहाँ some info कैसे चहचहाना track अनुरोध पैरामीटर का उपयोग करता पर है। कुछ किनारे के मामले हैं जो समस्याएं पैदा कर सकते हैं।

उम्मीद है कि मदद करता है। किसी भी

+2

बात यह है कि ट्विटर एपीआई हमें बताती है कि हमें यथासंभव अविश्वसनीय धाराओं की संख्या को कम करने की कोशिश करनी चाहिए। क्योंकि यदि एक ही आईपी/खाते से बहुत से स्ट्रीम कनेक्शन हैं, तो यह ब्लैकलिस्ट हो जाएगा। इसे देखें: https://dev.twitter.com/discussions/921 – user1599964

+0

हाँ, ठीक है, यह आमतौर पर एक विकल्प नहीं है, साझा करने के लिए धन्यवाद। – alecxe

+0

हम्म ... अच्छा मुझे लगता है, अभी के लिए मुझे प्रत्येक ट्वीट के पाठ के साथ बस प्रत्येक कीवर्ड (इसे केस-असंवेदनशील बनाने के बाद) मिलान करने के लिए चिपकना होगा, ताकि ट्वीट और कीवर्ड के बीच मैपिंग तैयार किया जा सके। – user1599964

0

वापसी सूची/सभी 'सक्रिय' ट्रैक शर्तों

मैं एक बहुत ही संबंधित मुद्दा था और मैं सूची समझ से इसे हल। यही है, मेरे पास कच्ची ट्वीट्स की एक सूची थी, और मेरे ट्रैक फ़िल्टर शब्द 'listoftermstofind' और 'rawtweetlist' के रूप में थे। फिर आप प्रत्येक ट्वीट में पाए गए किसी भी और सभी ट्रैक शर्तों की सूचियों की सूची लौटने के लिए निम्नलिखित चला सकते हैं।

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)) 

यह नहीं बल्कि किसी भी खोज की तरह संसाधन या प्राकृतिक भाषा किसी भी चीज से, अच्छी तरह से काम करता है क्योंकि एपीआई में ट्रैक फिल्टर विशिष्ट (चरित्र स्तर तक नीचे) कर रहे हैं। मैं विस्तार से फ़िल्टरिंग पर एपीआई दस्तावेज़ पढ़ने की सलाह देता हूं, यह उपयोग के माध्यम से काफी अच्छी तरह से जाता है: https://dev.twitter.com/streaming/overview/request-parameters

संबंधित मुद्दे