|
@@ -3,13 +3,14 @@ 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;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.util.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
|
|
|
@Service
|
|
|
@Slf4j
|
|
@@ -20,33 +21,20 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
|
|
|
@Autowired
|
|
|
private RankStrategy4RegionMergeModelV563 modelV563Service;
|
|
|
|
|
|
- @Autowired
|
|
|
- private RankStrategy4RegionMergeModelV567 modelV567Service;
|
|
|
-
|
|
|
@Override
|
|
|
public List<Video> mergeAndRankRovRecall(RankParam param) {
|
|
|
Map<String, Double> mergeWeight = this.mergeWeight != null ? this.mergeWeight : new HashMap<>(0);
|
|
|
|
|
|
- List<Video> result;
|
|
|
- String rosScoreKey;
|
|
|
- int baseRankId = mergeWeight.getOrDefault("baseRankId", 563D).intValue();
|
|
|
- if (567 == baseRankId) {
|
|
|
- rosScoreKey = "NorXGBScore";
|
|
|
- result = modelV567Service.mergeAndRankRovRecall(param);
|
|
|
- } else {
|
|
|
- rosScoreKey = "hasReturnRovScore";
|
|
|
- result = modelV563Service.mergeAndRankRovRecall(param);
|
|
|
- }
|
|
|
+ List<Video> 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;
|
|
|
- double rovRandRate = mergeWeight.getOrDefault("rovRandRate", 0.5);
|
|
|
- return resort(keepTopN, useRandFlag, firstRovFlag, rovRandRate, rosScoreKey, result);
|
|
|
+ int secondN = mergeWeight.getOrDefault("secondN", 4D).intValue();
|
|
|
+ boolean secondFirstFlag = mergeWeight.getOrDefault("secondFirstFlag", 1D).intValue() > 0;
|
|
|
+ return resort(keepTopN, secondN, secondFirstFlag, result);
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
log.error("diversity resort error", e);
|
|
@@ -55,60 +43,41 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- 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<>();
|
|
|
- for (Video video : videos) {
|
|
|
- long vid = video.getVideoId();
|
|
|
- videoMap.put(vid, video);
|
|
|
-
|
|
|
- Map<String, Double> scoreMap = video.getScoresMap();
|
|
|
- rovList.add(Pair.create(vid, scoreMap.getOrDefault("fmRov", 0d)));
|
|
|
- rosList.add(Pair.create(vid, scoreMap.getOrDefault(rosScoreKey, 0d)));
|
|
|
- }
|
|
|
- rovList.sort(Comparator.comparingDouble(o -> -o.getSecond()));
|
|
|
- rosList.sort(Comparator.comparingDouble(o -> -o.getSecond()));
|
|
|
-
|
|
|
- // top
|
|
|
- Set<Long> hit = new HashSet<>();
|
|
|
+ private List<Video> resort(int keepTopN, int secondN, boolean secondFirstFlag, List<Video> videos) {
|
|
|
+ // split
|
|
|
List<Video> result = new ArrayList<>();
|
|
|
- for (int i = 0; i < keepTopN && i < videos.size(); i++) {
|
|
|
- Video video = videos.get(i);
|
|
|
- hit.add(video.getVideoId());
|
|
|
- result.add(video);
|
|
|
- }
|
|
|
-
|
|
|
- // alternate
|
|
|
- int rovIndex = 0;
|
|
|
- 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);
|
|
|
+ List<Video> list2nd = new ArrayList<>();
|
|
|
+ List<Video> list3rd = new ArrayList<>();
|
|
|
+ for (int i = 0; i < videos.size(); i++) {
|
|
|
+ if (i < keepTopN) {
|
|
|
+ result.add(videos.get(i));
|
|
|
+ } else if (i < secondN) {
|
|
|
+ list2nd.add(videos.get(i));
|
|
|
} else {
|
|
|
- rosIndex = fillVideo(rosIndex, rosList, videoMap, hit, result);
|
|
|
+ list3rd.add(videos.get(i));
|
|
|
}
|
|
|
- flag = !flag;
|
|
|
+ }
|
|
|
+
|
|
|
+ // merge
|
|
|
+ if (secondFirstFlag) {
|
|
|
+ fillVideo(list2nd, list3rd, result);
|
|
|
+ } else {
|
|
|
+ fillVideo(list3rd, list2nd, result);
|
|
|
}
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- private int fillVideo(int start, List<Pair<Long, Double>> list, Map<Long, Video> videoMap, Set<Long> hit, List<Video> result) {
|
|
|
- for (int i = start; i < list.size(); i++) {
|
|
|
- start++;
|
|
|
- Pair<Long, Double> pair = list.get(i);
|
|
|
- long vid = pair.getFirst();
|
|
|
- if (!hit.contains(vid)) {
|
|
|
- Video video = videoMap.get(vid);
|
|
|
- hit.add(vid);
|
|
|
- result.add(video);
|
|
|
- break;
|
|
|
- }
|
|
|
+ private void fillVideo(List<Video> list1, List<Video> list2, List<Video> result) {
|
|
|
+ int index = 0;
|
|
|
+ for (; index < list1.size() && index < list2.size(); index++) {
|
|
|
+ result.add(list1.get(index));
|
|
|
+ result.add(list2.get(index));
|
|
|
+ }
|
|
|
+ for (; index < list1.size(); index++) {
|
|
|
+ result.add(list1.get(index));
|
|
|
+ }
|
|
|
+ for (; index < list2.size(); index++) {
|
|
|
+ result.add(list2.get(index));
|
|
|
}
|
|
|
- return start;
|
|
|
}
|
|
|
}
|