2015-11-12 11 views
5

मैं nltk का उपयोग कर रहा हूं ताकि पहले स्टॉप शब्दों को हटाकर वाक्यों से एन-ग्राम उत्पन्न हो सके। हालांकि, nltk.pos_tag() मेरे सीपीयू (इंटेल i7) पर 0.6 सेकंड तक धीमा है।पीओएस-टैगर अविश्वसनीय रूप से धीमा है

उत्पादन:

['The first time I went, and was completely taken by the live jazz band and atmosphere, I ordered the Lobster Cobb Salad.'] 
0.620481014252 
["It's simply the best meal in NYC."] 
0.640982151031 
['You cannot go wrong at the Red Eye Grill.'] 
0.644664049149 

कोड:

for sentence in source: 

    nltk_ngrams = None 

    if stop_words is not None: 
     start = time.time() 
     sentence_pos = nltk.pos_tag(word_tokenize(sentence)) 
     print time.time() - start 

     filtered_words = [word for (word, pos) in sentence_pos if pos not in stop_words] 
    else: 
     filtered_words = ngrams(sentence.split(), n) 

यह सच है कि धीमी गति है या मैं यहाँ कुछ गलत कर रहा हूँ? कई वाक्य टैगिंग के लिए

+0

आप पाठ पोस्ट कर सकते हैं कि आपके पास इनपुट है? आपकी मशीन का विनिर्देश क्या है (सीपीयू गति और रैम)? क्या आप क्लाउड से कनेक्ट हो रहे हैं और आप फ़ंक्शन का समय कैसे लगा रहे हैं? यह भी देखें http://stackoverflow.com/questions/33558836/pos-tagging-using-nltk-takes-time – alvas

+1

@alvas यह एक इंटेल i7 है (प्रश्न में कहा गया है)। 16 जीबी रैम नहीं, यह बादल में नहीं है यह स्थानीय है। आप मेरे कोड उदाहरण में देख सकते हैं कि मैं इसे कैसे समय देता हूं। – displayname

+0

यदि आपके पास एक विशाल डेटासेट है तो आपको अपने समाधान को समानांतर करने की आवश्यकता है। अन्यथा (यदि आप रैम में टैग किए गए वाक्यों को पकड़ सकते हैं), बस सभी टैग की गई वाक्य एकत्र करें, फिर फ़िल्टर को बाद में करें। – alvas

उत्तर

5

उपयोग pos_tag_sents:

>>> import time 
>>> from nltk.corpus import brown 
>>> from nltk import pos_tag 
>>> from nltk import pos_tag_sents 
>>> sents = brown.sents()[:10] 
>>> start = time.time(); pos_tag(sents[0]); print time.time() - start 
0.934092998505 
>>> start = time.time(); [pos_tag(s) for s in sents]; print time.time() - start 
9.5061340332 
>>> start = time.time(); pos_tag_sents(sents); print time.time() - start 
0.939551115036 
+0

बहुत अच्छा! 'Pos_tag_sents()' का उपयोग करके प्रदर्शन में काफी सुधार होता है। यह अजीब बात है कि यह मामला क्यों है। ऐसा लगता है कि 'pos_tag()' कुछ प्रारंभिकरण या ऐसा कुछ दोहराता है। – displayname

+0

यह एक बहुत लंबा उत्तर वाला प्रश्न है, लेकिन यदि आप एक अलग सवाल पूछते हैं कि यह कैसे और क्यों तेज़ है, तो कोई जवाब दे सकता है। अगर कोई जवाब नहीं देता है, तो मैं कल जवाब दूंगा जब मैं कल शाम हूं =) – alvas

+0

[वहां आप जाते हैं] (http://stackoverflow.com/questions/33829160/why-is-pos-tag-so-painfully -स्लो-एंड-कैन-इन-बी-सेव किया गया);) – displayname

0

आप देख रहे हैं अजगर में तेजी से प्रदर्शन के साथ एक और स्थिति टैगर के लिए, आप RDRPOSTagger की कोशिश करना चाहते हो सकता है। उदाहरण के लिए, अंग्रेजी पीओएस टैगिंग पर, कोर 2 डुओ 2.4 गीगाहर्ट्ज के कंप्यूटर का उपयोग करके, पायथन में एक थ्रेड किए गए कार्यान्वयन के लिए टैगिंग की गति 8K शब्द/सेकेंड है। आप बहु-थ्रेडेड मोड का उपयोग कर तेजी से टैगिंग गति प्राप्त कर सकते हैं। आरडीआरपीओस्टागर अत्याधुनिक टैगर्स की तुलना में बहुत प्रतिस्पर्धी accuracies प्राप्त करता है और अब 40 भाषाओं के लिए पूर्व प्रशिक्षित मॉडल का समर्थन करता है। this paper में प्रयोगात्मक परिणाम देखें।

4
nltk pos_tag is defined as: 
from nltk.tag.perceptron import PerceptronTagger 
def pos_tag(tokens, tagset=None): 
    tagger = PerceptronTagger() 
    return _pos_tag(tokens, tagset, tagger) 

तो pos_tag की प्रत्येक कॉल perceptrontagger मॉड्यूल जो गणना time.You के बहुत लेता है के रूप में सीधे खुद tagger.tag को फोन करके इस समय बचा सकते हैं को दर्शाता है:

from nltk.tag.perceptron import PerceptronTagger 
tagger=PerceptronTagger() 
sentence_pos = tagger.tag(word_tokenize(sentence)) 
+0

धन्यवाद, यह बहुत तेज़ है! – liang

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