如何在 Lenskit 3.0 中将分数高于 x 的项目添加到 goodItems 中以获取精度指标?

How do I add items with a score above x to goodItems for precision metric in Lenskit 3.0?

我想添加精度指标并仅使用项目 评分高于 4.0 为 'goodItems'

在 Lenskit 2 中,这可以通过以下方式完成:

   metric precision {
    listSize 10
    candidates ItemSelectors.addNRandom(ItemSelectors.testItems(), 100)
    exclude ItemSelectors.trainingItems()
    goodItems ItemSelectors.testRatingMatches(Matchers.greaterThanOrEqualTo(4.0d))
}

现在我正尝试在 Lenskit 3 中使用 gradle 做同样的事情,但很明显

    metric('pr') {
        goodItems 'ItemSelectors.testRatingMatches(Matchers.greaterThanOrEqualTo(4.0d))'
    }

不起作用,因为 Lenskit 3.0 中没有 ItemSelectors class。 我怎样才能 link 具有适当项目的 goodItems 并丢弃低评级项目以获得正确的精度值?

这个 goodItems 应该有效:

user.testHistory.findAll({ it instanceof org.lenskit.data.ratings.Rating && it.value >= 4 })*.itemId.toSet()

正如 Ekstrand 先生所说,您可以通过将以下行添加到 gradle 构建文件来 select 好的项目。

goodItems 'user.testHistory.findAll({ it instanceof org.lenskit.data.ratings.Rating && it.value >= 4 })*.itemId'

然而,这个returns一个对象,在Itemselector.class中,有一个解析恰好是Set,但是这不起作用,因为返回的对象是ArrayList类型。如果我是正确的,这意味着对象需要在转换为集合之前转换为 ArrayList,我通过复制 Itemselect 或 class 并替换:

来做到这一点
Set<Long> set = (Set<Long>) script.run();

作者:

Set<Long> set = new HashSet<Long>((ArrayList<Long>)script.run());

这 returns 是我测试集中的正确项目,评分高于 4.0