2015-12-01 170 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