14

私はNLTKを使用して、Webリクエスト内の大量のツイートにPOSタグを付けています。ご存知のように、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)
4

3 に答える 3

22

最初の 18 秒間は、POS タガーがディスクから RAM に unpickle されている時間です。これを回避したい場合は、リクエスト関数の外でタガーを自分でロードしてください。

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

そして、に置き換えnltk.pos_tagますtagger.tag。トレードオフは、アプリの起動に +18 秒かかることです。

于 2012-07-24T00:55:06.413 に答える
19

前述のように、NLTK は、標準の pos_tag メソッドを使用するたびに unpickle します。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)

これは基本的に main メソッドをバイパスします。私にとっては何百倍も高速化されました。どのタガーでも同じ方法が機能すると思います。

于 2015-11-13T11:47:20.003 に答える
5

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
于 2014-07-11T20:30:51.970 に答える