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

Jes*_*ose 14 python nltk

我正在使用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_tagtagger.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)

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

  • `tagger.tag(tokens)`应该足够了,而不是`nltk.tag._pos_tag(标记,标记集,标记符)` (4认同)

tha*_*nos 5

nltk的POS标签非常慢:

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

  1. sent_tokenize 1.06190705299
  2. word_tokenize 4.86865639687
  3. pos_tag 233.487122536
  4. chunker 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
Run Code Online (Sandbox Code Playgroud)