JavaLucene实现对相关性的自定义评分
我试图将潜在的狄利克雷分配(LDA)注入到对搜索文档的相关性进行评分中,结果被卡住了。我才刚开始和Lucene打交道。我正在使用“Lucene in Action”中的代码开始
计划是尝试混合使用默认tf idf模型的权重和查询和每个文档的主题向量之间的余弦相似性。e、 g0.5 * tfidf + 0.5 * cos(Q,D)
我已尝试在索引期间使用每个分数索引之间的分隔符存储每个文档的主题向量:
doc.add(new Field("lda score", "0.200|0.111|0.4999",
Field.Store.NO,
Field.Index.NOT_ANALYZED_NO_NORMS));
然后在搜索过程中:
//tfidf
Query q = new QueryParser(Version.LUCENE_30,
"content",
new StandardAnalyzer(
Version.LUCENE_30))
.parse("some text here");
FieldScoreQuery qf = new FieldScoreQuery("lda score",
FieldScoreQuery.Type.BYTE);
CustomScoreQuery customQ = new CustomScoreQuery(q, qf) {
public CustomScoreProvider getCustomScoreProvider(IndexReader r) {
return new CustomScoreProvider(r) {
public float customScore(int doc,
float tfidfScore,
float ldaScore) {
return 0.5*tfidfScore + 0.5*ldaScore);
} };
显然,我需要帮助的是FieldScoreQuery
部分。我如何读入查询字符串,运行lda推断(与lucene分离的分析)和余弦相似度t为CustomScoreQuery
生成要使用的分数
这是正确的方法吗,还是我需要进入Similarity
类?一些代码样本,以帮助我开始将不胜感激
# 1 楼答案
据我所知,不能将字符串用作FieldScoreQuery。如果需要3个值,请使用3个字段和3个不同的FLOAT类型FieldScoreQuery
我使用数字字段
卢克博士。添加(新数字字段)( 字段名称,字段。百货商店不,没错)。设定浮动值(x)
然后在CustomScoreProvider中实现覆盖该方法
公共浮动customScore(整数单据、浮动子查询核心、浮动[]VALRCCORES)
您将在valSrcScores数组中获得3个值