簡體   English   中英

與Lucene的余弦相似度僅適用於匹配的文檔

[英]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之間的數字。

我已經讀過一些計算余弦相似度的方法,但是它們都是通過比較每個文檔的術語向量來實現的。 例如, 博客提到以下內容:

如果您確實需要文檔之間的余弦相似度,則必須為源字段啟用項向量,然后使用它們來計算角度。 問題是這不能很好地縮放,您實際上需要與所有其他文檔一起計算角度

和這樣的答案似乎說的是相同的:

  1. 遍歷所有doc id ,從0到maxDoc();

難道沒有辦法只計算與查詢匹配的文檔的余弦相似度,並將其作為文檔的分數返回嗎?

作為附帶說明,我確實讀過TFIDFS類似性 ,我相信VSM部分正是我所需要的,但是該部分似乎已在Lucene實用評分功能中消失了。 我不確定如何才能將“相似性”類“轉換”為僅產生純余弦相似性。

所以我的問題回顧:

  1. 我對逆索引如何節省時間的看法正確嗎?

  2. 有沒有辦法只計算與令牌之一實際匹配的文檔的余弦相似度,而不是所有文檔的余弦相似度?

  3. 我可以使用/轉換TFIDFSimilarity類來獲得純余弦相似度嗎?
  1. 這在很大程度上取決於您如何制定查詢。 如果您制定了BooleanQuery,則可以指定查詢的哪些條件必須在返回的文檔中。 這是使用BoolenClause.Occur.MUST完成的。

  2. 您可以通過擴展TFIDFSimilarity來編寫自己的相似度,但是您可能會注意到Lucene實際評分基於余弦相似度。 在該公式中,queryNorm(q)和norm(t,d)構成余弦相似性的分母,並且總和是查詢向量和文檔向量的點積。

提示:您可以構成一個示例查詢,並使用explain()查看評分的詳細信息。

暫無
暫無

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

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