我不確定這是做到這一點的最佳方式,但這似乎工作。我在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
下正在使用新的相似類。
來源
2017-09-29 17:34:47
jdm
默認相似性通過釋放Solr6切換到BM25。您現在也可以設置相似性類_per_field_,這樣您就可以有一個字段具有與其他字段不同的計算。 – MatsLindh
感謝您的信息!對於後驗,下面是關於Lucene中TD-IDF和BM25之間差異的有用鏈接:http://opensourceconnections.com/blog/2015/10/16/bm25-the-next-generation-of-lucene-relevation/ – jdm