Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用嗖嗖声生成搜索词建议?_Python_Whoosh_Search Suggestion - Fatal编程技术网

Python 用嗖嗖声生成搜索词建议?

Python 用嗖嗖声生成搜索词建议?,python,whoosh,search-suggestion,Python,Whoosh,Search Suggestion,我在一个Whoosh索引中有一组文档,我想提供一个搜索词建议功能。因此,如果您键入“pop”,可能会出现以下建议: 爆米花 流行的 教皇 杨树膜 流行文化 我的索引中的NGRAMWORDS字段中有一些应该作为建议出现的术语,但是当我对该字段进行查询时,我得到的是自动完成的结果,而不是扩展的建议-因此我得到了标记为“流行文化”的文档,但无法向用户显示该术语。 (为了进行比较,我会在ElasticSearch中使用该字段上的完成映射,然后使用_suggest端点来获取建议。) 我只能在文档或we

我在一个Whoosh索引中有一组文档,我想提供一个搜索词建议功能。因此,如果您键入“pop”,可能会出现以下建议:

  • 爆米花
  • 流行的
  • 教皇
  • 杨树膜
  • 流行文化
我的索引中的NGRAMWORDS字段中有一些应该作为建议出现的术语,但是当我对该字段进行查询时,我得到的是自动完成的结果,而不是扩展的建议-因此我得到了标记为“流行文化”的文档,但无法向用户显示该术语。 (为了进行比较,我会在ElasticSearch中使用该字段上的完成映射,然后使用_suggest端点来获取建议。)

我只能在文档或web上的其他地方找到自动完成或拼写更正的示例。有什么方法可以让我用嗖嗖声从索引中得到搜索词建议吗

编辑:
expand\u prefix
是一个非常需要的指向正确方向的指针。最后,我在我的建议字段中使用了一个
关键字(逗号=True,小写=True)
,这样的代码以最常见的第一顺序获得建议(
expand_prefix
iter_prefix
将按字母顺序生成它们):


这不是您想要的,但可能可以帮助您:

reader = index.reader()
for x in r.expand_prefix('title', 'pop'):
  print x
输出示例:

pop
popcorn
popular
更新

另一个解决方法是构建另一个索引,其中关键字仅作为文本。玩搜索语言。我能做到的是:

In [12]: list(ix.searcher().search(qp.parse('pop*')))
Out[12]: 
[<Hit {'keywords': u'popcorn'}>,
 <Hit {'keywords': u'popular'}>,
 <Hit {'keywords': u'pope'}>,
 <Hit {'keywords': u'Popular Film'}>,
 <Hit {'keywords': u'pop culture'}>]
[12]中的
:列表(ix.searcher().search(qp.parse('pop*'))
出[12]:
[,
,
,
,
]
术语频率函数 我想在这里补充一点,whoosh中实际上有一个内置函数,它按术语频率返回顶部的“数字”术语。它在花园里

tf idf与频率 此外,在文档的同一页上,中上一个函数的正上方是一个函数,该函数返回最独特的术语,而不是最常见的术语。它使用分数,可以有效地消除常见但无关紧要的单词,如“the”。这可能或多或少有用,这取决于你在寻找什么。它被恰当地命名为:

whoosh.reading.IndexReader.most_distinctive_terms(fieldname, number=5, prefix='')
其中每一项都将以这种方式使用:

with ix.reader() as r:
    print r.most_frequent_terms('suggestions', number=5, prefix='pop')
    print r.most_distinctive_terms('suggestions', number=5, prefix='pop')
多词建议 此外,我在多词建议方面也遇到了问题。我的解决方案是通过以下方式创建架构:

fields.Schema(suggestions = fields.TEXT(),
              suggestion_phrases = fields.KEYWORD(commas=True, lowercase=True)

suggestion\u phrases
字段中,
commas=True
允许关键字用空格存储,因此有多个单词,
lowercase=True
忽略大写(如果需要区分大写和非大写术语,可以删除此项)。然后,为了获得单词和多词建议,您可以在两个字段上运行
most\u frequency\u terms()
most\u differential\u terms()
。然后结合结果。

事实上,这听起来很像我要找的!只是尝试一下。嗯,我得到的结果让我看起来不应该使用NGRAMWORDS字段类型。如果我在我的一个关键字字段上使用它,它会完全符合我的要求。好吧,问题是它不能建议多个词的术语。这似乎是标记器的一个功能。我不明白为什么expand_prefix在关键字字段上不起作用。是否有一个选项我可以传递到该字段以启用它?谢谢!我将用我正在使用的更新问题。
with ix.reader() as r:
    print r.most_frequent_terms('suggestions', number=5, prefix='pop')
    print r.most_distinctive_terms('suggestions', number=5, prefix='pop')
fields.Schema(suggestions = fields.TEXT(),
              suggestion_phrases = fields.KEYWORD(commas=True, lowercase=True)