2012-07-23 10 views
14

Sto utilizzando NLTK per il tag POS hundered di tweet in una richiesta web. Come sai, Django crea un'istanza di un gestore di richieste per ogni richiesta.Prestazioni lente del tagging POS. Posso fare una specie di pre-riscaldamento?

Ho notato questo: per una richiesta (~ 200 tweets), il primo tweet ha bisogno di ~ 18 secondi per taggare, mentre tutti i tweet successivi necessitano di ~ 120 millisecondi per taggare. Cosa posso fare per accelerare il processo?

Posso fare una "richiesta di pre-riscaldamento" in modo che i dati del modulo siano già stati caricati per ogni richiesta?

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

Questo non sembra essere un codice Django: Django non usa "Handler" tranne che in alcuni interni profondi. La webapp di AppEngine, forse? –

+1

Adescarlo con una richiesta fasulla all'avvio? Mi sembra che funzioni esattamente come dovrebbe, a meno che tu non abbia un timeout per la prima lunga richiesta. – tripleee

+0

@ tripleee il ritardo di 18 secondi si verifica per il primo tweet di ** ogni ** richiesta – aitchnyu

risposta

22

Questi primi 18 secondi sono il tagger POS che non viene caricato dal disco alla RAM. Se vuoi ovviare a questo, carica tu stesso il tagger al di fuori di una funzione di richiesta.

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

e quindi sostituire nltk.pos_tag con tagger.tag. Il compromesso è che l'avvio dell'app richiederà ora 18 secondi. POS tagger

+1

Usa NLTK 3.1 _POS_TAGGER non esiste più, ho bisogno di tornare alla 3.0.1 – spicyramen

4

di NLTK è molto lento:

Per quanto mi riguarda posso fare 13739 tweets in 243 secondi:

  1. sent_tokenize 1,06190705299
  2. word_tokenize 4,86865639687
  3. pos_tag 233,487122536
  4. chunker 3,05982065201

Vedi http://honnibal.wordpress.com/2013/09/11/a-good-part-of-speechpos-tagger-in-about-200-lines-of-python/ , ma per riassumere:

Tagger  | Accuracy | Time (130k words) 
-----------+----------+------------------ 
CyGreedyAP | 97.1% | 4s 
NLTK  | 94.0% | 3m56s 
Pattern | 93.5% | 26s 
PyGreedyAP | 96.8% | 12s 
19

Come affermato in precedenza, NLTK deserializza ogni volta che è si utilizza il metodo pos_tag standard. Per NLTK 3.1, supponendo che sei felice con tagger predefinito del NLTK (PerceptronTagger) quindi il seguente metodo funziona per me:

primo carico il tagger:

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

Poi, ogni volta che è necessario contrassegnare un po 'di testo:

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

Questo in pratica ignora il metodo principale. Ho accelerato centinaia di volte per me. Presumo che lo stesso metodo funzioni per qualsiasi tagger.

+3

'tagger.tag (tokens)' dovrebbe essere sufficiente invece di 'nltk.tag._pos_tag (token, tagset, tagger)' – alvas

Problemi correlati