nltk संस्करण 3.1 के लिए, nltk/tag/__init__.py
अंदर, pos_tag
इस तरह परिभाषित किया गया है:
from nltk.tag.perceptron import PerceptronTagger
def pos_tag(tokens, tagset=None):
tagger = PerceptronTagger()
return _pos_tag(tokens, tagset, tagger)
तो pos_tag
पहले की गई प्रत्येक कॉल को दर्शाता है PerceptronTagger
जो कुछ समय लगता है, क्योंकि यह loading a pickle file शामिल है। _pos_tag
simply calls tagger.tag
जब tagset
None
है। तो तुम फ़ाइल एक बार लोड हो रहा है, और tagger.tag
बुला खुद के बजाय pos_tag
फोन करके कुछ समय बचा सकते हैं:
from nltk.tag.perceptron import PerceptronTagger
tagger = PerceptronTagger()
def __remove_stop_words(self, tokenized_text, stop_words, tagger=tagger):
sentences_pos = tagger.tag(tokenized_text)
filtered_words = [word for (word, pos) in sentences_pos
if pos not in stop_words and word not in stop_words]
return filtered_words
pos_tag_sents
ऊपर के रूप में ही चाल का उपयोग करता है - _pos_tag
कई बार कॉल करने से पहले it instantiates PerceptronTagger
once। तो आपको उपर्युक्त कोड का उपयोग करके प्रदर्शन में तुलनीय लाभ मिलेगा जैसा कि आप pos_tag_sents
पर रीफैक्टरिंग और कॉल करके करेंगे।
इसके अलावा, अगर stop_words
एक लंबी सूची है, तो आप समय का एक सा stop_words
बनाकर एक सेट को बचाने कर सकते हैं:
stop_words = set(stop_words)
एक सेट में सदस्यता जाँच (जैसे pos not in stop_words
) के बाद से एक O(1)
है (निरंतर समय) एक सूची में सदस्यता की जांच करते समय ऑपरेशन O(n)
ऑपरेशन (यानी उस समय की आवश्यकता होती है जो सूची की लंबाई के अनुपात में बढ़ती है।)
आप एनएलटीके का किस संस्करण का उपयोग कर रहे हैं? (यानी 'nltk .__ संस्करण__') – unutbu
यह 3.1 (asdfasdf) – displayname
पृष्ठभूमि: http://stackoverflow.com/questions/33676526/pos-tagger-is-incredibly-slow#comment55128218_33677051 – tripleee