2017-07-19 5 views
4

ポルトガル語の文字列をステミングする必要があります。これを行うには、nltk.word_tokenize()関数を使用して文字列をトークンし、各単語を個別にステミングします。その後、私は文字列を再構築します。それは機能していますが、うまく機能しません。どうすれば速くすることができますか?文字列の長さは約200万語です。Pythonで文字列全体をステミングする

tokenAux="" 
    tokens = nltk.word_tokenize(portugueseString) 
     for token in tokens: 
      tokenAux = token 
      tokenAux = stemmer.stem(token)  
      textAux = textAux + " "+ tokenAux 
    print(textAux) 

英語とおかげで申し訳ありません!

答えて

3

stringをそう不変です、毎回文字列を更新するのは良い方法ではありません文字列が長い場合は時間がかかります。 link hereは、文字列を連結するさまざまな方法を説明し、パフォーマンス分析を示します。そして、反復は一度しか行われないので、をlist comprehension以上に選択するとよい。詳細はdiscussion hereをご覧ください。この場合には代わりに、joingenerator expressionを使用すると役に立つことができます:比較することtimeitを使用しlen(my_text) -> 444399

%%timeit 
tokenAux="" 
textAux="" 
tokens = nltk.word_tokenize(my_text) 
for token in tokens: 
    tokenAux = token 
    tokenAux = stemmer.stem(token)  
    textAux = textAux + " "+ tokenAux 

結果:

1 loop, best of 3: 6.23 s per loop 

を使用し、長い文字列のmy_textを使用して

generator expressionjoin

%%timeit 
' '.join(stemmer.stem(token) for token in nltk.word_tokenize(my_text)) 

結果:

1 loop, best of 3: 2.93 s per loop 
+1

これは完全に機能しました!みんな、ありがとう。 – yuridamata

+0

@yuridamata素晴らしい! 'ハッピーコーディング.' – 0p3n5ourcE

0

文字列をテキストファイルとして読み取って、PySparkを使用して各単語を区切るために必要な操作を実行できます。これにより、操作を並行して実行することができます。

multiprocessing moduleを使用することもできます。

+0

んPySparkが本当に持っている内蔵のポルトガル語ステマー? – lenz

+0

わかりません。 PySparkをNLTKと組み合わせて使用​​できない理由はありません。 @lenz – rayrase

1

文字列オブジェクトはPythonでは不変です。あなたのコードの中に見て:

textAux = "" 
for token in tokens: 
    # something important ... 
    textAux = textAux + " "+ tokenAux 

あなたがループ内で新しい文字列を作成し、textAux変数に代入するたびに。これは効率的ではありません。

私はtokenAuxの要素をリストに格納し、最後にそれらを結合します。例を参照してください:

tokenAux = [] # we declare list for storing tokens 
tokens = nltk.word_tokenize(portugueseString) 
for token in tokens: 
    tokenAux = token 
    tokenAux = stemmer.stem(token)  
    textAux.append(tokenAux) # we add new token into the resulting list 

result = " ".join(textAux) # join list using space as separator 
print(result) 

は、性能を比較して、私たちとそれを共有:)

便利なリンク:

関連する問題