2017-10-13 8 views
1

Je travaille sur des données de commerce électronique en python. J'ai chargé ces données dans python et l'ai converti en cadre de données de pandas. Maintenant, je veux effectuer un traitement de texte sur ces données, comme la suppression des caractères indésirables, les mots vides, la suppression, etc. Actuellement, le code que j'ai appliqué fonctionne bien, mais cela prend beaucoup de temps. J'ai environ 2 millions de lignes de données à traiter et cela prend une éternité pour le traiter. J'ai essayé ce code sur 10 000 lignes et cela a pris environ 240 secondes. Je travaille sur ce genre de projet pour la première fois. Toute aide pour réduire le temps serait très utile.Traitement de texte rapide en python sur une base de données

Merci d'avance.

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 

J'appelle cette méthode sur cette trame de données:

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

Vous pouvez prendre les données selon votre convenance. En raison d'une politique, je ne suis pas en mesure de partager les données.

+0

un changement rapide qui peut aider: il semble que les mots d'arrêt sont normalement une liste, et a 2400 entrées dedans. en faire un ensemble devrait accélérer le «sinon w dans les mots d'arrêt» considérablement. essayez d'abord votre changement sur un extrait plus petit. aussi, appliquez semble être plus lent que la compréhension de liste normale parfois - peut être utile d'extraire la colonne, en faisant votre code (qui est en fait un bon peu de traitement) comme une compréhension de liste, puis en réinsérant ... –

+0

que «appliquer» sur les pandas est considérablement plus lent que d'appliquer des fonctions dans d'autres structures comme les listes ou les dictionnaires. Y a-t-il une raison particulière pour laquelle vous les voulez dans un 'pandas.DataFrame'? Avez-vous envisagé d'en utiliser un autre? –

+0

Je le charge dans la base de données. C'est pourquoi je le convertis en DataFrame pour y travailler. Y at-il une autre option de stockage de données que je peux appliquer et travailler facilement? – Sam

Répondre

2

vous pouvez essayer de le finir dans une boucle et ne pas créer égrappoir/stop_word chaque boucle

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) 

vous pouvez également utiliser NLTK pour enlever mot non désirés

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

Merci .. !!! Il a certainement amélioré la vitesse de quelques fois avec quelques corrections dans le code. – Sam