POS-Tagger非常缓慢。

7
我正在使用nltk生成n-gram,首先删除给定的停止词。然而,在我的CPU(Intel i7)上,nltk.pos_tag()非常缓慢,最高可达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)

这真的很慢吗,还是我在这里做错了什么?

能否将您输入的文本发给我?你的机器配置是什么(CPU 速度和内存)?您是否连接到云端,如何计时函数?同时请参考http://stackoverflow.com/questions/33558836/pos-tagging-using-nltk-takes-time。 - alvas
1
@alvas 这是Intel i7(在问题中说明)。16GB RAM。不,它不在云端,是本地的。你可以在我的代码示例中看到我如何计时。 - Stefan Falk
如果你有一个庞大的数据集,你需要并行化你的解决方案。否则(如果你可以将标记的句子保存在RAM中),只需收集所有标记的句子,然后进行过滤即可。 - alvas
3个回答

9
使用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

1
非常好!使用pos_tag_sents()可以大大提高性能。这是为什么呢?看起来pos_tag()会重复一些初始化或类似的操作。 - Stefan Falk
这是一个需要较长回答的问题,但如果你提出一个关于为什么和如何更快的单独问题,可能会有人回答。如果没有人回答,我会在明天晚上比较空闲的时候回答 =) - alvas
给你 ;) - Stefan Falk
哇,有人已经回答了它 =) - alvas

7
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模块,这需要很多计算时间。您可以通过直接调用tagger.tag自己来节省这个时间:

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

有没有办法缩短使用nltk的ner的时间? - raj

0

如果你正在寻找另一个在Python中具有快速性能的POS标注器,你可能想尝试RDRPOSTagger。例如,在英语POS标注方面,使用Core 2Duo 2.4GHz计算机的单线程实现,标注速度为每秒8K个单词。您可以通过简单地使用多线程模式来获得更快的标记速度。与最先进的标注器相比,RDRPOSTagger获得了非常有竞争力的准确性,并且现在支持40种语言的预训练模型。请参见this paper中的实验结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接