计算语料库中的单词频率需要太长时间

时间:2017-08-23 09:31:31

标签: python sorting

我的任务是:

打印出语料库中出现的所有单词及其频率的列表。此列表应按字降序排列(最常见的字首先)。"

def printWordFrequencies(index, vocab):
    #print("Your task 3: print out a list of all the words that occur in the corpus and their frequencies. This list should be sorted by word frequencies in descending order (most frequent word first).")
    newList = []
    for i in index:
        newList.append([i, len(index[i])])
        sorted(newList)
    return newList

index是一个字典(关联数组),用于将单词映射到其位置列表,vocab是按字母顺序排列的语料库中使用的词汇表。

我写的函数有两个问题。首先,它没有正确排序。它给出正确的单词频率,如[.., ['plot', 128], ['two', 166] , ..],但不会根据频率进行排序。

其次,运行时间太长。我假设这是因为它试图追加并排序这么长的列表,但我不知道如何解决这个问题。

一件小事是,我不确定为什么我需要vocab作为输入参数。

2 个答案:

答案 0 :(得分:1)

首先,您最后只需要对newList进行一次排序。目前,您正在为循环的每次迭代对其进行排序,这就是它运行速度如此之慢的原因。使用sorted()也不会更改原始列表,但会返回一个新的排序列表,因此在您的代码中,排序不起作用,因为您没有存储返回的列表。

其次,要根据每个条目中的第二项进行排序,您可以sorted()使用key。在这种情况下,它首先根据第二个长度项x[1]进行排序,如果两个条目的长度相同,则根据第一个条目x[0]进行排序。

def printWordFrequencies(index, vocab):
    newList = []

    for i in index:
        newList.append([i, len(index[i])])

    return sorted(newList, key=lambda x: [x[1], x[0]], reverse=True)

使用列表理解可以进一步简化:

def printWordFrequencies(index, vocab):    
    return sorted([i, len(index[i])]] for i in index, key=lambda x: [x[1], x[0]], reverse=True)

答案 1 :(得分:0)

您不需要为在newList中添加的每个单词对新列表进行排序,因此从for循环中排除已排序的方法。

如果我理解你需要检查索引中的单词是否也在词汇中。

您可以尝试这样的事情:

def printWordFrequencies(index, vocab):

    newList = []
    for i in index:
        if i in vocab:
            newList.append([i, len(index[i])])
    sorted(newList, key=lambda k: [k[1], k[0]])
    return newList

按第一个键的顺序排列第二个值,如果首先是相同的长度。

希望它有所帮助。