我正在python中创建一个非常基本的搜索引擎,我正在创建一个处理短语查询的方法,所以如果2个单词的位置在1之内,它们在文档中彼此相邻,它将输出发生这种情况的所有文件编号。
我目前有一本看起来像这样的字典
{'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和2 + 3等值的值?我想比较它们,看看单词的位置是否只是另一个单词的+1。
所以你可以看到doc 6 word 2跟在单词1之后,这会导致密钥被发回。
答案 0 :(得分:1)
有几种方法可以实现您在此尝试做的事情。我假设根据你给我的例子,总是只有两个单词,并且列表总是按顺序排列。
无论采用何种方法,您都需要遍历文档(字典)。在Python中迭代字典很简单;你可以看到一个例子here。之后,步骤改变
第一个选项 - 效率更低,更简单:
比较这两个位置,如果它们在1之内,则返回文档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)的最后一个值,则返回无。
示例:
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添加到列表中。您甚至可以使用字典轻松跟踪单词对在每个文档中出现的次数。
希望这有帮助!如果有任何不清楚的地方,请告诉我。