POS-Tagger 非常慢

问题描述 投票:0回答:4

我正在使用

nltk
通过首先删除给定的停用词来从句子生成 n-gram。然而,
nltk.pos_tag()
非常慢,在我的 CPU(Intel 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)

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

python nlp nltk pos-tagger
4个回答
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

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))

0
投票

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


0
投票

如果您使用嵌套列表,您应该展平并使用单个列表 这将帮助您提高StanfordPOSTagger的速度

© www.soinside.com 2019 - 2024. All rights reserved.