我正在寻找一个现有的模块,它使我能够编写基本的布尔查询来匹配和搜索文本,而不用编写我自己的解析器等。
例如,
president AND (ronald OR (george NOT bush))
将匹配TRUE “总统罗纳德·拉根” “总统罗纳德·拉根和布什” “最大布什不是总统”
但是假的 “乔治·布什是总统” “我不知道如何拼写罗纳德·拉根”
(到目前为止,我发现Booleano,看起来有点矫枉过正,但可以完成任务。但是他们的小组处于非活动状态,我无法从文档中弄清楚该怎么做。)
感谢
编辑: 确切的风格或语法并不重要。我的目标是为非技术用户提供搜索某些文本以外的关键字搜索能力。
答案 0 :(得分:3)
免责声明:我是下面介绍的软件包的创建者。
对于可能会访问此页面的人:我构建了一个程序包来做到这一点(仍处于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
答案 1 :(得分:2)
找到一个准备好解析你提供的示例表达式的预先存在的库是非常幸运的。我建议使表达式格式更具机器可读性,同时保持其清晰度。 Lisp S表达式(使用前缀表示法)紧凑而清晰:
(和“总统”(或“罗纳德”“乔治”“莎莉”))
为此格式编写解析器比格式更容易。或者您可以切换到Lisp,它将本地解析它。 :)
旁注:我认为你不是故意让你的“NOT”运算符二进制,对吗?
答案 2 :(得分: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,因为这条线路已经很长了
答案 3 :(得分:1)
我在我的网站上使用python中的sphinx for full text search。它有一个支持boolean matchings的简单语法,但是使用运算符,而不是单词。例如,您的查询将为president (regan|(bush -george))
。
答案 4 :(得分:-1)
我知道这不是对该问题最合适的答案。我之所以发布此帖子,是因为我发现这很有用,并且在我的情况下接受的解决方案太慢了(我的DataFrame
拥有9935行和14列,每个单元格平均2534个字符)。
我创建了一个名为pandas
的{{1}} DataFrame
,其中包含来自以下问题的一些文本:
df
要在import pandas as pd
df = pd.DataFrame({'a':["the president's ronald ragen", 'the president ronald ragen and bush', 'abe'], 'b':['max bush was not a president','george bush was a president',"i don't know how to spell ronald ragen"]})
上运行查询""""president"&("ronald"|("george"&~"bush"))"""
,这是我对问题中查询的解释。
df