Jelajahi Sumber

feat:对二级品类降权

zhaohaipeng 3 minggu lalu
induk
melakukan
66189e5cb8

+ 4 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/Video.java

@@ -2,10 +2,7 @@ package com.tzld.piaoquan.recommend.server.model;
 
 import lombok.Data;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @author dyp
@@ -29,6 +26,9 @@ public class Video {
     // video的特征 tag
     private List<String> tags = new ArrayList<>();
 
+    // 视频的品类
+    private Set<String> mergeCateList = new HashSet<>();
+
     // video的模型打分
     public double scoreRos = 0.0D;
     public double scoreStr = 0.0D;

+ 47 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/extractor/RankExtractorForPostProcessor.java

@@ -0,0 +1,47 @@
+package com.tzld.piaoquan.recommend.server.service.rank.extractor;
+
+import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.FeatureService;
+import com.tzld.piaoquan.recommend.server.service.ServiceBeanFactory;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class RankExtractorForPostProcessor {
+
+    public static void fullMergeCate2FromFeature(List<Video> rovList, List<Video> flowVideos) {
+
+        FeatureService featureService = ServiceBeanFactory.getBean(FeatureService.class);
+
+        List<String> vidStrList = new ArrayList<>(rovList.size() + flowVideos.size());
+        rovList.stream().map(v -> String.valueOf(v.getVideoId())).forEach(vidStrList::add);
+        flowVideos.stream().map(v -> String.valueOf(v.getVideoId())).forEach(vidStrList::add);
+
+        Map<String, Map<String, Map<String, String>>> featureMap = featureService.getVideoBaseInfo("", vidStrList);
+
+        parseAndSetMergeCate2(rovList, featureMap);
+        parseAndSetMergeCate2(flowVideos, featureMap);
+    }
+
+    private static void parseAndSetMergeCate2(List<Video> videos, Map<String, Map<String, Map<String, String>>> featureMap) {
+        for (Video video : videos) {
+            String vidStr = String.valueOf(video.getVideoId());
+            if (!featureMap.containsKey(vidStr)) {
+                continue;
+            }
+
+            Map<String, Map<String, String>> vidFeature = featureMap.get(vidStr);
+            if (!vidFeature.containsKey("alg_vid_feature_basic_info")) {
+                continue;
+            }
+
+            Map<String, String> basicInfoMap = vidFeature.get("alg_vid_feature_basic_info");
+            String mergeCate2 = basicInfoMap.getOrDefault("merge_second_level_cate", "");
+            if (StringUtils.isNotBlank(mergeCate2)) {
+                video.getMergeCateList().add(mergeCate2);
+            }
+        }
+    }
+}

+ 99 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/processor/RankMergeCate2PostProcessor.java

@@ -0,0 +1,99 @@
+package com.tzld.piaoquan.recommend.server.service.rank.processor;
+
+import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
+import com.tzld.piaoquan.recommend.server.util.DateUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+public class RankMergeCate2PostProcessor {
+
+    public static void mergeCate2PostProcessor(RankParam param, List<Video> rovList, Map<String, Map<String, String>> rulesMap) {
+        if (CollectionUtils.isEmpty(rovList) || MapUtils.isEmpty(rulesMap)) {
+            return;
+        }
+
+        // 解析配置,判断当前是否需要对品类进行降权
+        String mergeCate2 = null;
+        double reduceCoefficient = 1d;
+        for (Map.Entry<String, Map<String, String>> entry : rulesMap.entrySet()) {
+            Map<String, String> configMap = entry.getValue();
+            boolean currentHourIsNeedReduce = currentHourIsNeedReduce(configMap);
+            boolean currentDateIsNeedReduce = currentDateIsNeedReduce(configMap);
+            if (currentHourIsNeedReduce || currentDateIsNeedReduce) {
+                mergeCate2 = entry.getKey();
+                reduceCoefficient = Double.parseDouble(configMap.getOrDefault("reduce_coefficient", "1"));
+                break;
+            }
+        }
+
+        if (StringUtils.isEmpty(mergeCate2)) {
+            return;
+        }
+
+        for (Video video : rovList) {
+            if (CollectionUtils.isEmpty(video.getMergeCateList())) {
+                continue;
+            }
+
+            if (!video.getMergeCateList().contains(mergeCate2)) {
+                continue;
+            }
+            double sortScore = video.getSortScore();
+            double newScore = sortScore * reduceCoefficient;
+
+            video.setSortScore(newScore);
+            video.setScore(newScore);
+            if (MapUtils.isNotEmpty(video.getScoresMap())) {
+                video.getScoresMap().put("originSortScore", sortScore);
+                video.getScoresMap().put("reduceCoefficient", reduceCoefficient);
+            }
+        }
+
+        // 根据分数重新排序
+        rovList.sort((o1, o2) -> Double.compare(o2.getSortScore(), o1.getSortScore()));
+
+    }
+
+    /**
+     * 当前小时是否需要降权
+     */
+    private static boolean currentHourIsNeedReduce(Map<String, String> configMap) {
+        if (!configMap.containsKey("reduce_hour")) {
+            return false;
+        }
+
+        String currentHourStr = String.valueOf(LocalDateTime.now().getHour());
+        String[] split = configMap.get("reduce_hour").split(",");
+        for (String s : split) {
+            if (StringUtils.equals(s, currentHourStr)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * 当前时间段是否需要降权
+     */
+    private static boolean currentDateIsNeedReduce(Map<String, String> configMap) {
+        if (!configMap.containsKey("reduce_date")) {
+            return false;
+        }
+
+        String[] reduceDates = configMap.get("reduce_date").split(",");
+        for (String s : reduceDates) {
+            if (DateUtils.ifTimeRangeInNow(s)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}

+ 8 - 5
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelBasic.java

@@ -8,12 +8,9 @@ import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
 import com.tzld.piaoquan.recommend.server.service.rank.RankResult;
 import com.tzld.piaoquan.recommend.server.service.rank.RankService;
 import com.tzld.piaoquan.recommend.server.service.rank.extractor.ExtractorUtils;
+import com.tzld.piaoquan.recommend.server.service.rank.extractor.RankExtractorForPostProcessor;
 import com.tzld.piaoquan.recommend.server.service.rank.extractor.RankExtractorItemTags;
-import com.tzld.piaoquan.recommend.server.service.rank.processor.RankProcessorBoost;
-import com.tzld.piaoquan.recommend.server.service.rank.processor.RankProcessorDensity;
-import com.tzld.piaoquan.recommend.server.service.rank.processor.RankProcessorInsert;
-import com.tzld.piaoquan.recommend.server.service.rank.processor.RankProcessorTagFilter;
-import com.tzld.piaoquan.recommend.server.util.CommonCollectionUtils;
+import com.tzld.piaoquan.recommend.server.service.rank.processor.*;
 import com.tzld.piaoquan.recommend.server.util.JSONUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
@@ -79,6 +76,9 @@ public abstract class RankStrategy4RegionMergeModelBasic extends RankService {
         if (rulesMap != null && !rulesMap.isEmpty()) {
             RankExtractorItemTags extractorItemTags = new RankExtractorItemTags(this.redisTemplate);
             extractorItemTags.processor(rovVideos, flowVideos);
+
+            RankExtractorForPostProcessor.fullMergeCate2FromFeature(rovVideos, flowVideos);
+
         }
         // 6 合并结果时间卡控
         if (rulesMap != null && !rulesMap.isEmpty()) {
@@ -91,6 +91,9 @@ public abstract class RankStrategy4RegionMergeModelBasic extends RankService {
         // 5 rov池强插功能
         RankProcessorInsert.insertByTag(param, rovVideos, rulesMap);
 
+        // 品类降权功能
+        RankMergeCate2PostProcessor.mergeCate2PostProcessor(param, rovVideos, rulesMap);
+
         // 7 流量池按比例强插
         List<Video> result = new ArrayList<>();
         for (int i = 0; i < param.getTopK() && i < rovVideos.size(); i++) {