2017-09-29 65 views
0

如何更改Solr的評分函數以減少「詞頻」的權重?在solr中減少詞頻的權重?

我正在使用類似pagerank的文檔提升作爲相關因子。我的搜索索引目前存在許多「垃圾郵件」或沒有很好清理的文檔,並且在頂部有重複的文字。

我知道分數是按照詞頻(文檔中搜索詞的頻率),逆文檔頻率等(How are documents scored?)計算的。我可以增加提振力,但這也會強調其他因素。

是在查詢時指定函數的方法(以及默認函數是什麼),還是必須更改配置和reindex?如果它有所作爲,我會用solr來使用django-haystack。

回答

1

我不確定這是做到這一點的最佳方式,但這似乎工作。我在java中創建了一個Similarity的子類。在ClassicSimilarity中,術語頻率定義爲sqrt(freq)。添加乘法因子是沒有意義的,因爲tf與其他項相乘,而不是相加 - 比例因子將被統一應用。即scale * a * b沒有意義,scale * a + b會。但在這種情況下你可以做的是a^scale * b。這基本上做的是它應用對數的比例因子:log(score) = scale * log(a) + log(b)

另請注意,默認相似度函數畢竟不是TF-IDF,而是BM25。這裏是TF-IDF的一個變種。

package com.example.solr; 
import org.apache.lucene.search.similarities.ClassicSimilarity; 

public class CustomSimilarity extends ClassicSimilarity { 
    @Override 
    public float tf(float freq) { 
     return (float) Math.pow(freq, 0.25); // default: 0.5 
    } 

    @Override 
    public String toString() { 
     return "CustomSimularity"; 
    } 
} 

與編譯:

javac -cp /path/to/solr-6.6.1/server/solr-webapp/webapp/WEB-INF/lib/lucene-core-6.6.1.jar:. -d . CustomSimilarity.java 
jar -cvf myscorer.jar com 

然後,添加到solrconfig.xml

<lib path="/path/to/myscorer.jar" /> 

schema.xml

<similarity class="com.example.solr.CustomSimilarity"> 
</similarity> 

Solr的重新啓動後,你可以VERI因爲在http://localhost:8983/solr/#/<corename>/schema下正在使用新的相似類。

+1

默認相似性通過釋放Solr6切換到BM25。您現在也可以設置相似性類_per_field_,這樣您就可以有一個字段具有與其他字段不同的計算。 – MatsLindh

+0

感謝您的信息!對於後驗,下面是關於Lucene中TD-IDF和BM25之間差異的有用鏈接:http://opensourceconnections.com/blog/2015/10/16/bm25-the-next-generation-of-lucene-relevation/ – jdm