数据框上的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中的快速文本处理的主要内容,如果未能解决你的问题,请参考以下文章

如何根据每条记录的连续表单中 ms-access 中的其他值填充文本框上的值

忽略重音的文本框上的自动完成

将焦点设置在 xaml wpf 中的文本框上

禁用特定文本框上的输入键

如何清除此访问报告中文本框上的空白?

文本框上的 Chrome 自动填充和自动完成问题