高效地迭代大型语料库(python)

高效地迭代大型语料库(python),python,Python,我的函数基本上从给定的“单词”列表中创建所有可能的单词对,并存储在可能的pairs中 def getPairsWithMaximumPMI(self, words, N): print("\nSubtask 3: given a list of words, find the pairs with the greatest PMI") #return [(1.0, "foo", "bar")] possiblePairs = list(combinations(word

我的函数基本上从给定的“单词”列表中创建所有可能的单词对,并存储在可能的pairs中

def getPairsWithMaximumPMI(self, words, N):
    print("\nSubtask 3: given a list of words, find the pairs with the greatest PMI")
    #return [(1.0, "foo", "bar")]

    possiblePairs = list(combinations(words, 2))
    currMaxPMI = 0.0
    res = [[]]

    print("Total pairs", (len(possiblePairs)))

    for p in possiblePairs:
        counter += 1
        print(counter)
        if(self.getPMI(p[0], p[1]) > currMaxPMI):
            currMaxPMI = self.getPMI(p[0], p[1])
            res[0] = (currMaxPMI, p[0], p[1])

    print(res)
    return res
然后迭代这个可能图,做一些在我的问题中不重要的计算

问题是,当可能的概率很大时,计算大约需要30分钟,这不是我想要的

我必须做什么才能使算法更有效

我对这种东西不熟悉,所以我需要帮助

编辑:


一个直接的改进是直接从pairs生成器进行迭代(假设
combines
是您的私有生成器,绕过
itertools
优化版本)


这将允许运行时系统尽可能优化生成和获取,并节省在内存中保存庞大列表的开销。

一个直接的改进是直接从pairs生成器进行迭代(假设
组合
是您的专用生成器,绕过
itertools
优化版本)


这将允许运行时系统尽可能优化生成和获取,并节省在内存中保存庞大列表的开销。

您可以执行导入itertools;itertools.product(列表1、列表2等)@HyperNeutrino您能详细说明一下吗?
itertools
模块有一些简洁的内置功能,可以更快地完成这项工作。请看文档;对不起,我现在没有时间写完整的解释,所以请保留评论。(实际上,看起来您可能已经在使用
itertools
了……nvm)编辑只需查看Prune的答案:PHow确实可以
getPMI()
工作-如何计算PMI?@juanpa.arrivillaga对,我的错-没有注意到。谢谢。您可以
导入itertools;itertools.product(列表1、列表2等)
@HyperNeutrino您能详细说明一下吗?
itertools
模块有一些简洁的内置功能,可以更快地完成这项工作。请看文档;对不起,我现在没有时间写完整的解释,所以请保留评论。(实际上,看起来您可能已经在使用
itertools
了……nvm)编辑只需查看Prune的答案:PHow does
getPMI()
work-你如何计算PMI?@juanpa.arrivillaga对,我的错-没有注意到。谢谢。你的意思是,就像我的编辑一样?但我实际上不明白这与先存储然后遍历它有什么不同。速度会有很大的差异吗?如果
组合的结果(单词,2)
非常大,创建一个包含所有结果的列表并存储它将需要额外的开销,这是您可以避免的。也就是说,如果不测量它,我不同意它一定会产生巨大的影响。@Dawn17从根本上说,如果您的算法要求您检查所有可能的结果对,那么像上面这样迭代是最快的方法e、 但是你仍然会被二次时间复杂度所困扰,并且无法逃脱这一点,因为
len(words)
变得越来越大。因此,除非你能想出一些方法不必检查每一对,否则你的情况是无法避免的。因此,你的意思是就像我的编辑一样?但我实际上不明白这与先存储然后遍历它有什么不同。速度会有很大的差异吗?如果
组合的结果(单词,2)
非常大,创建一个包含所有结果的列表并存储它将需要额外的开销,这是您可以避免的。也就是说,如果不测量它,我不同意它一定会产生巨大的影响。@Dawn17从根本上说,如果您的算法要求您检查所有可能的结果对,那么像上面这样迭代是最快的方法e、 但是你仍然会被二次时间复杂度所困扰,而且当
len(words)
变大时,你无法逃避这个问题。因此,除非你能想出一些方法不必检查每一对,否则你的处境是无法逃避的。
e.g. ['I', 'am', 'you'] --> [('I','am'), ('I', 'you'), ('am','you')]
    currMaxPMI = 0.0
    res = [[]]
    counter = 0
    #print("Total pairs", (len(possiblePairs)))

    for p in (combinations(words, 2)):

        counter += 1
        print(counter)
        if(self.getPMI(p[0], p[1]) > currMaxPMI):
            currMaxPMI = self.getPMI(p[0], p[1])
            res[0] = (currMaxPMI, p[0], p[1])

    print(res)
    return res
for p in combinations(words, 2):