嵌套用于具有大数据集的循环

时间:2015-04-27 23:00:45

标签: python for-loop nested large-data

我有一个子列表列表,每个子列表由一个或多个字符串组成。我将一个子列表中的每个字符串与其他子列表中的每个其他字符串进行比较。这包括写两个for循环。但是,我的数据集是大约5000个子列表,这意味着我的程序将永远运行,除非我以500个子列表的增量运行代码。如何更改此程序的流程,以便我仍然可以查看与每个i相对应的所有j值,并且能够运行〜5000个子列表的程序。 (是Wordnet库) 这是我的代码的一部分:

for i in range(len(somelist)):
    if i == len(somelist)-1: #if the last sublist, do not compare
        break
    title_former  = somelist[i]

    for word in title_former:
        singular = wn.morphy(word) #convert to singular
        if singular == None:
            pass 
        elif singular != None:
            newWordSyn  = getNewWordSyn(word,singular)
            if not newWordSyn:
                uncounted_words.append(word)
            else:
                for j in range(i+1,len(somelist)):
                    title_latter = somelist[j]
                    for word1 in title_latter:
                        singular1 = wn.morphy(word1) 
                        if singular1 == None:
                            uncounted_words.append(word1)
                        elif singular1 != None:
                            newWordSyn1      = getNewWordSyn(word1,singular1)
                            tempSimilarity  = newWordSyn.wup_similarity(newWordSyn1)

示例:

Input = [['space', 'invaders'], ['draw']]
Output= {('space','draw'):0.5,('invaders','draw'):0.2}

输出是具有相应字符串对元组的字典及其相似度值。上面的代码段不完整。

3 个答案:

答案 0 :(得分:1)

你可以尝试这样的东西我怀疑它会更快(你可能需要改变距离函数)

def dist(s1,s2):
    return sum([i!=j for i,j in zip(s1,s2)]) + abs(len(s1)-len(s2))

dict([((k,v),dist(k,v)) for k,v in itertools.product(Input1,Input2)])

答案 1 :(得分:1)

如何进行一些预处理而不是一遍又一遍地进行一系列操作?我没有测试过这个,但是你明白了。你需要把任何东西拿出来。

# Preprocessing:
unencountered_words = []
preprocessed_somelist = []
for sublist in somelist:
    new_sublist = []
    preprocessed_somelist.append(new_sublist)
    for word in sublist:
        temp = wn.morphy(word)
        if temp:
            new_sublist.append(temp)
        else:
            unencountered_words.append(word)

# Nested loops:
for i in range(len(preprocessed_somelist) - 1): #equivalent to your logic
    for word in preprocessed_somelist[i]:
            for j in range(i+1, len(preprocessed_somelist)):
                   for word1 in preprocessed_somelist[j]:
                            tempSimilarity  = newWordSyn.wup_similarity(newWordSyn1)

答案 2 :(得分:0)

这总是会出现缩放问题,因为您正在进行n ^ 2字符串比较。朱利叶斯'优化肯定是一个很好的起点。

您可以做的下一件事就是存储相似度结果,这样您就不必重复比较相同的单词。

您可以进行的另一个优化是对单词进行存储比较,并在遇到相同的单词时重复使用它们。

key = (newWordSyn, newWordSyn1)
if key in prevCompared:
    tempSimilarity  = prevCompared[(word, word1)]
else:
    tempSimilarity  = newWordSyn.wup_similarity(newWordSyn1)
    prevCompared[key] = tempSimilarity
    prevCompared[(newWordSyn1, newWordSyn)] = tempSimilarity

这只会在你看到很多相同的单词组合时有所帮助,但我认为wup_similarity非常昂贵。