0

NLTKとFlaskを使用してWebアプリケーションを構築しています。これは単純なRESTfulアプリケーションであり、herokuにデプロイするとすべてうまくいきました。しかし、サーバーがより多くのリクエストを受け取り始めたとき、私はherokuからのメモリ制限である1.5GBに達しました。nltk.RegexpParserだから、リクエストが来るたびに読み込んでいるからだと思います。

これは本当にシンプルなコードです。



@app.route('/get_keywords', methods=['POST'])
def get_keywords():
    data_json = json.loads(request.data)
    text = urllib.unquote(data_json["sentence"])
    keywords = KeywordExtraction().extract(text)

    return ','.join(keywords)

そして、これはキーワード抽出ビットです。


import re
import nltk

nltk.data.path.append('./nltk_data/')

from nltk.corpus import stopwords

class KeywordExtraction:
    def extract(self, text):

        sentences = nltk.sent_tokenize(text)
        sentences = [nltk.word_tokenize(sent) for sent in sentences]
        sentences = [nltk.pos_tag(sent) for sent in sentences]

        grammar = "NP: {}"
        cp = nltk.RegexpParser(grammar)
        tree = cp.parse(sentences[0])

        keywords = [subtree.leaves()[0][0] for subtree in tree.subtrees(filter=lambda t: t.node == 'NP')]
        keywords_without_stopwords = [w for w in keywords if not w in stopwords.words('english')]

        return list(set(keywords_without_stopwords + tags))

それが私のコードに問題があるのか​​、FlaskまたはNLTKに問題があるのか​​わかりません。私はPythonの初心者です。どんな提案でも本当にありがたいです。

私はこれをblitz.ioでテストし、わずか250のリクエストの後、サーバーが爆発してR15をスローし始めました。

4

1 に答える 1

1

物事をキャッシュすることから始めます:

# Move these outside of the class declaration or make them class variables

stopwords = set(stopwords.words('english'))
grammar = "NP: {}"
cp = nltk.RegexpParser(grammar)

これも少しスピードアップできます:

from itertools import ifilterfalse

...

keywords_without_stopwords = ifilterfalse(stopwords.__contains__, keywords)

return list(keywords_without_stopwords + set(tags))  # Can you cache `set(tags`)?

関数とビューを可能な限りメモ化してキャッシュするために、Flask-Cacheも調べます。

于 2013-03-02T01:22:09.620 に答える