2017-08-23 50 views
-1

我的任務是:計算語料庫中的詞頻率時間過長

打印出語料庫中出現的所有單詞及其頻率的列表。該列表應通過詞頻降序排列(最頻繁的字在前)進行排序。」

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作爲輸入參數。

+1

你爲什麼要在循環內進行排序?在添加完所有項目後,只需進行一次排序。 Python會根據第一個元素對列表進行排序,所以如果要按長度排序,可以將一個鍵函數傳遞給'sorted()'。 https://docs.python.org/3/library/functions.html#sorted –

回答

1

首先,您只需要在末尾對newList進行一次排序。目前,您正在爲循環的每次迭代對它進行排序,這就是爲什麼它運行得如此之慢。使用sorted()也不會更改您的原始列表,但會返回一個新的排序列表,因此在您的代碼中,排序不起作用,因爲您不存儲返回的列表。其次,要根據每個條目中的第二項進行排序,可以給sorted()使用key。在這種情況下,首先根據第二個長度項目x[1]進行排序,如果兩個條目具有相同的長度,則根據第一個條目x[0]進行排序。

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

這似乎是我正在尋找的答案。還有一件事是,它按升序排列,不下降。我試圖通過在最後使用反向命令來顛倒排序的列表,但它並沒有爲我返回任何東西。任何想法? – Dukakus17

+1

您可以將'reverse = True'作爲參數添加到['sorted()'](https://docs.python.org/2/library/functions.html?highlight=sorted#sorted)。 –

+0

太棒了!非常感謝。我很抱歉,但我最後一個問題是,你是否有必要在這個函數中使用'vocab'參數? – Dukakus17

0

你不需要排序爲每個您在newList添加單詞新的列表,所以排除排序方法:

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) 

這可以通過使用列表理解可以進一步簡化從for循環。

如果我明白你需要檢查索引中的單詞是否也是在vocab中。首先由第二值和

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 

主要訂單,如果長度是一樣的,首先:

你可以嘗試這樣的事情。

希望它有幫助。