|
@@ -3,6 +3,7 @@ package com.tzld.piaoquan.recommend.server.service.rank.strategy;
|
|
|
import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
|
|
|
import com.tzld.piaoquan.recommend.server.model.Video;
|
|
|
import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
|
|
|
+import com.tzld.piaoquan.recommend.server.util.MathUtil;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.math3.util.Pair;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -19,19 +20,33 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
|
|
|
@Autowired
|
|
|
private RankStrategy4RegionMergeModelV563 modelV563Service;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private RankStrategy4RegionMergeModelV564 modelV564Service;
|
|
|
+
|
|
|
@Override
|
|
|
public List<Video> mergeAndRankRovRecall(RankParam param) {
|
|
|
Map<String, Double> mergeWeight = this.mergeWeight != null ? this.mergeWeight : new HashMap<>(0);
|
|
|
|
|
|
- List<Video> result = modelV563Service.mergeAndRankRovRecall(param);
|
|
|
+ List<Video> result;
|
|
|
+ String rosScoreKey;
|
|
|
+ int baseRankId = mergeWeight.getOrDefault("baseRankId", 563D).intValue();
|
|
|
+ if (564 == baseRankId) {
|
|
|
+ rosScoreKey = "NorXGBScore";
|
|
|
+ result = modelV564Service.mergeAndRankRovRecall(param);
|
|
|
+ } else {
|
|
|
+ rosScoreKey = "hasReturnRovScore";
|
|
|
+ result = modelV563Service.mergeAndRankRovRecall(param);
|
|
|
+ }
|
|
|
if (null != result && !result.isEmpty()) {
|
|
|
try {
|
|
|
Integer versionCode = param.getVersionCode();
|
|
|
int orderVersionCode = mergeWeight.getOrDefault("orderVersionCode", 1500D).intValue();
|
|
|
if (null != versionCode && versionCode == orderVersionCode) {
|
|
|
int keepTopN = mergeWeight.getOrDefault("keepTopN", 1D).intValue();
|
|
|
+ boolean useRandFlag = mergeWeight.getOrDefault("useRandFlag", 0D).intValue() > 0;
|
|
|
boolean firstRovFlag = mergeWeight.getOrDefault("firstRovFlag", 1D).intValue() > 0;
|
|
|
- return resort(keepTopN, firstRovFlag, result);
|
|
|
+ double rovRandRate = mergeWeight.getOrDefault("rovRandRate", 0.5);
|
|
|
+ return resort(keepTopN, useRandFlag, firstRovFlag, rovRandRate, rosScoreKey, result);
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
log.error("diversity resort error", e);
|
|
@@ -40,7 +55,7 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- private List<Video> resort(int keepTopN, boolean firstRovFlag, List<Video> videos) {
|
|
|
+ private List<Video> resort(int keepTopN, boolean useRandFlag, boolean firstRovFlag, double rovRandRate, String rosScoreKey, List<Video> videos) {
|
|
|
Map<Long, Video> videoMap = new HashMap<>();
|
|
|
List<Pair<Long, Double>> rovList = new ArrayList<>();
|
|
|
List<Pair<Long, Double>> rosList = new ArrayList<>();
|
|
@@ -50,7 +65,7 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
|
|
|
|
|
|
Map<String, Double> scoreMap = video.getScoresMap();
|
|
|
rovList.add(Pair.create(vid, scoreMap.getOrDefault("fmRov", 0d)));
|
|
|
- rosList.add(Pair.create(vid, scoreMap.getOrDefault("hasReturnRovScore", 0d)));
|
|
|
+ rosList.add(Pair.create(vid, scoreMap.getOrDefault(rosScoreKey, 0d)));
|
|
|
}
|
|
|
rovList.sort(Comparator.comparingDouble(o -> -o.getSecond()));
|
|
|
rosList.sort(Comparator.comparingDouble(o -> -o.getSecond()));
|
|
@@ -69,6 +84,9 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
|
|
|
int rosIndex = 0;
|
|
|
boolean flag = firstRovFlag;
|
|
|
for (int i = keepTopN; i < videos.size(); i++) {
|
|
|
+ if (useRandFlag) {
|
|
|
+ flag = MathUtil.nextDouble(0, 1) < rovRandRate;
|
|
|
+ }
|
|
|
if (flag) {
|
|
|
rovIndex = fillVideo(rovIndex, rovList, videoMap, hit, result);
|
|
|
} else {
|