我正在使用python处理电子商务数据。我已经将该数据加载到python中,并将其转换为熊猫数据框。现在,我想对该数据执行文本处理,例如删除不需要的字符,停用词,词干等。目前,我已应用的代码可以正常工作,但需要花费很多时间。我有大约200万行数据要处理,并且要花很长时间才能处理。我在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


我在该数据帧上调用此方法:

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


您可以根据需要获取任何数据。由于某些政策,我无法共享数据。

最佳答案

您可以尝试在一个循环中完成它,而不是在每个循环中创建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)

关于python - 在数据框上的python中进行快速文本处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46732111/

10-10 21:26
查看更多