我正在寻找一个现有的模块,这使我能够编写基本的布尔查询来匹配和搜索文本,而无需编写自己的解析器等。
例如,
president AND (ronald OR (george NOT bush))
将对与TRUE相匹配“总统罗纳德·拉根”“总统罗纳德·拉根和布什”“最大布什不是总统”
但是错误“乔治·布什曾任总统”“我不知道如何拼写罗纳德·拉根”
((到目前为止,我发现Booleano似乎有点过大,但可以完成任务。但是他们的团队不活跃,我无法从文档中找出该怎么做。)
感谢
编辑:确切的样式或语法并不重要。我的目标是使非技术用户能够搜索某些文本,而不仅仅是关键字搜索。
很幸运,找到一个已经存在的库正好可以解析您提供的示例表达式。我建议使您的表达格式更具机器可读性,同时保持其所有清晰度。 Lisp S表达式(使用前缀表示法)简洁明了:
(和“总统”(或“罗纳德”“乔治”“莎莉”))
使用这种格式编写解析器比使用您的格式更容易。或者,您可以只切换到Lisp,它将本地解析它。 :)
旁注:我想你不是想让您的“ NOT”运算符变成二进制,对吗?
您可能想看看使用pyparsing模块的simpleBool.py上的this page代码。否则,这是我编写的一些简单代码。
这不是一个模块,但是可能会带您正确的方向。
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,因为线路太长了
我在我的网站上使用python中的sphinx for full text search。它具有支持boolean matchings的简单语法,但带有运算符,而不是单词。例如,您的查询为president (regan|(bush -george))
。
免责声明:我是下面介绍的软件包的创建者。
对于那些可能会来到此页面的人:我构建了一个程序包来做到这一点(仍处于beta中。)
pip install eldar
您的查询将转换为以下代码:
from eldar import build_query eldar = build_query('"president" AND ("ronald" OR ("george" AND NOT "bush"))') print(eldar("President Bush")) # >>> False print(eldar("President George")) # >>> True
您也可以在某些熊猫数据框中使用它,请查看git页面以获取更多信息:https://github.com/kerighan/eldar