Python中的布尔文本搜索

问题描述 投票:9回答:4

我正在寻找一个现有的模块,这使我能够编写基本的布尔查询来匹配和搜索文本,而无需编写自己的解析器等。

例如,

president AND (ronald OR (george NOT bush))

将对与TRUE相匹配“总统罗纳德·拉根”“总统罗纳德·拉根和布什”“最大布什不是总统”

但是错误“乔治·布什曾任总统”“我不知道如何拼写罗纳德·拉根”

((到目前为止,我发现Booleano似乎有点过大,但可以完成任务。但是他们的团队不活跃,我无法从文档中找出该怎么做。)

感谢

编辑:确切的样式或语法并不重要。我的目标是使非技术用户能够搜索某些文本,而不仅仅是关键字搜索。

python full-text-search boolean
4个回答
2
投票

很幸运,找到一个已经存在的库正好可以解析您提供的示例表达式。我建议使您的表达格式更具机器可读性,同时保持其所有清晰度。 Lisp S表达式(使用前缀表示法)简洁明了:

(和“总统”(或“罗纳德”“乔治”“莎莉”))

使用这种格式编写解析器比使用您的格式更容易。或者,您可以只切换到Lisp,它将本地解析它。 :)

旁注:我想你不是想让您的“ NOT”运算符变成二进制,对吗?


1
投票

您可能想看看使用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,因为线路太长了


1
投票

我在我的网站上使用python中的sphinx for full text search。它具有支持boolean matchings的简单语法,但带有运算符,而不是单词。例如,您的查询为president (regan|(bush -george))

[Lucene具有same feature


0
投票

免责声明:我是下面介绍的软件包的创建者。

对于那些可能会来到此页面的人:我构建了一个程序包来做到这一点(仍处于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

© www.soinside.com 2019 - 2024. All rights reserved.