2017-10-13 3 views
1

私はPythonで電子商取引データを扱っています。私はそのデータをPythonでロードし、それをpandasデータフレームに変換しました。今では、不要な文字、ストップワード、ステミングなどを削除するなど、そのデータのテキスト処理を行いたいのですが、現在適用しているコードはうまくいきますが、時間がかかります。私は約200万行のデータを処理する必要があり、それを処理するには永遠にかかる。私は10,000行でそのコードを試したところ、約240秒かかりました。私はこの種のプロジェクトに初めて取り組んでいます。時間を節約する助けがあれば非常に役に立ちます。データフレーム上のPythonでの高速テキスト処理

ありがとうございます。

from nltk.stem import PorterStemmer 
from nltk.corpus import stopwords 
import re 

def textprocessing(text): 
    stemmer = PorterStemmer() 
    # Remove unwanted characters 
    re_sp= re.sub(r'\s*(?:([^a-zA-Z0-9._\s "])|\b(?:[a-z])\b)'," ",text.lower()) 
    # Remove single characters 
    no_char = ' '.join([w for w in re_sp.split() if len(w)>1]).strip() 
    # Removing Stopwords 
    filtered_sp = [w for w in no_char.split(" ") if not w in stopwords.words('english')] 
    # Perform Stemming 
    stemmed_sp = [stemmer.stem(item) for item in filtered_sp] 
    # Converting it to string 
    stemmed_sp = ' '.join([x for x in stemmed_sp]) 
    return stemmed_sp 

私はそのデータフレームに、このメソッドを呼び出しています:

files['description'] = files.loc[:,'description'].apply(lambda x: textprocessing(str(x))) 

あなたはあなたの便利ごとに任意のデータを取ることができます。ポリシーによっては、データを共有できません。

+0

を助けることができる1つの迅速な変化をunwant単語を削除するにはNLTKを使用することができます。ストップワードは通常はリストで、2400個のエントリがあるようです。それをセットにすることは ''ストップワードでは ''もしそうでないならば、かなり速くなるはずです。より小さな抽出物であなたの変更を最初に試みてください。また、適用は時々通常のリストの理解よりも遅くなるようです - あなたのコード(実際には処理の良いビットです)をリストの理解として入力してから、列を抜き出す価値があるかもしれません。 –

+0

私は以前経験しましたパンダに 'apply'するのは、リストや辞書のような他の構造体に関数を適用するよりもかなり遅いということです。 'pandas.DataFrame'にそれらを入れたい特別な理由はありますか?別のものを使うことを考えましたか? –

+0

私はデータベース経由で読み込んでいます。そのため、私はそれをDataFrameに変換して作業しています。私が適用して簡単に作業できる他のデータ保存オプションはありますか? – Sam

答えて

2

使用すると、1つのループでそれを終了しようとすると、すべてのループ

STEMMER = PorterStemmer() 
    STOP_WORD = stopwords.words('english') 
    def textprocessing(text): 

    return ''.join(STEMMER.stem(item) for token in re.sub(r'\s*(?:([^a-zA-Z0-9._\s "])|\b(?:[a-z])\b)'," ",text.lower()).split() if token not in STOP_WORD and len(token) > 1) 

ステマー/ STOP_WORDを作成することができなかったあなたも

from nltk.tokenize import RegexpTokenizer 
STEMMER = PorterStemmer() 
STOP_WORD = stopwords.words('english') 
TOKENIZER = RegexpTokenizer(r'\w+') 
def textprocessing(text): 
    return ''.join(STEMMER.stem(item) for token in TOKENIZER.tokenize(test.lower()) if token not in STOP_WORD and len(token) > 1) 
+0

ありがとう.. !!!これは、コードの修正がほとんどなく、確かに速度が数倍向上しました。 – Sam

関連する問題