我不确定这是做到这一点的最佳方式,但这似乎工作。我在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