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 中使用 graddle 做同样的事情,但显然

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

不起作用,因为 Lenskit 3.0 中没有 ItemSelectors 类。如何将 goodItems 与适当的项目联系起来并丢弃低评价的项目以达到正确的精度值?

4

2 回答 2

1

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

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

但是,这会返回一个对象,在 Itemselector.class 中,Set 发生了一个解析,但这不起作用,因为返回的对象是 ArrayList 类型的。如果我是正确的,这意味着对象需要在被转换为集合之前被转换为 ArrayList,我通过复制 Itemselector 类并替换来做到这一点:

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

经过:

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

这会从我的测试集中返回正确的项目,评分高于 4.0

于 2017-03-03T08:15:43.467 回答
0

goodItems应该有效:

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

于 2017-03-01T20:44:34.127 回答