python在数据框中的快速文本处理
问题描述:
我正在研究python中的电子商务数据。我已经将这些数据加载到python中并将其转换为熊猫数据框架。现在,我想对数据执行文本处理,例如删除不需要的字符,停用词,词干等。目前我应用的代码工作正常,但需要很长时间。我有大约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)))
您可以采取的任何数据,按您的方便。由于某些政策,我无法分享数据。
答
你可以尝试去完成它在一个循环,而不是创建词干/ 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去除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
一个快速的变化,可以帮助:它看起来像停用词通常是一个列表,并有2400个条目。使它成为一个集合可以大大加快'停用词'中的'如果不是w'。首先尝试对较小的提取物进行更改。此外,应用似乎有时比正常的列表理解有时慢 - 可能值得提取列,做你的代码(这实际上是一个很好的处理)作为列表理解,然后重新插入... –
我以前经历过对熊猫的“应用”要比在列表或字典等其他结构中应用函数慢得多。 是否有一个特定的原因,你希望他们在'pandas.DataFrame'中?你有没有考虑过使用另一个? –
我正在通过数据库加载它。这就是为什么我将它转换为DataFrame来处理它。是否有其他数据存储选项,我可以轻松应用和工作? – Sam