|
@@ -183,13 +183,22 @@ public class RankStrategy4RegionMergeModelV565 extends RankStrategy4RegionMergeM
|
|
|
Map<String, Double> featureMapDouble = item.featureMapDouble;
|
|
|
item.featureMap = FeatureBucketUtils.bucketFeatureV2("20250218_bucket_322.txt", featureMapDouble);
|
|
|
}
|
|
|
- // 4 排序模型计算
|
|
|
- double xgbRovNegRate = mergeWeight.getOrDefault("xgbRovNegRate", 0.05);
|
|
|
- double calcVorMode = mergeWeight.getOrDefault("calc_vor_mode", 1d);
|
|
|
|
|
|
+
|
|
|
+ // 4.1 排序模型计算 - str
|
|
|
Map<String, String> sceneFeatureMap = new HashMap<>(0);
|
|
|
List<RankItem> items = ScorerUtils.getScorerPipeline("feeds_score_config_xgb_str_20250228.conf").scoring(sceneFeatureMap, userFeatureMap, rankItems);
|
|
|
+
|
|
|
+ // 4.2 排序模型计算 - ros
|
|
|
+ this.addRosScore(rankItems, userFeatureMapDouble, sceneFeatureMap);
|
|
|
+
|
|
|
// 5 排序公式特征
|
|
|
+ double xgbRovNegRate = mergeWeight.getOrDefault("xgbRovNegRate", 0.05);
|
|
|
+ double calcVorMode = mergeWeight.getOrDefault("calcVorMode", 1d);
|
|
|
+ double calcRosMode = mergeWeight.getOrDefault("calcRosMode", 1d);
|
|
|
+ double rosAdd = mergeWeight.getOrDefault("ros_add", 0.00001);
|
|
|
+ double vorAdd = mergeWeight.getOrDefault("vor_add", 0.1);
|
|
|
+
|
|
|
Map<String, Map<String, String>> vid2MapFeature = this.getVideoRedisFeature(vids, "redis:vid_hasreturn_vor_4share:");
|
|
|
List<Video> result = new ArrayList<>();
|
|
|
for (RankItem item : items) {
|
|
@@ -202,26 +211,34 @@ public class RankStrategy4RegionMergeModelV565 extends RankStrategy4RegionMergeM
|
|
|
|
|
|
|
|
|
Map<String, String> vidFeatureMap = vid2MapFeature.getOrDefault(String.valueOf(item.getVideoId()), new HashMap<>());
|
|
|
- double ros24h = Double.parseDouble(vidFeatureMap.getOrDefault("ros_24h", "0"));
|
|
|
+
|
|
|
double vor24h = Double.parseDouble(vidFeatureMap.getOrDefault("vor_24h", "0"));
|
|
|
- if (calcVorMode == 1d) {
|
|
|
- vor24h = ExtractorUtils.calLog(vor24h);
|
|
|
- } else if (calcVorMode == 2d) {
|
|
|
- double vorCoefficient = mergeWeight.getOrDefault("vor_coefficient", 1d);
|
|
|
- vor24h = vorCoefficient * vor24h;
|
|
|
- }
|
|
|
+ double vor = this.handleVor(vor24h, calcVorMode, item, mergeWeight);
|
|
|
|
|
|
- item.getScoresMap().put("hasReturnRovScore", ros24h);
|
|
|
- item.getScoresMap().put("vor", vor24h);
|
|
|
+ item.getScoresMap().put("originVor", vor24h);
|
|
|
+ item.getScoresMap().put("vor", vor);
|
|
|
item.getScoresMap().put("calcVorMode", calcVorMode);
|
|
|
- score = fmRov * (0.1 + ros24h) * (0.1 + vor24h);
|
|
|
|
|
|
+ double originScoreRos = item.getScoreRos();
|
|
|
+ double ros = this.handleRos(originScoreRos, calcRosMode, item, mergeWeight);
|
|
|
+
|
|
|
+ item.getScoresMap().put("RosXGBScore", originScoreRos);
|
|
|
+ item.getScoresMap().put("hasReturnRovScore", ros);
|
|
|
+ item.getScoresMap().put("calcRosMode", calcRosMode);
|
|
|
+
|
|
|
+ item.getScoresMap().put("rosAdd", rosAdd);
|
|
|
+ item.getScoresMap().put("vorAdd", vorAdd);
|
|
|
+ score = fmRov * (rosAdd + ros) * (vorAdd + vor);
|
|
|
|
|
|
Video video = item.getVideo();
|
|
|
video.setScore(score);
|
|
|
video.setSortScore(score);
|
|
|
video.setScoresMap(item.getScoresMap());
|
|
|
- video.setAllFeatureMap(item.getAllFeatureMap());
|
|
|
+
|
|
|
+ Map<String, String> allFeatureMap = new HashMap<>();
|
|
|
+ item.getFeatureMapDouble().forEach((key, value) -> allFeatureMap.put(key, String.valueOf(value)));
|
|
|
+ video.setAllFeatureMap(allFeatureMap);
|
|
|
+
|
|
|
if (MapUtils.isNotEmpty(feature.getVideoFeature()) && MapUtils.isNotEmpty(feature.getVideoFeature().get(item.getVideoId() + ""))) {
|
|
|
video.getMetaFeatureMap().putAll(feature.getVideoFeature().get(item.getVideoId() + ""));
|
|
|
}
|
|
@@ -234,6 +251,10 @@ public class RankStrategy4RegionMergeModelV565 extends RankStrategy4RegionMergeM
|
|
|
if (MapUtils.isNotEmpty(feature.getUserFeature())) {
|
|
|
video.getMetaFeatureMap().putAll(feature.getUserFeature());
|
|
|
}
|
|
|
+
|
|
|
+ // 将空的特征表过滤
|
|
|
+ video.getMetaFeatureMap().entrySet().removeIf(e -> MapUtils.isEmpty(e.getValue()));
|
|
|
+
|
|
|
result.add(video);
|
|
|
}
|
|
|
result.sort(Comparator.comparingDouble(o -> -o.getSortScore()));
|
|
@@ -243,4 +264,77 @@ public class RankStrategy4RegionMergeModelV565 extends RankStrategy4RegionMergeM
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ private double handleRos(double originScoreRos, double calcRosMode, RankItem item, Map<String, Double> mergeWeight) {
|
|
|
+ if (originScoreRos == 0) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ double scoreRos = ExtractorUtils.inverseLog(originScoreRos);
|
|
|
+ if (calcRosMode == 1d) {
|
|
|
+ double rosPower = mergeWeight.getOrDefault("le_ros_power", 5d);
|
|
|
+ if (scoreRos > 1) {
|
|
|
+ rosPower = mergeWeight.getOrDefault("gt_1_ros_poewr", 1.5d);
|
|
|
+ }
|
|
|
+ item.getScoresMap().put("rosPower", rosPower);
|
|
|
+ scoreRos = Math.pow(scoreRos, rosPower);
|
|
|
+ } else if (calcRosMode == 2d) {
|
|
|
+ double modelRosCoefficient = mergeWeight.getOrDefault("model_ros_coefficient", 8d);
|
|
|
+ item.getScoresMap().put("modelRosCoefficient", modelRosCoefficient);
|
|
|
+ scoreRos = ExtractorUtils.inverseLog(originScoreRos * modelRosCoefficient);
|
|
|
+ } else if (calcRosMode == 3d) {
|
|
|
+ double rosPower = mergeWeight.getOrDefault("ros_power", 5d);
|
|
|
+ item.getScoresMap().put("rosPower", rosPower);
|
|
|
+ scoreRos = Math.pow(scoreRos, rosPower);
|
|
|
+ }
|
|
|
+
|
|
|
+ return scoreRos;
|
|
|
+ }
|
|
|
+
|
|
|
+ private double handleVor(double originVor, double calcVorMode, RankItem item, Map<String, Double> mergeWeight) {
|
|
|
+ if (originVor == 0) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ double vor = originVor;
|
|
|
+ if (calcVorMode == 1d) {
|
|
|
+ vor = ExtractorUtils.calLog(originVor);
|
|
|
+ } else if (calcVorMode == 2d) {
|
|
|
+ double vorCoefficient = mergeWeight.getOrDefault("vor_coefficient", 1d);
|
|
|
+ item.getScoresMap().put("vorCoefficient", vorCoefficient);
|
|
|
+ vor = vorCoefficient * originVor;
|
|
|
+ } else if (calcVorMode == 3d) {
|
|
|
+ double vorPower = mergeWeight.getOrDefault("vor_power", 1d);
|
|
|
+ item.getScoresMap().put("vorPower", vorPower);
|
|
|
+ vor = Math.pow(originVor, vorPower);
|
|
|
+ }
|
|
|
+
|
|
|
+ return vor;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * ros模型打分
|
|
|
+ */
|
|
|
+ private void addRosScore(List<RankItem> rankItems, Map<String, Double> userFeatureMapDouble, Map<String, String> sceneFeatureMap) {
|
|
|
+ List<RankItem> rosRankItems = new ArrayList<>(rankItems.size());
|
|
|
+ for (RankItem rankItem : rankItems) {
|
|
|
+ RankItem rosRankItem = new RankItem(rankItem.getVideo());
|
|
|
+ rosRankItem.rosFeatureMap = FeatureBucketUtils.bucketFeatureV2("20250306_ros_bucket_229.txt", rankItem.featureMapDouble);
|
|
|
+ rosRankItems.add(rosRankItem);
|
|
|
+ }
|
|
|
+ Map<String, String> userFeatureMap = FeatureBucketUtils.bucketFeatureV2("20250306_ros_bucket_229.txt", userFeatureMapDouble);
|
|
|
+ ScorerUtils.getScorerPipeline("feeds_score_config_xgb_ros_binary_20250319.conf").scoring(sceneFeatureMap, userFeatureMap, rosRankItems);
|
|
|
+
|
|
|
+ // 将ros分数补充到之前的列表中
|
|
|
+ Map<Long, RankItem> vidRosMap = new HashMap<>(rosRankItems.size());
|
|
|
+ for (RankItem rosRankItem : rosRankItems) {
|
|
|
+ vidRosMap.put(rosRankItem.getVideoId(), rosRankItem);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (RankItem rankItem : rankItems) {
|
|
|
+ if (vidRosMap.containsKey(rankItem.getVideoId())) {
|
|
|
+ RankItem rosRankItem = vidRosMap.get(rankItem.getVideoId());
|
|
|
+ rankItem.setScoreRos(rosRankItem.getScoreRos());
|
|
|
+ rankItem.getScoresMap().put("RosXGBScore", rosRankItem.getScoreRos());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|