我想知道是否有任何Python库可以进行模糊文本搜索。例如:
我已经尝试过fuzzywuzzy
解决不了我的问题。另一个库Whoosh
看起来很强大,但是我找不到合适的功能…
{1} 您可以在中执行此操作Whoosh 2.7
。通过添加插件可以进行模糊搜索whoosh.qparser.FuzzyTermPlugin
:
whoosh.qparser.FuzzyTermPlugin
使您可以搜索“模糊”术语,即不必完全匹配的术语。模糊项将与一定数量的“编辑”(字符插入,删除和/或换位–称为“
Damerau-Levenshtein编辑距离”)内的任何相似项匹配。
要添加模糊插件:
parser = qparser.QueryParser("fieldname", my_index.schema)
parser.add_plugin(qparser.FuzzyTermPlugin())
将模糊插件添加到解析器后,可以通过添加~
后跟可选的最大编辑距离来指定模糊项。如果未指定编辑距离,则默认值为1。
例如,以下“模糊”术语查询:
letter~
letter~2
letter~2/3
{2}
要使单词井然有序,请使用Query,whoosh.query.Phrase
但您应该用替换Phrase
插件,whoosh.qparser.SequencePlugin
以允许您在短语内使用模糊术语:
"letter~ stamp~ mail~"
要将默认的短语插件替换为序列插件:
parser = qparser.QueryParser("fieldname", my_index.schema)
parser.remove_plugin_class(qparser.PhrasePlugin)
parser.add_plugin(qparser.SequencePlugin())
{3} 要在两者之间允许单词,slop
请将词组查询中的arg 初始化为更大的数字:
whoosh.query.Phrase(fieldname, words, slop=1, boost=1.0, char_ranges=None)
斜率 –短语中每个“单词”之间允许的单词数;默认值1表示词组必须完全匹配。
您还可以像这样在Query中定义坡度:
"letter~ stamp~ mail~"~10
{4} 整体解决方案:
{4.a} 索引器 将类似于:
from whoosh.index import create_in
from whoosh.fields import *
schema = Schema(title=TEXT(stored=True), content=TEXT)
ix = create_in("indexdir", schema)
writer = ix.writer()
writer.add_document(title=u"First document", content=u"This is the first document we've added!")
writer.add_document(title=u"Second document", content=u"The second one is even more interesting!")
writer.add_document(title=u"Third document", content=u"letter first, stamp second, mail third")
writer.add_document(title=u"Fourth document", content=u"stamp first, mail third")
writer.add_document(title=u"Fivth document", content=u"letter first, mail third")
writer.add_document(title=u"Sixth document", content=u"letters first, stamps second, mial third wrong")
writer.add_document(title=u"Seventh document", content=u"stamp first, letters second, mail third")
writer.commit()
{4.b} 搜索者 会像:
from whoosh.qparser import QueryParser, FuzzyTermPlugin, PhrasePlugin, SequencePlugin
with ix.searcher() as searcher:
parser = QueryParser(u"content", ix.schema)
parser.add_plugin(FuzzyTermPlugin())
parser.remove_plugin_class(PhrasePlugin)
parser.add_plugin(SequencePlugin())
query = parser.parse(u"\"letter~2 stamp~2 mail~2\"~10")
results = searcher.search(query)
print "nb of results =", len(results)
for r in results:
print r
结果如下:
nb of results = 2
<Hit {'title': u'Sixth document'}>
<Hit {'title': u'Third document'}>
{5} 如果要在不使用word~n
查询的每个单词的语法的情况下将模糊搜索设置为默认值,则可以这样初始化QueryParser
:
from whoosh.query import FuzzyTerm
parser = QueryParser(u"content", ix.schema, termclass = FuzzyTerm)
现在您可以使用查询了,"letter stamp mail"~10
但是请记住,它FuzzyTerm
具有默认的编辑距离maxdist = 1
。如果您想要更大的编辑距离,请个性化班级:
class MyFuzzyTerm(FuzzyTerm):
def __init__(self, fieldname, text, boost=1.0, maxdist=2, prefixlength=1, constantscore=True):
super(D, self).__init__(fieldname, text, boost, maxdist, prefixlength, constantscore)
# super().__init__() for Python 3 I think
参考文献:
问题内容: 有谁知道从Linux控制台执行快速模糊搜索的方法吗? 当我需要在项目中查找文件时,经常遇到各种情况,但是我不记得确切的文件名。在Sublime文本编辑器中,我将按Ctrl- P并键入名称的一部分,这将产生文件列表以供选择。我非常满意,这是一个了不起的功能。问题是,在大多数情况下,我必须通过ssh在远程计算机上的控制台中浏览代码。所以我想知道是否有一个类似于Linux控制台的“ Go A
用NSPredicate类写的一个简单的模糊搜素方法,比for循环快并且性能消耗很低。 [Code4App.com]
问题内容: 我正在执行模糊搜索,需要查看匹配的单词。例如,如果我正在搜索查询,并且它使该字段与句子匹配,则我需要能够知道匹配是由于单词引起的。 我尝试设置参数,但似乎未包含我需要的信息。有什么想法吗? 问题答案: 好吧,这就是我想要的: 经过一些研究,我发现了elasticsearch的突出功能。 默认情况下,它返回匹配项周围的上下文片段,但是您可以将片段大小设置为查询长度,以仅返回完全匹配项。例
问题内容: 我正在尝试为我的网站创建一个产品搜索,用户可以在其中搜索多种语言的产品,如果没有完全匹配的内容,则(希望)获得模糊的搜索结果。 我有一个带有列的表。 该列指的是其各自表中产品的ID。 这些列具有各种语言的每种产品的翻译后的meta。 元只是由空格分隔的关键字 是搜索词。 指用户选择的语言 因此,首先,我执行一个基本的“ LIKE” SQL查询以查看是否存在匹配项,如果没有结果,则查询所
问题 我试图通过搜索文本来确定文档是什么类型(例如恳求、通信、传票等),最好使用python。所有的PDF都是可搜索的,但是我还没有找到用python解析它并应用脚本搜索它的解决方案(除了先将它转换为文本文件,但是对于n个文档来说,这可能是资源密集型的)。 到目前为止,我所做的 我已经研究了pypdf、pdfminer、adobe pdf文档,以及我能在这里找到的任何问题(尽管似乎没有一个能直接解
问题内容: 如何使用Python 3搜索和替换文件中的文本? 这是我的代码: 输入文件: 当我在上面的输入文件中搜索并将“ ram”替换为“ abcd”时,它起了一种魅力。但是,反之亦然,即用“ ram”替换“ abcd”时,一些垃圾字符会保留在末尾。 用“ ram”代替“ abcd” 问题答案: fileinput已经支持就地编辑。stdout在这种情况下,它将重定向到文件: