2015-12-01 167 views
0

我在python中創建了一個非常基本的搜索引擎,我正在創建一個處理短語查詢的方法,所以如果2個單詞的位置在1之內,它們在文檔中彼此相鄰並在發生這種情況時輸出所有文件號。比較python字典值

我現在有一本字典,看起來像這樣

{'8':[['1170', '1264', '1307', '1559', '1638'], ['197', '1169']], 
'6':[['345', '772'], ['346']} 

這僅僅是一個佈局的例子。

w=word, p=position || 
{doc1:[w1p1, w1p2, w1p3],[w2p1, w2p2]} 

的關鍵是文件ID,其次是第一個字包含,則第二個字的位置,該文​​件中的位置。將會有與查詢中一樣多的單詞(職位分組)。

我的問題是,有沒有辦法讓我可以比較同一個文件ID的1和2nd + 3rd等值的值?我想比較一下,看一個單詞的位置是否只有另一個單詞的+1。

所以你可以看到doc 6字2跟隨字1,這將導致密鑰被髮回。

回答

1

有幾種方法可以實現您在此嘗試做的事情。我假設你根據你給我的例子總是隻有兩個單詞,而且這些單子總是有序的。

不管用什麼方法,你都需要遍歷文檔(字典)。在Python中迭代字典很簡單;你可以看到一個例子here。在此之後,步驟更改

第一種選擇 - 效率較低,稍微簡單:

  1. 遍歷列表1中的每個項目(地點)(第一個字的位置)。
  2. 迭代列表2中的每個項目(位置)(第二個單詞的位置)。
  3. 比較兩個位置,如果它們在彼此之內,則返回文檔ID。

    例子:

    for documentNumber in docdictionary: 
        for word1location in docdictionary[documentNumber][0]: 
         for word2location in docdictionary[documentNumber][1]: 
          if abs(word1location - word2location) == 1: 
           return documentNumber 
    

第二個方案 - 更高效,稍微複雜些:

  1. 開始,在字的位置中每一名單的開端,同時你在那裏的軌道是
  2. 檢查您所在位置的兩個值。
    • 如果兩個值相距1個字,返回文檔數
    • 如果這兩個值都沒有,檢查其列表項(頁面位置),具有較低的值並移動到下一個項目在該列表中,重複
  3. 如果其中一個列表(例如,列表1)用完數字,而另一個列表(列表2)的值大於第一個(列表1)的最後一個值,則返回None。

    例子:

    for documentNumber in docdictionary: 
        list1pos = 0 
        list2pos = 0 
        while True: 
         difference = docdictionary[documentNumber][0][list1pos] - docdictionary[documentNumber][1][list2pos] 
         if abs(difference) == 1: 
          return documentNumber 
         if difference < 0: #Page location 2 is greater 
          list1pos++ 
          if list1pos == len(docdictionary[documentNumber][0]): #We were at the end of list 1, there will be no more matches 
           break 
         else: #Page location 1 is greater 
          list2pos++ 
          if list2pos == len(docdictionary[documentNumber][1]): #We were at the end of list 2, there will be no more matches 
           break 
    return None 
    

作爲提醒,選擇2件作品如果名單總是排序。此外,您並不總是需要立即返回文檔ID。如果您希望文件對中的所有文檔而不是第一個找到的文檔,您可以將文檔ID添加到列表中。您甚至可以使用字典來輕鬆地記錄單詞對在每個文檔中出現的次數。

希望這有助於!如果有任何不清楚的地方,請告訴我。

+0

單詞數量可能會增加,因爲它是查詢中單詞的數量。 – simitar

+1

@simitar答案的第二部分實現了「mergesort」的「合併」部分,它可以推廣到任意數量的列表。 –

+0

@BiRico,我將如何去做這件事,因爲我需要比較1和2的位置,然後是2和3的位置,等等,以便查詢中的多個單詞。 – simitar