Explorar o código

feat:添加定向打分融合

zhaohaipeng hai 10 meses
pai
achega
d4a5af959b

+ 31 - 24
ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/AdRecommendController.java

@@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 
 @RestController
 @RequestMapping("/recommend")
@@ -26,48 +27,54 @@ public class AdRecommendController {
     RankService rankService;
 
     @RequestMapping("/top1/basic")
-    public Map<String,Object> adRecommendTop1Basic(@RequestBody RankRecommendRequestParam request){
+    public Map<String, Object> adRecommendTop1Basic(@RequestBody RankRecommendRequestParam request) {
         AdRankItem rankResult = rankService.adItemRank(request);
-        Map<String, Object> map =new HashMap<>();
-        map.put("code","0");
-        map.put("msg","success");
-        Map<String, Object> contentMap=new HashMap<>();
-        contentMap.put("adId", rankResult.getAdId());
-        contentMap.put("adScore", rankResult.getScore());
-        map.put("content",contentMap);
+        Map<String, Object> map = new HashMap<>();
+
+        if (Objects.isNull(rankResult)) {
+            map.put("code", "500");
+            map.put("msg", "score error");
+        } else {
+            map.put("code", "0");
+            map.put("msg", "success");
+            Map<String, Object> contentMap = new HashMap<>();
+            contentMap.put("adId", rankResult.getAdId());
+            contentMap.put("adScore", rankResult.getScore());
+            map.put("content", contentMap);
+        }
         return map;
     }
 
     @RequestMapping("/top1/video/ad/thompson")
-    public Map<String,Object> adRecommendTop1VideoAdThompson(@RequestBody RankRecommendRequestParam request){
+    public Map<String, Object> adRecommendTop1VideoAdThompson(@RequestBody RankRecommendRequestParam request) {
         AdRankItem rankResult = rankService.adItemRankWithVideoAdThompson(request);
-        HashMap map =new HashMap();
-        map.put("code","0");
-        map.put("msg","success");
-        HashMap contentMap=new HashMap<>();
+        HashMap map = new HashMap();
+        map.put("code", "0");
+        map.put("msg", "success");
+        HashMap contentMap = new HashMap<>();
         contentMap.put("adId", rankResult.getAdId());
         contentMap.put("adScore", rankResult.getScore());
-        map.put("content",contentMap);
+        map.put("content", contentMap);
         return map;
     }
 
     @RequestMapping("/top1/bid/basic")
-    public Map<String,Object> adRecommendTop1BidBasic(@RequestBody BidRankRecommendRequestParam request){
+    public Map<String, Object> adRecommendTop1BidBasic(@RequestBody BidRankRecommendRequestParam request) {
         AdPlatformCreativeDTO rankResult = rankService.adBidRank(request);
-        HashMap map =new HashMap();
-        map.put("code","0");
-        map.put("msg","success");
-        map.put("content",rankResult);
+        HashMap map = new HashMap();
+        map.put("code", "0");
+        map.put("msg", "success");
+        map.put("content", rankResult);
         return map;
     }
 
     @RequestMapping("/top1/bid/new/pid")
-    public Map<String,Object> adRecommendTop1BidNewPid(@RequestBody BidRankRecommendRequestParam request){
+    public Map<String, Object> adRecommendTop1BidNewPid(@RequestBody BidRankRecommendRequestParam request) {
         AdPlatformCreativeDTO rankResult = rankService.adBidRankNewPid(request);
-        HashMap map =new HashMap();
-        map.put("code","0");
-        map.put("msg","success");
-        map.put("content",rankResult);
+        HashMap map = new HashMap();
+        map.put("code", "0");
+        map.put("msg", "success");
+        map.put("content", rankResult);
         return map;
     }
 

+ 3 - 1
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/RankService680.java

@@ -113,10 +113,12 @@ public class RankService680 {
         List<AdRankItem> results =new ArrayList<>(items.size());
         for (AdRankItem item : items) {
             AdRankItem result = new AdRankItem();
-            result.setAdId(item.adId);
+            result.setAdId(item.getAdId());
             result.setCreativeCode(item.getCreativeCode());
             result.setAdVerId(item.getAdVerId());
             result.setVideoId(item.getVideoId());
+            result.setLrScore(item.getLrScore());
+            result.setScore(item.getLrScore());
             result.getFeatureMap().put("lrModelFeature", JSON.toJSONString(item.getFeatureMap()));
             result.getFeatureMap().put("userFeature", JSON.toJSONString(userFeatureMap));
 

+ 20 - 4
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/convert/RequestConvert.java

@@ -1,30 +1,34 @@
 package com.tzld.piaoquan.ad.engine.service.score.convert;
 
 import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
+import com.tzld.piaoquan.ad.engine.service.score.dto.AdPlatformCreativeDTO;
 import com.tzld.piaoquan.ad.engine.service.score.param.RecommendRequestParam;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRequestContext;
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
 
 public class RequestConvert {
 
-    public static ScoreParam requestConvert(RecommendRequestParam request){
-        AdRequestContext context=new AdRequestContext();
+    public static ScoreParam requestConvert(RecommendRequestParam request) {
+        AdRequestContext context = new AdRequestContext();
         context.setApptype(request.getAppType().toString());
         context.setMachineinfoBrand(request.getMachineInfo().getBrand());
         context.setMachineinfoModel(request.getMachineInfo().getModel());
         context.setMachineinfoSdkversion(request.getMachineInfo().getSdkVersion());
         context.setMachineinfoWchatversion(request.getMachineInfo().getWeChatVersion());
 
-        LocalDateTime date=LocalDateTime.now();
+        LocalDateTime date = LocalDateTime.now();
         context.setHour(String.valueOf(date.getHour()));
         context.setDay(date.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
         context.setWeek(String.valueOf(date.getDayOfWeek().getValue()));
         context.setRegion(request.getRegion().replace("省", ""));
         context.setCity(request.getCity().replace("市", ""));
 
-        ScoreParam scoreParam=new ScoreParam();
+        ScoreParam scoreParam = new ScoreParam();
         scoreParam.setAdAbGroup(request.getAdAbGroup());
         scoreParam.setRequestContext(context);
         scoreParam.setVideoId(request.getVideoId());
@@ -34,4 +38,16 @@ public class RequestConvert {
         return scoreParam;
     }
 
+    public static List<AdRankItem> adIdConvertRankItem(List<AdPlatformCreativeDTO> creativeDTOList, RecommendRequestParam request) {
+        List<AdRankItem> adRankItems = new ArrayList<>(creativeDTOList.size());
+        for (AdPlatformCreativeDTO dto : creativeDTOList) {
+            AdRankItem adRankItem = new AdRankItem();
+            adRankItem.setAdId(dto.getCreativeId());
+            adRankItem.setCreativeCode(dto.getCreativeCode());
+            adRankItem.setAdVerId(dto.getAdVerId());
+            adRankItem.setVideoId(request.getVideoId());
+            adRankItem.setWeight(dto.getWeight());
+        }
+        return adRankItems;
+    }
 }

+ 2 - 2
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/dto/AdDirectionScore.java

@@ -3,7 +3,7 @@ package com.tzld.piaoquan.ad.engine.service.score.dto;
 import lombok.Builder;
 import lombok.Data;
 
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.Map;
 
 @Data
 @Builder
@@ -12,6 +12,6 @@ public class AdDirectionScore {
     private Double exponent;
 
 
-    private ConcurrentHashMap<String, Double> scoreDetail;
+    private Map<String, String> scoreDetail;
 
 }

+ 19 - 13
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java

@@ -58,7 +58,7 @@ public class RankServiceImpl implements RankService {
     @Autowired
     private RankService680 fmRankService;
     @Autowired
-    private TacticsAndFmModelScoreRankService tacticsAndFmModelScoreRankService;
+    private TacticsAndLRModelScoreRankService tacticsAndFmModelScoreRankService;
 
     @Value("${ad.model.cpm.max:200}")
     Double cpmMax = 200d;
@@ -76,30 +76,36 @@ public class RankServiceImpl implements RankService {
     private String tacticsAndFmModelScoreExpCode;
 
     public AdRankItem adItemRank(RankRecommendRequestParam requestParam) {
-
-        ScoreParam scoreParam = RequestConvert.requestConvert(requestParam);
-
         Set<String> expCodeSet = AbUtil.unfoldAllExpCode(requestParam.getAdAbExpArr());
         Long appType = requestParam.getAppType();
         Integer newExpGroup = requestParam.getNewExpGroup();
-        List<AdRankItem> adRankItems;
-        String abCode = "";
-        String scoreStrategy = "";
         if (AbUtil.isInAbExp(expCodeSet, appType, newExpGroup, fmModelScoreExpCode)) {
-            adRankItems = fmRankService.adItemRank(requestParam, scoreParam);
-            abCode = "680";
-            scoreStrategy = "lr_model";
+            return rankBy680(requestParam);
         } else if (AbUtil.isInAbExp(expCodeSet, appType, newExpGroup, tacticsAndFmModelScoreExpCode)) {
-            return tacticsAndFmModelScoreRankService.adItemRank(requestParam).get(0);
+            return rankBy679(requestParam);
         } else {
             return adItemRankOld(requestParam);
         }
+    }
 
-        logHubService.scoreLogUpload(scoreParam, requestParam.getAdIdList(), adRankItems, requestParam, scoreStrategy, abCode);
-
+    private AdRankItem rankBy680(RankRecommendRequestParam request) {
+        ScoreParam scoreParam = RequestConvert.requestConvert(request);
+        List<AdRankItem> adRankItems = fmRankService.adItemRank(request, scoreParam);
+        logHubService.scoreLogUpload(scoreParam, request.getAdIdList(), adRankItems, request, "LRModelScore", "680");
         return adRankItems.get(0);
     }
 
+    private AdRankItem rankBy679(RankRecommendRequestParam requestParam) {
+        ScoreParam scoreParam = RequestConvert.requestConvert(requestParam);
+        List<AdRankItem> adRankItems = tacticsAndFmModelScoreRankService.adItemRank(requestParam, scoreParam);
+        logHubService.scoreLogUpload(scoreParam, requestParam.getAdIdList(), adRankItems, requestParam, "directionAndLRModelScore", "679");
+        double score = adRankItems.get(0).getScore();
+        if (score > 0) {
+            return adRankItems.get(0);
+        }
+        return null;
+    }
+
     public AdRankItem adItemRankOld(RankRecommendRequestParam request) {
         ScoreParam param = RequestConvert.requestConvert(request);
 

+ 0 - 17
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/TacticsAndFmModelScoreRankService.java

@@ -1,17 +0,0 @@
-package com.tzld.piaoquan.ad.engine.service.score.impl;
-
-import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendRequestParam;
-import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Slf4j
-@Service
-public class TacticsAndFmModelScoreRankService {
-
-    public List<AdRankItem> adItemRank(RankRecommendRequestParam requestParam) {
-        return null;
-    }
-}

+ 85 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/TacticsAndLRModelScoreRankService.java

@@ -0,0 +1,85 @@
+package com.tzld.piaoquan.ad.engine.service.score.impl;
+
+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
+import com.tzld.piaoquan.ad.engine.service.score.RankService680;
+import com.tzld.piaoquan.ad.engine.service.score.dto.AdDirectionScore;
+import com.tzld.piaoquan.ad.engine.service.score.dto.AdPlatformCreativeDTO;
+import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendRequestParam;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class TacticsAndLRModelScoreRankService {
+
+    @Autowired
+    private RankService680 rankService680;
+
+    public List<AdRankItem> adItemRank(RankRecommendRequestParam requestParam, ScoreParam scoreParam) {
+
+        // LR模型打分结果
+        List<AdRankItem> adRankItems = rankService680.adItemRank(requestParam, scoreParam);
+
+        Map<Long, AdDirectionScore> adDirectionScoreMap = requestParam.getAdIdList().stream()
+                .collect(Collectors.toMap(AdPlatformCreativeDTO::getCreativeId, AdPlatformCreativeDTO::getAdDirectionScore));
+        List<AdRankItem> result = new ArrayList<>();
+
+        for (AdRankItem adRankItem : adRankItems) {
+            AdRankItem item = new AdRankItem();
+            item.setAdId(adRankItem.getAdId());
+            item.setCreativeCode(adRankItem.getCreativeCode());
+            item.setAdVerId(adRankItem.getAdVerId());
+            item.setVideoId(item.getVideoId());
+            item.setLrScore(item.getLrScore());
+
+            double s1 = item.getAdDirectionScore();
+            double s2 = item.getLrScore();
+
+            item.setScore(s1 * s2);
+
+            item.getFeatureMap().putAll(adRankItem.getFeatureMap());
+            item.getMetaFeatureMap().putAll(adRankItem.getMetaFeatureMap());
+
+            result.add(item);
+        }
+
+        Collections.sort(result);
+        return result;
+    }
+
+    private double calcDirectionScore(AdRankItem adRankItem, AdDirectionScore adDirectionScore) {
+        if (Objects.isNull(adDirectionScore)) {
+            adRankItem.setAdDirectionScore(1);
+            return 1;
+        }
+        double exponent = Objects.nonNull(adDirectionScore.getExponent()) ? adDirectionScore.getExponent() : 1;
+        Map<String, String> scoreDetail = adDirectionScore.getScoreDetail();
+
+        double network = Double.parseDouble(scoreDetail.getOrDefault("network", "1"));
+        double phoneModel = Double.parseDouble(scoreDetail.getOrDefault("phoneModel", "1"));
+        double area = Double.parseDouble(scoreDetail.getOrDefault("area", "1"));
+        double peoplePackage = Double.parseDouble(scoreDetail.getOrDefault("peoplePackage", "1"));
+        double excludeConv = Double.parseDouble(scoreDetail.getOrDefault("excludeConv", "1"));
+        double excludeClick = Double.parseDouble(scoreDetail.getOrDefault("excludeClick", "1"));
+        double excludeView = Double.parseDouble(scoreDetail.getOrDefault("excludeView", "1"));
+
+        double excludeMin = Math.min(excludeConv, Math.min(excludeClick, excludeView));
+
+        double s1 = (network * phoneModel * area * peoplePackage * excludeMin);
+        double s2 = Math.pow(s1, exponent);
+
+        adRankItem.setAdDirectionScore(s2);
+
+        Map<String, String> scoreDetailMap = new HashMap<>(scoreDetail);
+        scoreDetailMap.put("exponent", String.valueOf(exponent));
+        adRankItem.getMetaFeatureMap().put("adDirectionScoreDetail", scoreDetailMap);
+
+        return 1;
+    }
+
+}