[英]Cosine Similarity with Lucene only for documents that match
據我了解,Lucene是一個反向索引系統,它的強大之處在於它只將查詢與至少與令牌匹配的文檔進行比較。
與將查詢與每個文檔進行比較的幼稚方法(甚至是那些沒有提及查詢中存在的任何標記的方法)相比,這是一個很大的好處。
例如,如果我有索引文件:
D1: "Hello world said the guy"
D2: "Hello, what a beautiful world"
D3: "random text"
正如我所看到的 ,搜索查詢“ Hello world ”將僅查看索引文檔D1和D2並跳過D3,從而節省了時間。
這個對嗎?
現在,我正在嘗試計算文檔之間的余弦相似度。 輸入查詢將是一個文檔,輸出應該是余弦分數。 介於0和1之間的數字。
我已經讀過一些計算余弦相似度的方法,但是它們都是通過比較每個文檔的術語向量來實現的。 例如, 此博客提到以下內容:
如果您確實需要文檔之間的余弦相似度,則必須為源字段啟用項向量,然后使用它們來計算角度。 問題是這不能很好地縮放,您實際上需要與所有其他文檔一起計算角度 。
和這樣的答案似乎說的是相同的:
- 遍歷所有doc id ,從0到maxDoc();
難道沒有辦法只計算與查詢匹配的文檔的余弦相似度,並將其作為文檔的分數返回嗎?
作為附帶說明,我確實讀過TFIDFS類似性 ,我相信VSM部分正是我所需要的,但是該部分似乎已在Lucene實用評分功能中消失了。 我不確定如何才能將“相似性”類“轉換”為僅產生純余弦相似性。
所以我的問題回顧:
我對逆索引如何節省時間的看法正確嗎?
有沒有辦法只計算與令牌之一實際匹配的文檔的余弦相似度,而不是所有文檔的余弦相似度?
TFIDFSimilarity
類來獲得純余弦相似度嗎? 這在很大程度上取決於您如何制定查詢。 如果您制定了BooleanQuery,則可以指定查詢的哪些條件必須在返回的文檔中。 這是使用BoolenClause.Occur.MUST完成的。
您可以通過擴展TFIDFSimilarity來編寫自己的相似度,但是您可能會注意到Lucene實際評分基於余弦相似度。 在該公式中,queryNorm(q)和norm(t,d)構成余弦相似性的分母,並且總和是查詢向量和文檔向量的點積。
提示:您可以構成一個示例查詢,並使用explain()查看評分的詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.