Python POS-Tagger速度非常慢

Python POS-Tagger速度非常慢,python,nlp,nltk,pos-tagger,Python,Nlp,Nltk,Pos Tagger,我正在使用nltk通过首先删除给定的停止词,从句子中生成n-gram。但是,nltk.pos_tag()非常慢,占用我的CPU(英特尔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 N

我正在使用
nltk
通过首先删除给定的停止词,从句子中生成n-gram。但是,
nltk.pos_tag()
非常慢,占用我的CPU(英特尔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)

这真的有那么慢还是我做错了什么?

使用
pos\u tag\u 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

如果您正在寻找另一个在Python中具有快速性能的POS标记器,您可能想试试。例如,在英语词性标记方面,对于Python中的单线程实现,使用核心为2Duo 2.4GHz的计算机,标记速度为8K单词/秒。只需使用多线程模式,您就可以获得更快的标记速度。与最先进的标记器相比,RDRPOSTARGE获得了非常有竞争力的准确度,现在支持40种语言的预训练模型。请参见中的实验结果

因此,每次调用pos_标记都会实例化Perceptrontager模块,这会占用大量的计算时间。您可以通过直接调用tagger.tag来节省时间,如下所示:

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

你能发布你输入的文本吗?您的机器规格是什么(CPU速度和RAM)?您是否正在连接到云,以及如何对功能进行计时?另请参见@alvas,它是一款英特尔i7(如问题所述)。16GB内存。不,它不在云中,它是本地的。你可以在我的代码示例中看到我是如何计时的。如果你有一个巨大的数据集,你需要并行化你的解决方案。否则(如果你可以在RAM中保存标记的句子),只需收集所有标记的句子,然后进行过滤。非常好!使用
pos\u tag\u sents()
可以大大提高性能。奇怪的是为什么会这样。似乎
pos\u tag()
重复了一些初始化或类似的操作。这是一个回答很长的问题,但是如果你问一个单独的问题,关于如何以及为什么更快,可能会有人回答。如果没有人回答,我会在明天晚上有空的时候回答瞧,其他人回答说=)有没有办法缩短ner使用nltk的时间
from nltk.tag.perceptron import PerceptronTagger
tagger=PerceptronTagger()
sentence_pos = tagger.tag(word_tokenize(sentence))