14

我正在使用 NLTK 对网络请求中的数百条推文进行 POS 标记。如您所知,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)
4

3 回答 3

22

前 18 秒是将 POS 标记器从磁盘解压到 RAM 中。如果您想解决这个问题,请在请求函数之外自行加载标记器。

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

然后替换nltk.pos_tagtagger.tag. 权衡是应用程序启动现在需要 +18 秒。

于 2012-07-24T00:55:06.413 回答
19

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

首先加载标注器:

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

然后,每次您需要标记一些文本时:

tagset = None
tokens = nltk.word_tokenize('the mat sat on the cat')
tags = nltk.tag._pos_tag(tokens, tagset, tagger)

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

于 2015-11-13T11:47:20.003 回答
5

nltk 的 POS 标记器真的很慢:

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

  1. sent_tokenize 1.06190705299
  2. word_tokenize 4.86865639687
  3. pos_tag 233.487122536
  4. 切块机 3.05982065201

请参阅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
于 2014-07-11T20:30:51.970 回答