|
@@ -2,6 +2,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.FeatureService;
|
|
|
import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -21,6 +22,9 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
|
|
|
@Autowired
|
|
|
private RankStrategy4RegionMergeModelV563 modelV563Service;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private FeatureService featureService;
|
|
|
+
|
|
|
@Override
|
|
|
public List<Video> mergeAndRankRovRecall(RankParam param) {
|
|
|
Map<String, Double> mergeWeight = this.mergeWeight != null ? this.mergeWeight : new HashMap<>(0);
|
|
@@ -31,10 +35,14 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
|
|
|
Integer versionCode = param.getVersionCode();
|
|
|
int orderVersionCode = mergeWeight.getOrDefault("orderVersionCode", 1500D).intValue();
|
|
|
if (null != versionCode && versionCode == orderVersionCode) {
|
|
|
- int keepTopN = mergeWeight.getOrDefault("keepTopN", 1D).intValue();
|
|
|
- int secondN = mergeWeight.getOrDefault("secondN", 4D).intValue();
|
|
|
- boolean secondFirstFlag = mergeWeight.getOrDefault("secondFirstFlag", 1D).intValue() > 0;
|
|
|
- return resort(keepTopN, secondN, secondFirstFlag, result);
|
|
|
+ int minBid = mergeWeight.getOrDefault("minBid", 39D).intValue();
|
|
|
+ int keepPageNum = mergeWeight.getOrDefault("keepPageNum", 1D).intValue();
|
|
|
+ if (highlyActiveUser(param.getMid(), minBid)) {
|
|
|
+ int group1Size = mergeWeight.getOrDefault("group1Size", 4D).intValue();
|
|
|
+ int group2Size = mergeWeight.getOrDefault("group2Size", 8D).intValue();
|
|
|
+ int group3Size = mergeWeight.getOrDefault("group3Size", 0D).intValue();
|
|
|
+ return resort(group1Size, group2Size, group3Size, result);
|
|
|
+ }
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
log.error("diversity resort error", e);
|
|
@@ -43,41 +51,65 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- private List<Video> resort(int keepTopN, int secondN, boolean secondFirstFlag, List<Video> videos) {
|
|
|
+ private List<Video> resort(int group1Size, int group2Size, int group3Size, List<Video> videos) {
|
|
|
// split
|
|
|
- List<Video> result = new ArrayList<>();
|
|
|
- List<Video> list2nd = new ArrayList<>();
|
|
|
- List<Video> list3rd = new ArrayList<>();
|
|
|
+ List<Video> group1 = new ArrayList<>();
|
|
|
+ List<Video> group2 = new ArrayList<>();
|
|
|
+ List<Video> group3 = new ArrayList<>();
|
|
|
+ List<Video> group4 = 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));
|
|
|
+ if (i < group1Size) {
|
|
|
+ group1.add(videos.get(i));
|
|
|
+ } else if (i < group2Size) {
|
|
|
+ group2.add(videos.get(i));
|
|
|
+ } else if (i < group3Size) {
|
|
|
+ group3.add(videos.get(i));
|
|
|
} else {
|
|
|
- list3rd.add(videos.get(i));
|
|
|
+ group4.add(videos.get(i));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// merge
|
|
|
- if (secondFirstFlag) {
|
|
|
- fillVideo(list2nd, list3rd, result);
|
|
|
- } else {
|
|
|
- fillVideo(list3rd, list2nd, result);
|
|
|
- }
|
|
|
+ List<List<Video>> groupList = new ArrayList<>();
|
|
|
+ groupList.add(group1);
|
|
|
+ groupList.add(group2);
|
|
|
+ groupList.add(group3);
|
|
|
+ List<Video> result = fillVideo(groupList);
|
|
|
+ result.addAll(group4);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- 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));
|
|
|
+ private List<Video> fillVideo(List<List<Video>> groupList) {
|
|
|
+ List<Video> result = new ArrayList<>();
|
|
|
+ int maxSize = getMaxSize(groupList);
|
|
|
+ for (int i = 0; i < maxSize; i++) {
|
|
|
+ for (List<Video> group : groupList) {
|
|
|
+ if (null != group && i < group.size()) {
|
|
|
+ result.add(group.get(i));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- for (; index < list1.size(); index++) {
|
|
|
- result.add(list1.get(index));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private int getMaxSize(List<List<Video>> groupList) {
|
|
|
+ int maxSize = 0;
|
|
|
+ if (null != groupList) {
|
|
|
+ for (List<Video> group : groupList) {
|
|
|
+ if (null != group) {
|
|
|
+ maxSize = Math.max(maxSize, group.size());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- for (; index < list2.size(); index++) {
|
|
|
- result.add(list2.get(index));
|
|
|
+ return maxSize;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean highlyActiveUser(String mid, int minBid) {
|
|
|
+ Map<String, String> userInfo = featureService.getUserInfo("alg_recsys_feature_user_active_level", mid);
|
|
|
+ if (null != userInfo && userInfo.containsKey("bid")) {
|
|
|
+ int bid = Integer.parseInt(userInfo.get("bid"));
|
|
|
+ return bid >= minBid;
|
|
|
}
|
|
|
+ return false;
|
|
|
}
|
|
|
}
|