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

时间:2017-03-01 15:12:38

标签: lenskit

我想添加精度指标并仅使用项目 评级高于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))
}

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

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

不起作用,因为Lenskit 3.0中没有ItemSelectors类。 如何将goodItems与相应的项目链接起来并丢弃低评级的项目以获得正确的精确值?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

由:

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

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

答案 1 :(得分:0)

goodItems应该有效:

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