“你是说……?“更正用户查询中的错误”

概述

whoosh可以通过从索引(或字典)中返回与错误输入词相近的单词列表,快速建议替换错误输入词:

with ix.searcher() as s:
    corrector = s.corrector("text")
    for mistyped_word in mistyped_words:
        print corrector.suggest(mistyped_word, limit=3)

whoosh.spelling.Corrector.suggest() 有关参数信息的方法文档。

目前,建议引擎更像是一个“拼写矫正器”,而不是一个真正的“拼写检查器”,因为它不做那种复杂的语音匹配或语义/上下文分析一个好的拼写检查可能。但是,它仍然非常有用。

纠正单词有两种主要策略:

  • 使用索引字段中的术语。

  • 使用单词列表中的单词。

从索引字段中提取建议

在whoosh 2.7及更高版本中,所有字段都提供拼写建议。但是,如果有一个分析器修改索引词(如词干),则可以添加 spelling=True 到一个字段,使其存储用于拼写建议的单独未修改的术语版本:

ana = analysis.StemmingAnalyzer()
schema = fields.Schema(text=TEXT(analyzer=ana, spelling=True))

然后您可以使用 whoosh.searching.Searcher.corrector() 获取字段更正器的方法:

corrector = searcher.corrector("content")

使用索引字段的内容的好处是,当您对该索引进行拼写检查查询时,建议是根据索引的内容定制的。缺点是,如果索引文档包含拼写错误,那么拼写建议也将是错误的。

从单词列表中提取建议

因特网上有很多可用的单词表,你可以用来填充拼写词典。

(在以下示例中, word_list 可以是Unicode字符串列表,也可以是每行有一个单词的文件对象。)

创建一个 whoosh.spelling.Corrector 排序单词列表中的对象:

from whoosh.spelling import ListCorrector

# word_list must be a sorted list of unicocde strings
corrector = ListCorrector(word_list)

合并两个或多个校正器

您可以使用 whoosh.spelling.MultiCorrector ::

c1 = searcher.corrector("content")
c2 = spelling.ListCorrector(word_list)
corrector = MultiCorrector([c1, c2])

更正用户查询

您可以使用 whoosh.searching.Searcher.correct_query() 方法:

from whoosh import qparser

# Parse the user query string
qp = qparser.QueryParser("content", myindex.schema)
q = qp.parse(qstring)

# Try correcting the query
with myindex.searcher() as s:
    corrected = s.correct_query(q, qstring)
    if corrected.query != q:
        print("Did you mean:", corrected.string)

这个 correct_query 方法返回具有以下属性的对象:

query

修正的 whoosh.query.Query 树。你可以测试这个是否相等( == )到原始解析的查询,以检查更正器是否实际更改了任何内容。

string

用户查询字符串的正确版本。

tokens

表示已更正术语的已更正令牌对象列表。您可以使用它重新格式化用户查询(请参见下文)。

你可以使用 whoosh.highlight.Formatter 对象来格式化已更正的查询字符串。例如,使用 HtmlFormatter 将更正后的字符串格式化为HTML::

from whoosh import highlight

hf = highlight.HtmlFormatter()
corrected = s.correct_query(q, qstring, formatter=hf)

参见文档 whoosh.searching.Searcher.correct_query() 有关默认值和参数的信息。