gpt4 book ai didi

Python 查询处理和 bool 搜索

转载 作者:太空狗 更新时间:2023-10-29 23:57:06 24 4
gpt4 key购买 nike

我有一个倒排索引(作为字典),我想将 bool 搜索查询作为输入来处理它并产生结果。

倒排索引是这样的:

{
Test : { FileName1: [213, 1889, 27564], FileName2: [133, 9992866, 27272781, 78676818], FileName3: [9211] },
Try : { FileName4 ...
.....
}

现在,给定一个 bool 搜索查询,我必须返回结果。

例子:

bool 搜索查询:test AND try结果应该是所有包含单词 test 和 try 的文档。

bool 搜索查询:test OR try结果应该是所有进行了测试或尝试的文档。

bool 搜索查询:test AND NOT try结果应该是所有有test但没有try的文档。

我如何构建这个搜索引擎来处理给定的 bool 搜索查询?

提前致谢!

最佳答案

编辑:我保留了答案的第一部分,因为如果这不是学校作业,我认为这仍然是完成任务的更好方法。我用与 OP 问题匹配的更新替换了答案的第二部分。

您似乎想要做的是创建一个查询字符串解析器,它将读取查询字符串并将其转换为一系列 AND/OR/NOT 组合以返回正确的键。

有两种方法。

  1. 根据您所写的内容,到目前为止,最简单的解决方案是将数据加载到任何 SQL 数据库(例如 SQLite,它不需要成熟的运行 SQL 服务器),将字典键加载为一个单独的字段(如果您不关心正常形式 &c,您的其余数据可能都在一个单独的字段中),并将传入的查询转换为 SQL,大致如下:

SQL 表至少有这个:

CREATE TABLE my_data(
dictkey text,
data text);

python_query="foo OR bar AND NOT gazonk"
sql_keywords=["AND","NOT","OR"]
sql_query=[]
for word in python_query.split(" "):
if word in sql_keywords:
sql_query+=[ word ]
else:
sql_query+=["dictkey='%s'" % word]

real_sql_query=" ".join(sql_query)

这需要对 SQL 注入(inject)和特殊字符进行一些转义和控制检查,但通常它只会将您的查询转换为 SQL,当针对 SQL 数据库运行时,它会返回键(可能还有数据)以供进一步处理。

  1. 现在是纯 Python 版本。

您需要做的是分析您获得的字符串并将逻辑应用于您现有的 Python 数据。

分析字符串以将其简化为特定组件(及其交互)是 parsing .如果您真的想构建自己的完全成熟的解析器,可以使用 Python 模块,但是,对于学校作业,我希望您的任务是构建自己的解析器。

根据你的描述,query可以用准BNF form表示作为:

(<[NOT] word> <AND|OR>)...

既然你说 priority of 不相关,你可以用简单的方法逐字解析。

然后您必须将关键字与文件名相匹配,正如另一个答案中提到的,使用 sets 最容易做到这一点。 .

所以,它可以大致像这样:

import re

query="foo OR bar AND NOT gazonk"

result_set=set()
operation=None

for word in re.split(" +(AND|OR) +",query):
#word will be in ['foo', 'OR', 'bar', 'AND', 'NOT gazonk']

inverted=False # for "NOT word" operations

if word in ['AND','OR']:
operation=word
continue

if word.find('NOT ') == 0:
if operation is 'OR':
# generally "OR NOT" operation does not make sense, but if it does in your case, you
# should update this if() accordingly
continue

inverted=True
# the word is inverted!
realword=word[4:]
else:
realword=word

if operation is not None:
# now we need to match the key and the filenames it contains:
current_set=set(inverted_index[realword].keys())

if operation is 'AND':
if inverted is True:
result_set -= current_set
else:
result_set &= current_set
elif operation is 'OR':
result_set |= current_set

operation=None

print result_set

请注意,这不是一个完整的解决方案(例如,它不包括处理查询的第一项,并且它要求 bool 运算符为大写),并且未经过测试。但是,它的主要目的应该是向您展示如何去做。做得更多会为您编写类(class)作业,这对您不利。因为您应该学习如何做才能理解它。随时要求澄清。

关于Python 查询处理和 bool 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46977923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com