|
@@ -12,6 +12,7 @@ import com.tzld.piaoquan.recommend.server.service.score.ScorerUtils;
|
|
|
import com.tzld.piaoquan.recommend.server.util.CommonCollectionUtils;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.collections4.MapUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
import org.apache.commons.math3.util.Pair;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
@@ -78,6 +79,15 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
|
|
|
rovRecallRank.addAll(sceneCFRosn);
|
|
|
setVideo.addAll(sceneCFRosn.stream().map(Video::getVideoId).collect(Collectors.toSet()));
|
|
|
|
|
|
+ //-------------------head cate2 of rovn------------------
|
|
|
+ List<Video> headCate2Rov = extractAndSort(param, HeadCate2RovRecallStrategy.PUSH_FROM);
|
|
|
+ // 视频去重
|
|
|
+ removeDuplicate(headCate2Rov);
|
|
|
+ headCate2Rov = headCate2Rov.stream().filter(o -> !setVideo.contains(o.getVideoId())).collect(Collectors.toList());
|
|
|
+ headCate2Rov = headCate2Rov.subList(0, Math.min(mergeWeight.getOrDefault("headCate2Rov", 5.0).intValue(), headCate2Rov.size()));
|
|
|
+ rovRecallRank.addAll(headCate2Rov);
|
|
|
+ setVideo.addAll(headCate2Rov.stream().map(Video::getVideoId).collect(Collectors.toSet()));
|
|
|
+
|
|
|
//-------------------排-------------------
|
|
|
//-------------------序-------------------
|
|
|
//-------------------逻-------------------
|
|
@@ -318,62 +328,39 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
|
|
|
// 5 排序公式特征
|
|
|
Map<String, Map<String, String>> vid2MapFeature = this.getVideoRedisFeature(vids, "redis:vid_hasreturn_vor:");
|
|
|
|
|
|
- // Ros增强传播因子
|
|
|
- Map<String, Map<String, String>> rosSpreadDivMap = this.getVideoRedisFeature(vids, "vid_for_spread:");
|
|
|
-
|
|
|
- List<Video> result = new ArrayList<>();
|
|
|
-
|
|
|
- double calcVorMode = mergeWeight.getOrDefault("calcVorMode", 3d);
|
|
|
- double calcRosMode = mergeWeight.getOrDefault("calcRosMode", 0d);
|
|
|
- double calcStrMode = mergeWeight.getOrDefault("calcStrMode", 3d);
|
|
|
-
|
|
|
- double rosAdd = mergeWeight.getOrDefault("ros_add", 0.1d);
|
|
|
- double ros2Multi = mergeWeight.getOrDefault("ros2_multi", 1d);
|
|
|
- double vorAdd = mergeWeight.getOrDefault("vor_add", 0d);
|
|
|
+ // 获取权重
|
|
|
+ Map<String, Double> cate2Coefficient = new HashMap<>();
|
|
|
+ double cate2CoefficientFunc = mergeWeight.getOrDefault("cate2CoefficientFunc", 0d);
|
|
|
+ if (cate2CoefficientFunc == 1d) {
|
|
|
+ String headVidStr = String.valueOf(param.getHeadVid());
|
|
|
+ String mergeCate2 = this.findVideoMergeCate2(featureOriginVideo, headVidStr);
|
|
|
+ Double length = mergeWeight.getOrDefault("cate2CoefficientLength", 10000d);
|
|
|
+ Map<String, Double> simCateScore = this.findSimCateScore(mergeCate2, length.intValue());
|
|
|
+ cate2Coefficient.putAll(simCateScore);
|
|
|
+ }
|
|
|
|
|
|
- double rosSpreadDivisorIndex = mergeWeight.getOrDefault("rosSpreadDivisorIndex", 2d);
|
|
|
- String spreadDivisorKey = this.indexCoverKey(rosSpreadDivisorIndex);
|
|
|
- log.info("567 spreadDivisorKey is: {}", spreadDivisorKey);
|
|
|
+ Double cate2CoefficientDenominator = mergeWeight.getOrDefault("cate2CoefficientDenominator", 1d);
|
|
|
|
|
|
+ List<Video> result = new ArrayList<>();
|
|
|
for (RankItem item : items) {
|
|
|
double score;
|
|
|
double fmRovOrigin = item.getScoreRov();
|
|
|
item.getScoresMap().put("fmRovOrigin", fmRovOrigin);
|
|
|
- double str = restoreScore(fmRovOrigin);
|
|
|
- item.getScoresMap().put("originStr", str);
|
|
|
- str = this.handleStr(str, calcStrMode, item, mergeWeight);
|
|
|
- item.getScoresMap().put("xgbRovNegRate", 0.9d);
|
|
|
- item.getScoresMap().put("fmRov", str);
|
|
|
- item.getScoresMap().put("str", str);
|
|
|
- item.getScoresMap().put("calcStrMode", calcStrMode);
|
|
|
-
|
|
|
- double originRos = Double.parseDouble(vid2MapFeature.getOrDefault(item.getVideoId() + "", new HashMap<>()).getOrDefault("rov", "0"));
|
|
|
- double ros = this.handleRos(originRos, calcRosMode, item, mergeWeight);
|
|
|
- item.getScoresMap().put("hasReturnRovScore", ros);
|
|
|
- item.getScoresMap().put("ros", ros);
|
|
|
- item.getScoresMap().put("originRos", originRos);
|
|
|
- item.getScoresMap().put("calcRosMode", calcRosMode);
|
|
|
-
|
|
|
- String spreadDivStr = rosSpreadDivMap.getOrDefault(String.valueOf(item.getVideoId()), new HashMap<>()).getOrDefault(spreadDivisorKey, "0");
|
|
|
- double rosSpreadDiv = Double.parseDouble(spreadDivStr);
|
|
|
- item.getScoresMap().put("rosSpreadDiv", rosSpreadDiv);
|
|
|
-
|
|
|
- double originVor = Double.parseDouble(vid2MapFeature.getOrDefault(item.getVideoId() + "", new HashMap<>()).getOrDefault("vor", "0"));
|
|
|
- double vor = this.handleVor(originVor, calcVorMode, item, mergeWeight);
|
|
|
- item.getScoresMap().put("originVor", originVor);
|
|
|
+ double fmRov = restoreScore(fmRovOrigin);
|
|
|
+ item.getScoresMap().put("fmRov", fmRov);
|
|
|
+ double hasReturnRovScore = Double.parseDouble(vid2MapFeature.getOrDefault(item.getVideoId() + "", new HashMap<>()).getOrDefault("rov", "0"));
|
|
|
+ item.getScoresMap().put("hasReturnRovScore", hasReturnRovScore);
|
|
|
+ double vor = Double.parseDouble(vid2MapFeature.getOrDefault(item.getVideoId() + "", new HashMap<>()).getOrDefault("vor", "0"));
|
|
|
item.getScoresMap().put("vor", vor);
|
|
|
- item.getScoresMap().put("calcVorMode", calcVorMode);
|
|
|
|
|
|
+ String vidMergeCate2 = this.findVideoMergeCate2(featureOriginVideo, String.valueOf(item.getVideoId()));
|
|
|
+ Double scoreCoefficient = cate2Coefficient.getOrDefault(vidMergeCate2, 0d);
|
|
|
+ item.getScoresMap().put("scoreCoefficient", scoreCoefficient);
|
|
|
+ item.getScoresMap().put("cate2CoefficientDenominator", cate2CoefficientDenominator);
|
|
|
|
|
|
- item.getScoresMap().put("rosAdd", rosAdd);
|
|
|
- item.getScoresMap().put("vorAdd", vorAdd);
|
|
|
- item.getScoresMap().put("ros2Multi", ros2Multi);
|
|
|
- item.getScoresMap().put("rosSpreadDivisorIndex", rosSpreadDivisorIndex);
|
|
|
- score = str * (rosAdd + ros + ros2Multi * rosSpreadDiv) * (vorAdd + vor);
|
|
|
+ score = fmRov * (0.1 + hasReturnRovScore) * (0.1 + vor) * (1 + scoreCoefficient / cate2CoefficientDenominator);
|
|
|
|
|
|
Video video = item.getVideo();
|
|
|
- video.setScoreStr(str);
|
|
|
- video.setScoreRos(rosAdd + ros + ros2Multi * rosSpreadDiv);
|
|
|
video.setScore(score);
|
|
|
video.setSortScore(score);
|
|
|
video.setScoresMap(item.getScoresMap());
|
|
@@ -390,17 +377,47 @@ public class RankStrategy4RegionMergeModelV567 extends RankStrategy4RegionMergeM
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- private String indexCoverKey(double index) {
|
|
|
- switch (String.valueOf(index)) {
|
|
|
- case "1":
|
|
|
- return "head_video_rov1";
|
|
|
- case "3":
|
|
|
- return "head_video_recommend_rovn";
|
|
|
- case "4":
|
|
|
- return "head_video_recommend_fission_rate";
|
|
|
- default:
|
|
|
- return "recommend_123_depth_fission_rate";
|
|
|
+ private Map<String, Double> findSimCateScore(String headCate2, int length) {
|
|
|
+ if (StringUtils.isBlank(headCate2)) {
|
|
|
+ return new HashMap<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ String redisKey = String.format("alg_recsys_good_cate_pair_list:%s", headCate2);
|
|
|
+ String cate2Value = redisTemplate.opsForValue().get(redisKey);
|
|
|
+ if (StringUtils.isEmpty(cate2Value)) {
|
|
|
+ return new HashMap<>();
|
|
|
}
|
|
|
+
|
|
|
+ return this.parsePair(cate2Value, length);
|
|
|
}
|
|
|
|
|
|
-}
|
|
|
+ private Map<String, Double> parsePair(String value, int length) {
|
|
|
+ if (StringUtils.isBlank(value)) {
|
|
|
+ return new HashMap<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ String[] split = value.split("\t");
|
|
|
+ if (split.length != 2) {
|
|
|
+ return new HashMap<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ String[] valueList = split[0].trim().split(",");
|
|
|
+ String[] scoreList = split[1].trim().split(",");
|
|
|
+ if (valueList.length != scoreList.length) {
|
|
|
+ return new HashMap<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ int minLength = Math.min(length, valueList.length);
|
|
|
+ Map<String, Double> resultMap = new HashMap<>();
|
|
|
+ for (int i = 0; i < minLength; i++) {
|
|
|
+ resultMap.put(valueList[i].trim(), Double.parseDouble(scoreList[i].trim()));
|
|
|
+ }
|
|
|
+
|
|
|
+ return resultMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String findVideoMergeCate2(Map<String, Map<String, Map<String, String>>> featureOriginVideo, String vid) {
|
|
|
+ Map<String, String> videoInfo = featureOriginVideo.getOrDefault(vid, new HashMap<>()).getOrDefault("alg_vid_feature_basic_info", new HashMap<>());
|
|
|
+ return videoInfo.get("merge_second_level_cate");
|
|
|
+ }
|
|
|
+}
|