Dla NLTK w wersji 3.1, wewnątrz nltk/tag/__init__.py
, pos_tag
jest zdefiniowany następująco:
from nltk.tag.perceptron import PerceptronTagger
def pos_tag(tokens, tagset=None):
tagger = PerceptronTagger()
return _pos_tag(tokens, tagset, tagger)
więc każde wywołanie pos_tag
pierwszą instancję PerceptronTagger
który zajmuje trochę czasu, ponieważ wiąże loading a pickle file. _pos_tag
simply calls tagger.tag
, gdy tagset
jest None
. Więc można zaoszczędzić trochę czasu poprzez załadowanie pliku raz i nazywając tagger.tag
siebie zamiast dzwonić 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
wykorzystuje tę samą sztuczkę jak powyżej - it instantiates PerceptronTagger
once przed wywołaniem _pos_tag
wielokrotnie. Więc otrzymasz porównywalną poprawę wydajności przy użyciu powyższego kodu, tak jak robiłbyś to przez refaktoryzację i wywołanie pos_tag_sents
.
Ponadto, jeśli stop_words
długa lista, można zaoszczędzić trochę czasu poprzez stop_words
zestaw:
stop_words = set(stop_words)
od sprawdzenia członkostwa w zestawie (np pos not in stop_words
) jest O(1)
(stały czas) podczas sprawdzania członkostwa na liście jest operacja O(n)
(tj. wymaga czasu, który rośnie proporcjonalnie do długości listy).
Jakiej wersji nltk używasz? (tj. 'nltk .__ version__') – unutbu
to 3.1 (asdfasdf) – displayname
Tło: http://stackoverflow.com/questions/33676526/pos-tagger-jest-wydajnie-slow#comment55128218_33677051 – tripleee