我正在使用NLTK来对web请求中的推文进行POS标记。如您所知,Django为每个请求实例化一个请求处理程序。
我注意到这一点:对于一个请求(大约200条tweet ),第一条tweet需要大约18秒来标记,而所有后续tweet需要大约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)发布于 2012-07-24 08:55:06
前18秒是POS标记器从磁盘解压到RAM中。如果你想解决这个问题,可以在请求函数之外自己加载标记器。
import nltk.data, nltk.tag
tagger = nltk.data.load(nltk.tag._POS_TAGGER)然后用tagger.tag替换nltk.pos_tag。权衡的是,应用程序启动现在将花费+18秒。
发布于 2015-11-13 19:47:20
如前所述,每次使用标准的pos_tag方法时,NLTK都会解压。对于NLTK3.1,假设你对NLTK3.1的默认标记器(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)这基本上绕过了main方法。为我提速了上百倍。我假设同样的方法也适用于任何标记器。
发布于 2014-07-12 04:30:52
nltk的POS标记器非常慢:
对我来说,我可以在243秒内完成13739条推文:
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% | 12shttps://stackoverflow.com/questions/11610076
复制相似问题