我正在使用NLTK在Web请求中标记推文.如您所知,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)
Run Code Online (Sandbox Code Playgroud)
Jac*_*cob 22
那些前18秒是POS标记器从磁盘上分配到RAM中.如果你想解决这个问题,请在请求函数之外自己加载标记器.
import nltk.data, nltk.tag
tagger = nltk.data.load(nltk.tag._POS_TAGGER)
Run Code Online (Sandbox Code Playgroud)
然后替换nltk.pos_tag为tagger.tag.权衡是app启动现在需要+ 18秒.
ale*_*ess 19
如前所述,每次使用标准pos_tag方法时,NLTK都会破坏.对于NLTK 3.1,假设您对NLTK的默认标记器(PerceptronTagger)感到满意,那么以下方法对我有用:
首先加载标记器:
from nltk.tag.perceptron import PerceptronTagger
tagger = PerceptronTagger()
Run Code Online (Sandbox Code Playgroud)
然后,每次需要标记一些文本时:
tagset = None
tokens = nltk.word_tokenize('the mat sat on the cat')
tags = nltk.tag._pos_tag(tokens, tagset, tagger)
Run Code Online (Sandbox Code Playgroud)
这基本上绕过了主要方法.为我加速了数百次.我假设相同的方法适用于任何标记器.
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
Run Code Online (Sandbox Code Playgroud)