对于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
,这需要一些时间,因为它涉及
加载一个 pickle 文件。当
tagset
为
None
时,
_pos_tag
只是调用 xpather.tag
。
因此,您可以通过仅加载文件
一次,并自行调用
iagger.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
之前,它只实例化了一次PerceptronTagger
。因此,通过使用上面的代码或重构并调用pos_tag_sents
调用,您将获得可比较的性能提升。
另外,如果stop_words
是一个长列表,则可以将其转换为集合来节省一些时间:
stop_words = set(stop_words)
因为检查一个集合中是否包含某个元素 (例如, pos not in stop_words
) 是一个 O(1)
的常数时间操作,而检查列表中是否包含某个元素则是一个 O(n)
操作 (即,它需要与列表长度成比例增长的时间)。
nltk.__version__
) - unutbu