Python中的布尔文本搜索
我在找一些现成的模块,这些模块可以让我写简单的布尔查询,用来匹配和搜索文本,而不需要自己写解析器之类的东西。
举个例子,
president AND (ronald OR (george NOT bush))
这个查询会在以下文本中返回TRUE:
“总统罗纳德·里根”
“总统罗纳德·里根和布什”
“马克斯·布什不是总统”
但是在以下文本中会返回FALSE:
“乔治·布什是总统”
“我不知道怎么拼罗纳德·里根”
(到目前为止,我找到了一款叫Booleano的工具,虽然感觉有点复杂,但可以完成这个任务。不过他们的团队不活跃,我也没从文档中弄明白该怎么用。)
谢谢
编辑:具体的风格或语法并不是很重要。我的目标是让非技术用户能够在搜索某些文本时,超越简单的关键词搜索。
4 个回答
你可以看看这个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是因为那行代码太长了。
找到一个现成的库,正好能解析你提供的例子表达式,那可真是运气好。不过,我建议你把表达式的格式改得更容易让机器理解,同时又不失清晰度。比如,Lisp的S表达式(使用前缀表示法)既简洁又明了:
(and "president" (or "ronald" "george" "sally"))
写一个解析器来处理这种格式比处理你现在的格式要简单得多。或者你也可以直接用Lisp,它可以直接解析这种格式。:)
顺便问一下:我猜你不是故意把你的“NOT”操作符弄成二元的,对吧?
免责声明:我是下面这个包的创建者。
对于可能来到这个页面的人:我制作了一个包来实现这个功能(目前还在测试阶段)。
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