POS标签性能下降。我可以做一些预热吗?

时间:2012-07-23 09:45:36

标签: python nltk

我正在使用NLTK来标记网页请求中的推文。如您所知,Django为每个请求实例化请求处理程序。

我注意到了这一点:对于一个请求(约200条推文),第一条推文需要大约18秒来标记,而所有后续推文需要大约120毫秒来标记。我该怎么做才能加快这个过程?

我可以执行“预热请求”,以便为每个请求加载模块数据吗?

class MyRequestHandler(BaseHandler):
    def read(self, request): #this runs for a GET request
        #...in a loop:
            tokens = nltk.word_tokenize( tweet)
            tagged = nltk.pos_tag( tokens)

3 个答案:

答案 0 :(得分:22)

前18秒是POS标记器从磁盘上分配到RAM中。如果你想解决这个问题,请在请求函数之外自己加载标记器。

import nltk.data, nltk.tag
tagger = nltk.data.load(nltk.tag._POS_TAGGER)

然后将nltk.pos_tag替换为tagger.tag。 权衡是app启动现在需要+ 18秒。

答案 1 :(得分:19)

如前所述,每次使用标准pos_tag方法时,NLTK都会打开。对于NLTK 3.1,假设您对NLTK的默认标记器(PerceptronTagger)感到满意,那么以下方法对我有用:

首先加载标记器:

left

然后,每次你需要标记一些文字时:

from nltk.tag.perceptron import PerceptronTagger
tagger = PerceptronTagger()

这基本上绕过了主要方法。为我加速了数百次。我假设相同的方法适用于任何标记器。

答案 2 :(得分:5)

nltk的POS标签非常慢:

对我来说,我可以在243秒内完成13739条推文:

  1. sent_tokenize 1.06190705299
  2. word_tokenize 4.86865639687
  3. pos_tag 233.487122536
  4. chunker 3.05982065201
  5. 参见http://honnibal.wordpress.com/2013/09/11/a-good-part-of-speechpos-tagger-in-about-200-lines-of-python/ 但总结一下:

    Tagger     | Accuracy | Time (130k words)
    -----------+----------+------------------
    CyGreedyAP |    97.1% | 4s
    NLTK       |    94.0% | 3m56s
    Pattern    |    93.5% | 26s
    PyGreedyAP |    96.8% | 12s