2012-07-23 25 views
14

我正在使用NLTK來發送Web請求中的Tweets標籤。如您所知,Django爲每個請求實例化一個請求處理程序。POS標籤性能低下。我可以做某種預熱嗎?

我注意到了這一點:對於一個請求(約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

這似乎不是Django代碼:除了在一些深層內部,Django不使用'Handler'。可能是AppEngine的webapp嗎? – 2012-07-23 09:50:16

+1

在啓動時用假申請填滿它?聽起來就像它的工作原理一樣,除非你長時間的第一次請求超時。 – tripleee 2012-07-23 09:57:44

+0

@tripleee每個**請求的第一條推文發生18秒延遲 – aitchnyu 2012-07-23 10:01:16

回答

22

這些第一18秒是從磁盤拆封到RAM的POS標註器。如果你想解決這個問題,你可以在請求函數之外加載標記器。

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

然後用tagger.tag替換nltk.pos_tag。 折衷的是,應用程序啓動現在需要+18秒。

+1

使用NLTK 3.1 _POS_TAGGER不再存在,我需要恢復到3.0.1 – spicyramen 2016-02-24 00:04:52

4

NLTK的POS惡搞實在是太慢了:

對於我來說,我可以在243秒做13739個鳴叫:

  1. sent_tokenize 1.06190705299
  2. word_tokenize 4.86865639687
  3. pos_tag 233.487122536
  4. 分塊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 
19

如前所述,NLTK unpickles每次都是使用標準pos_tag方法。對於NLTK 3.1,假設你高興的NLTK的默認惡搞(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) 

這基本上繞過了主要方法。爲我加快了百倍的速度。我假設相同的方法適用於任何標記器。

+3

'tagger.tag(tokens)'應該足夠代替'nltk.tag._pos_tag(標記,標記集,標記器)' – alvas 2016-05-14 16:05:52

相關問題