数据框上的python中的快速文本处理
Posted
技术标签:
【中文标题】数据框上的python中的快速文本处理【英文标题】:Fast text processing in python on dataframe 【发布时间】:2018-03-25 17:16:14 【问题描述】:我正在使用 python 处理电子商务数据。我已经在 python 中加载了该数据并将其转换为 pandas 数据框。现在我想对该数据执行文本处理,例如删除不需要的字符、停用词、词干等。目前我应用的代码运行良好,但需要很多时间。我有大约 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)))
您可以根据自己的方便获取任何数据。由于某些政策,我无法共享数据。
【问题讨论】:
一个可能有帮助的快速更改:看起来停用词通常是一个列表,其中包含 2400 个条目。将其设置为一组应该会大大加快if not w in stopwords
的速度。首先尝试更改较小的提取物。此外,apply 有时似乎比正常的列表理解要慢 - 可能值得提取列,将您的代码(实际上是一个很好的处理)作为列表理解,然后重新插入......
我之前体验过 apply
在 pandas 上的速度比在列表或字典等其他结构中应用函数要慢得多。您是否有特定原因希望它们出现在 pandas.DataFrame
中?您是否考虑过使用另一个?
我正在通过数据库加载它。这就是为什么我将它转换为 DataFrame 来处理它的原因。有没有其他我可以轻松应用和工作的数据存储选项?
【参考方案1】:
您可以尝试在一个循环中完成它,而不是在每个循环中创建词干分析器/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中的快速文本处理的主要内容,如果未能解决你的问题,请参考以下文章