“你是说……?“更正用户查询中的错误”¶
概述¶
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()
有关默认值和参数的信息。