2017-10-13 12 views
1

저는 전자 상거래 데이터를 파이썬으로 작업하고 있습니다. 나는 그 데이터를 파이썬에 로딩하고 그것을 판다 데이터 프레임으로 변환했다. 이제 원하지 않는 문자, 불용어, 형태소 분석 등을 제거하는 것과 같은 데이터 처리를 수행하려고합니다. 현재 적용한 코드는 잘 작동하지만 시간이 많이 걸립니다. 나는 처리 할 데이터의 행이 약 2 백만 개이며 처리하는 데 영원히 걸립니다. 10,000 줄에 그 코드를 시도했는데 약 240 초가 걸렸습니다. 나는 이런 종류의 프로젝트를 처음으로 연구하고있다. 시간을 줄이는데 도움이 될 것입니다.데이터 프레임의 파이썬에서의 빠른 텍스트 처리

미리 감사드립니다.

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 

는 그 dataframe에이 메서드를 호출하고 있습니다 :

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

당신은 사용자의 편의에 따라 모든 데이터를 취할 수 있습니다. 일부 정책으로 인해 데이터를 공유 할 수 없습니다.

+0

하나의 빠른 변화를 제거하기 위해 NLTK 사용할 수있는 모든 루프

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 : 불용어는 일반적으로 목록이며 2400 개의 항목이있는 것 같습니다. 세트를 만드는 것은''스톱 어블에서''하지 않을 것' '을 상당히 빨라야한다. 먼저 작은 추출물에 변화를 시험해보십시오. 또한 적용은 때로 정상적인 목록 이해보다 느린 것 같습니다. - 열을 추출하고 목록 작성으로 코드를 처리 한 다음 (실제로 처리의 좋은 비트) 코드를 다시 삽입 한 다음 다시 삽입하는 것이 좋습니다. –

+0

판다에'적용 '하는 것은리스트 나 사전과 같은 다른 구조에 함수를 적용하는 것보다 상당히 느립니다. 'pandas.DataFrame'에서 원하는 특별한 이유가 있습니까? 다른 것을 사용해 보셨습니까? –

+0

데이터베이스를 통해로드 중입니다. 그래서 DataFrame으로 변환하여 작업하고 있습니다. 제가 적용하고 쉽게 사용할 수있는 다른 데이터 저장 옵션이 있습니까? – Sam

답변

2

당신이 형태소 분석기를 생성 한 루프를 완료하지 시도 할 수는/당신은 또한 unwant 단어 도움이 될 수 있습니다

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