3

8000個の文字列(stop_words)のリストと、数百万の個々の単語に及ぶさまざまな長さの100,000個の文字列のリストがあります。この関数を使用して、100,000文字列をトークン化し、英数字以外のトークンとトークンをリストstop_wordsから除外しています。

    def tokenizer(text):

       return [stemmer.stem(tok.lower()) for tok in nltk.word_tokenize(text)/ 
       if tok.isalpha() and tok.lower() not in stop_words]

600個の文字列を使用してこのコードをテストしましたが、60秒かかります。ストップワードを除外する条件を削除すると、同じ600文字列で1秒かかります

    def tokenizer(text):

       return [stemmer.stem(tok.lower()) for tok in nltk.word_tokenize(text)/ 
       if tok.isalpha()]

あるリストで見つかったアイテムを別のリストから除外するより効率的な方法があることを願っています。

私はどんな助けや提案にも感謝しています

ありがとう

4

3 に答える 3

5

代わりstop_wordsにルックアップがO(1)になるように設定します。

stop_words = set(('word1', 'word2', 'word3'))
于 2013-01-12T13:10:19.030 に答える
3
  • セットのメンバーシップのチェックはO(1)であり、リストのメンバーシップのチェックはO(N)であるstop_wordsため、セットを作成します。
  • トークンごとに2回ではなく、(1回)lower()呼び出します。textlower()

stop_words = set(stop_words)
def tokenizer(text):
   return [stemmer.stem(tok) for tok in nltk.word_tokenize(text.lower())
           if tok.isalpha() and tok not in stop_words]

ローカル変数へのアクセスは修飾名を検索するよりも高速であるため、ローカル変数を作成することで少し速度を上げることもできnltk.word_tokenizeますstemmer.stem

stop_words = set(stop_words)
def tokenizer(text, stem = stemmer.stem, tokenize = nltk.word_tokenize):
   return [stem(tok) for tok in tokenize(text.lower())
           if tok.isalpha() and tok not in stop_words]

stemおよびのデフォルト値は、関数の定義時に1回tokenize設定されます。の内部、およびはローカル変数です。通常、この種のマイクロ最適化は重要ではありませんが、10万 回呼び出しているので、少し役立つ場合があります。tokenizertokenizerstemtokenizetokenizer

于 2013-01-12T13:12:50.540 に答える
0

セットを使用する:

{x for x in one_list} - other_list

ただし、重複と順序付けは削除されるため、重要な場合は別のものが必要です。

于 2013-01-12T13:12:19.557 に答える