Быстрая обработка текста в python на датафрейме

Я работаю над данными электронной коммерции в Python. Я загрузил эти данные в python и преобразовал их во фрейм данных pandas. Теперь я хочу выполнить обработку текста на этих данных, например, удалить ненужные символы, стоп-слова, ввод текста и т. Д. В настоящее время код, который я применил, работает нормально, но это занимает много времени. У меня есть около 2 миллионов строк данных для обработки, и на их обработку уходит вечность. Я попробовал этот код на 10000 строк, и это заняло около 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

Я вызываю этот метод на этом фрейме данных:

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

Вы можете взять любые данные согласно вашему удобству. Из-за какой-то политики я не могу делиться данными.

1 ответ

Решение

Вы можете попытаться завершить его в один цикл, а не создавать stemmer/stop_word каждый цикл

  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)

Вы также можете использовать NLTK, чтобы удалить нежелательные слова

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)
Другие вопросы по тегам