如何减少筛选文章数据集的时间?

时间:2019-06-22 07:03:42

标签: python multithreading optimization nlp nltk

我正在尝试过滤包含近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))

现在,我想减少此过程的时间。有什么方法可以对此进行优化?

2 个答案:

答案 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)

我一直在测试10万篇文章的列表,每篇文章大约有2k个字符,花费了我不到9秒的时间。

答案 1 :(得分:0)

我不确定您是否真的可以大大加快代码的速度。 str.translate()已经非常快了!可能变化不大,但是也许可以从将函数主体的前两行移到上方开始,这样就不必在每次调用函数时都创建translate_map

您还可以考虑使用multiprocessing python软件包在多个内核上运行脚本。