我正在尝试过滤包含近5万篇文章的数据集。我想从每篇文章中过滤掉停用词和标点符号。但是该过程需要很长时间。我已经过滤了数据集,花了6个小时。现在,我要过滤另一个包含30万篇文章的数据集。
我在anaconda环境中使用python。 PC配置:第七代Core i5、8GB RAM和NVIDIA 940MX GPU。为了过滤我的数据集,我编写了一个代码,该代码将数据集中的每篇文章都使用了,对单词进行标记,然后删除停用词,标点和数字。
def sentence_to_wordlist(sentence, filters="!\"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n?,।!.'0123456789০১২৩৪৫৬৭৮৯‘\u200c–“”…‘"):
translate_dict = dict((c, ' ') for c in filters)
translate_map = str.maketrans(translate_dict)
wordlist = sentence.translate(translate_map).split()
global c,x;
return list(filter(lambda x: x not in stops, wordlist))
现在,我想减少此过程的时间。有什么方法可以对此进行优化?
答案 0 :(得分:2)
我一直在尝试优化您的流程:
from nltk.corpus import stopwords
cachedStopWords = set(stopwords.words("english"))
filters = "!\"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n?,।!.'0123456789০১২৩৪৫৬৭৮৯‘\u200c–“”…‘"
trnaslate_table = str.maketrans('', '', filters)
def sentence_to_wordlist(sentence, filters=filters):
wordlist = sentence.translate(trnaslate_table).split()
return [w for w in wordlist if w not in cachedStopWords]
from multiprocessing.pool import Pool
p = Pool(10)
results = p.map(sentence_to_wordlist, data)
数据是您文章的列表
我一直在使用nltk中的停用词,但您可以使用自己的停用词,请确保您的停用词是一个集合而不是列表(because to find if a element is in a set is O(1) time complexity and in a list is O(n))
我一直在测试10万篇文章的列表,每篇文章大约有2k个字符,花费了我不到9秒的时间。
答案 1 :(得分:0)
我不确定您是否真的可以大大加快代码的速度。 str.translate()
已经非常快了!可能变化不大,但是也许可以从将函数主体的前两行移到上方开始,这样就不必在每次调用函数时都创建translate_map
。
您还可以考虑使用multiprocessing
python软件包在多个内核上运行脚本。