Python中的布尔文本搜索

13 投票
4 回答
7639 浏览
提问于 2025-04-15 19:09

我在找一些现成的模块,这些模块可以让我写简单的布尔查询,用来匹配和搜索文本,而不需要自己写解析器之类的东西。

举个例子,

president AND (ronald OR (george NOT bush))

这个查询会在以下文本中返回TRUE:

“总统罗纳德·里根”

“总统罗纳德·里根和布什”

“马克斯·布什不是总统”

但是在以下文本中会返回FALSE:

“乔治·布什是总统”

“我不知道怎么拼罗纳德·里根”

(到目前为止,我找到了一款叫Booleano的工具,虽然感觉有点复杂,但可以完成这个任务。不过他们的团队不活跃,我也没从文档中弄明白该怎么用。)

谢谢

编辑:具体的风格或语法并不是很重要。我的目标是让非技术用户能够在搜索某些文本时,超越简单的关键词搜索。

4 个回答

2

你可以看看这个simpleBool.py代码,它在这个页面上,使用了pyparsing模块。如果不想看那个,这里有一些我写的简单代码。

这不是一个模块,但可能会给你一些启发。

def found(s,searchstr):
    return s.find(searchstr)>-1

def booltest1(s):
    tmp = found(s,'george') and not found(s,'bush')
    return found(s,'president') and (found(s,'ronald') or tmp)

print booltest1('the president ronald reagan')
print booltest1('george bush was a president')

你还可以测试其他的。我用tmp是因为那行代码太长了。

2

找到一个现成的库,正好能解析你提供的例子表达式,那可真是运气好。不过,我建议你把表达式的格式改得更容易让机器理解,同时又不失清晰度。比如,Lisp的S表达式(使用前缀表示法)既简洁又明了:

(and "president" (or "ronald" "george" "sally"))

写一个解析器来处理这种格式比处理你现在的格式要简单得多。或者你也可以直接用Lisp,它可以直接解析这种格式。:)

顺便问一下:我猜你不是故意把你的“NOT”操作符弄成二元的,对吧?

8

免责声明:我是下面这个包的创建者。

对于可能来到这个页面的人:我制作了一个包来实现这个功能(目前还在测试阶段)。

pip install eldar

你的查询会被转换成以下代码:

from eldar import Query

eldar = Query('"president" AND ("ronald" OR ("george" AND NOT "bush"))')

print(eldar("President Bush"))
# >>> False
print(eldar("President George"))
# >>> True

你也可以在一些pandas数据框上使用它,想了解更多信息可以查看这个git页面: https://github.com/kerighan/eldar

撰写回答