我想添加精度指标并仅使用项目 评级高于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与相应的项目链接起来并丢弃低评级的项目以获得正确的精确值?
答案 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()