我正在使用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)
答案 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条推文:
Tagger | Accuracy | Time (130k words)
-----------+----------+------------------
CyGreedyAP | 97.1% | 4s
NLTK | 94.0% | 3m56s
Pattern | 93.5% | 26s
PyGreedyAP | 96.8% | 12s