簡體   English   中英

用Whoosh生成搜索詞建議?

[英]Generating search term suggestions with Whoosh?

我在Whoosh索引中有一組文檔,我想提供一個搜索詞建議功能。 因此,如果您輸入“pop”,可能會出現一些建議:

  • 爆米花
  • 流行
  • 教皇
  • 楊樹電影
  • 流行文化

我已經將條款作為建議進入我的索引中的NGRAMWORDS字段,但當我對該字段進行查詢時,我得到自動完成的結果而不是擴展的建議 - 所以我得到標記為“pop culture”的文檔“,但無法向用戶顯示該術語。 (為了進行比較,我在ElasticSearch中使用該字段上的完成映射執行此操作,然后使用_suggest端點獲取建議。)

我只能在文檔或網絡上的其他地方找到自動完成或拼寫更正的示例。 有什么方法可以通過Whoosh從我的索引中獲取搜索詞建議嗎?

編輯: expand_prefix是一個非常需要的指針在正確的方向。 我最終為我的建議字段使用KEYWORD(commas=True, lowercase=True) ,並且這樣的代碼以最常見的第一順序獲得建議( expand_prefixiter_prefix將按字母順序產生它們):

def get_suggestions(term):
    with ix.reader() as r:
        suggestions = [(s[0], s[1].doc_frequency()) for s in r.iter_prefix('suggest', term)]
    return sorted(suggestions, key=itemgetter(1), reverse=True)

這不是您正在尋找的,但可能可以幫助您:

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

輸出示例:

pop
popcorn
popular

更新

另一種解決方法是使用僅作為TEXT的關鍵字構建另一個索引。 並使用搜索語言。 我能做到的:

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'}>]

術語頻率功能

我想在這里添加答案,實際上在whoosh中存在內置函數,它按術語頻率返回頂部'數字'項。 它是在嗖嗖的文件中

whoosh.reading.IndexReader.most_frequent_terms(fieldname, number=5, prefix='')

tf-idf與頻率

此外,在文檔的同一頁面上,在whoosh docs中的上一個函數正上方是一個函數,它返回最獨特的術語而不是最常見的術語。 它使用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_phrases字段中, commas=True允許關鍵字與空格一起存儲,因此具有多個單詞,而lowercase=True忽略大小寫(如果需要區分大寫和非大寫術語,則可以刪除它)。 然后,為了獲得單字和多字建議,您可以在兩個字段上運行most_frequent_terms()most_distinctive_terms() 然后結合結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM