【问题标题】:NLTK - Modifying nested for loop for multiprocessingNLTK - 修改嵌套 for 循环以进行多处理
【发布时间】:2019-11-19 00:25:18
【问题描述】:

目前,我有一个用于修改列表的嵌套 for 循环。我正在尝试在使用多处理时创建相同的输出。

我当前的代码是,

for test in test_data:
    output.append([((ngram[-1], ngram[:-1],model.score(ngram[-1], ngram[:-1])) for ngram in 
    test])

其中 test_data 是生成器对象,model.score 来自 NLTK 包。

我找到并尝试过的所有解决方案都不起作用(至少在我的情况下)。

有没有办法通过多处理获得相同的输出?

【问题讨论】:

    标签: python loops nlp nltk python-multiprocessing


    【解决方案1】:

    当涉及到多处理时,我相信最简单的方法是使用joblib 包......要使用这个包,您需要做的就是创建一个函数,该函数获取生成器的一项并返回一项的结果。

    在你的情况下,它看起来像这样:

    from joblib import Parallel, delayed
    
    def func(test):
        return [((ngram[-1], ngram[:-1], model.score(ngram[-1], ngram[:-1])) for ngram in test]
    
    
    output = Parallel(n_jobs=4, backend="threading")(
                delayed(func)(test) \
                    for test in test_data)
    

    现在,output 是您要搜索的输出。您可以根据需要更改作业数量。但是,我建议将其设置为 multiprocessing.cpu_count(),在我的情况下为 4

    您也可以查看official documentation 了解更多示例。

    【讨论】:

    • 谢谢安华维克。我已经意识到,我之前创建的多处理函数是正确的(和你的!),问题是包 NLTK 仍然产生缓慢的结果。就上下文而言,我在大约 3 亿个 n-gram 上运行该函数。
    猜你喜欢
    • 2016-11-01
    • 1970-01-01
    • 2011-05-19
    • 2016-01-11
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多