2011-05-18 102 views
2

我正试图在Lucene上实现BM25f评分系统。我需要根据我的需要对here进行原始实现进行一些小的更改,我在他获得平均字段长度和文档长度的部分迷路了...有人可以指导我如何或从何处获得它?如何在Lucene中获得平均字段长度和文档长度?

+0

前段时间我浏览过这个问题,我猜这个实现计算了Lucene之外的平均字段和文档长度(例如在提交索引文档时)。据我所知Lucene没有这个功能(平均字段和文档长度)。 – 2011-05-19 15:50:08

回答

1

你可以从文件领域相关TermVector实例字段长度,但是这会增加你的索引大小。除非你买不起一个更大的指数,否则这可能是要走的路。当然,你仍然需要自己计算平均值,并将其存储在其他地方(或者可以将其存储在具有众所周知的外部标识的特殊文档中,只需在统计信息发生变化时更新)。

如果你可以将数据存储在指数之外,有一两件事你可以做的是算令牌时文档记号化,并存储计数平均。如果您的文档集合是静态的,只需在索引后将每个字段的值转储到文件&进程中。如果索引只需要添加更新,则可以存储文档数量和每个字段的平均长度,并重新计算平均值。如果文档将被删除,并且您需要准确的计数,则需要重新解析要删除的文档,以了解每个字段包含多少条款,或者如果您正在使用该条款,则需要从TermVector获取长度。

+0

可以说我不喜欢指数大小的增加,那么? – Shrinath 2011-05-23 10:01:48

+0

如果不存储术语向量,则必须在索引时计算每个字段中术语的数量,并在某处存储这些计数或平均值。一个“特殊”文件是一种可能性。另一种可能性是使用某个数据库或键值存储来存储索引统计信息。不过,如果您添加或删除文档,请记住更新它们。当然,如果你的文件长度相近,那么稍微偏离一点就不会伤害BM25的统计数据。 – 2011-05-23 17:00:05