词性标注速度慢。我能做些预热吗?

2024-05-17 12:31:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用NLTK在web请求中对大量tweets进行POS标记。如您所知,Django为每个请求实例化一个请求处理程序。

我注意到:对于一个请求(~200条tweets),第一条tweet需要~18秒来标记,而随后的所有tweets需要~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)

Tags: 模块数据django实例标记posweb处理程序
3条回答

nltk的POS标记非常慢:

对我来说,我可以在243秒内发13739条微博:

  1. 已发送令牌1.06190705299
  2. 字标记4.86865639687
  3. 位置标签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

前18秒是POS标记器被从磁盘取出放入RAM。如果您想绕过这个问题,可以在请求函数之外自己加载标记器。

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

然后用tagger.tag替换nltk.pos_tag。 权衡的结果是,应用程序启动现在需要+18秒。

如前所述,每次使用标准pos_标记方法时,NLTK都会取消勾选。对于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)

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

相关问题 更多 >