|
@@ -0,0 +1,99 @@
|
|
|
|
+package com.tzld.piaoquan.ad.engine.service.score.scorer;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+import com.google.common.collect.Lists;
|
|
|
|
+import com.tzld.piaoquan.ad.engine.commons.score.BaseXGBoostModelScorer;
|
|
|
|
+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
|
|
|
|
+import com.tzld.piaoquan.ad.engine.commons.score.ScorerConfigInfo;
|
|
|
|
+import com.tzld.piaoquan.ad.engine.commons.score.model.PAIModel;
|
|
|
|
+import com.tzld.piaoquan.ad.engine.commons.score.model.XGBoostModel683;
|
|
|
|
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
|
|
|
|
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.UserAdFeature;
|
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
|
+import org.apache.commons.collections4.MapUtils;
|
|
|
|
+import org.apache.commons.lang.exception.ExceptionUtils;
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
|
+
|
|
|
|
+import java.util.*;
|
|
|
|
+import java.util.concurrent.*;
|
|
|
|
+
|
|
|
|
+public class PAIScorer extends BaseXGBoostModelScorer {
|
|
|
|
+
|
|
|
|
+ private final static Logger LOGGER = LoggerFactory.getLogger(PAIScorer.class);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ public PAIScorer(ScorerConfigInfo configInfo) {
|
|
|
|
+ super(configInfo);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void loadModel() {
|
|
|
|
+ doLoadModel(XGBoostModel683.class);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public List<AdRankItem> scoring(final ScoreParam param,
|
|
|
|
+ final UserAdFeature userAdFeature,
|
|
|
|
+ final List<AdRankItem> rankItems) {
|
|
|
|
+ throw new NoSuchMethodError();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public List<AdRankItem> scoring(final Map<String, String> sceneFeatureMap,
|
|
|
|
+ final Map<String, String> userFeatureMap,
|
|
|
|
+ final List<AdRankItem> rankItems) {
|
|
|
|
+ if (CollectionUtils.isEmpty(rankItems)) {
|
|
|
|
+ return rankItems;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ long startTime = System.currentTimeMillis();
|
|
|
|
+
|
|
|
|
+ List<AdRankItem> result = rankByJava(sceneFeatureMap, userFeatureMap, rankItems);
|
|
|
|
+
|
|
|
|
+ LOGGER.debug("ctr ranker time java items size={}, time={} ", result != null ? result.size() : 0,
|
|
|
|
+ System.currentTimeMillis() - startTime);
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private List<AdRankItem> rankByJava(final Map<String, String> sceneFeatureMap,
|
|
|
|
+ final Map<String, String> userFeatureMap,
|
|
|
|
+ final List<AdRankItem> items) {
|
|
|
|
+ long startTime = System.currentTimeMillis();
|
|
|
|
+ PAIModel model = (PAIModel) this.getModel();
|
|
|
|
+ LOGGER.debug("model size: [{}]", model.getModelSize());
|
|
|
|
+ // 所有都参与打分,按照ctr排序
|
|
|
|
+ multipleCtrScore(items, userFeatureMap, sceneFeatureMap, model);
|
|
|
|
+
|
|
|
|
+ // debug log
|
|
|
|
+ if (LOGGER.isDebugEnabled()) {
|
|
|
|
+ for (int i = 0; i < items.size(); i++) {
|
|
|
|
+ LOGGER.debug("before enter feeds model predict ctr score [{}] [{}]", items.get(i), items.get(i));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Collections.sort(items);
|
|
|
|
+
|
|
|
|
+ LOGGER.debug("ctr ranker java execute time: [{}]", System.currentTimeMillis() - startTime);
|
|
|
|
+ LOGGER.debug("[ctr ranker time java] items size={}, cost={} ", items != null ? items.size() : 0,
|
|
|
|
+ System.currentTimeMillis() - startTime);
|
|
|
|
+ return items;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void multipleCtrScore(final List<AdRankItem> items,
|
|
|
|
+ final Map<String, String> userFeatureMap,
|
|
|
|
+ final Map<String, String> sceneFeatureMap,
|
|
|
|
+ final PAIModel model) {
|
|
|
|
+
|
|
|
|
+ List<Float> score = model.score(items, userFeatureMap, sceneFeatureMap);
|
|
|
|
+ LOGGER.debug("PAIScorer score={}", score);
|
|
|
|
+ for (int i = 0; i < items.size(); i++) {
|
|
|
|
+ Double pro = Double.valueOf(score.get(i));
|
|
|
|
+ items.get(i).setLrScore(pro);
|
|
|
|
+ items.get(i).getScoreMap().put("ctcvrScore", pro);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+}
|