|
@@ -4,6 +4,7 @@ package com.tzld.piaoquan.ad.engine.service.score;
|
|
|
import com.tzld.piaoquan.ad.engine.commons.score.BaseLRModelScorer;
|
|
|
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.CvrAdjustingModel;
|
|
|
import com.tzld.piaoquan.ad.engine.commons.score.model.LRModel;
|
|
|
import com.tzld.piaoquan.recommend.feature.domain.ad.base.*;
|
|
|
import com.tzld.piaoquan.recommend.feature.domain.ad.feature.VlogAdCtrLRFeatureExtractor;
|
|
@@ -16,6 +17,7 @@ import org.slf4j.LoggerFactory;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
import java.util.concurrent.*;
|
|
|
|
|
|
|
|
@@ -31,11 +33,29 @@ public class VlogAdCvrLRScorer extends BaseLRModelScorer {
|
|
|
private static final int enterFeedsScoreRatio = 10;
|
|
|
private static final int enterFeedsScoreNum = 20;
|
|
|
|
|
|
+ // 校准策略数据的OSS文件路径
|
|
|
+ public static final String OSS_FILE_PATH = "ad_cvr_model/cvr_adjusting_strategy_coefficient.txt";
|
|
|
+
|
|
|
|
|
|
public VlogAdCvrLRScorer(ScorerConfigInfo configInfo) {
|
|
|
super(configInfo);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 因CVR有校验策略,除了加载CVR自己的Model外还需要加载校准策略的数据Model
|
|
|
+ * <br />
|
|
|
+ * 故在此重写loadModel方法,加载校验策略的Model
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void loadModel() {
|
|
|
+ super.loadModel();
|
|
|
+ try {
|
|
|
+ modelManager.registerModel(OSS_FILE_PATH, OSS_FILE_PATH, CvrAdjustingModel.class);
|
|
|
+ } catch (
|
|
|
+ Exception e) {
|
|
|
+ LOGGER.error("加载校准策略数据异常: ", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
public List<AdRankItem> scoring(final ScoreParam param,
|
|
@@ -70,8 +90,10 @@ public class VlogAdCvrLRScorer extends BaseLRModelScorer {
|
|
|
UserAdBytesFeature userInfoBytes = null;
|
|
|
userInfoBytes = new UserAdBytesFeature(user);
|
|
|
|
|
|
+ CvrAdjustingModel adjustingModel = (CvrAdjustingModel) modelManager.getModel(OSS_FILE_PATH);
|
|
|
+
|
|
|
// 所有都参与打分,按照cvr排序
|
|
|
- multipleScore(items, userInfoBytes, requestContext, model);
|
|
|
+ multipleScore(items, userInfoBytes, requestContext, model, adjustingModel);
|
|
|
|
|
|
// debug log
|
|
|
if (LOGGER.isDebugEnabled()) {
|
|
@@ -93,7 +115,8 @@ public class VlogAdCvrLRScorer extends BaseLRModelScorer {
|
|
|
public double calcScore(final LRModel lrModel,
|
|
|
final AdRankItem item,
|
|
|
final UserAdBytesFeature userInfoBytes,
|
|
|
- final AdRequestContext requestContext) {
|
|
|
+ final AdRequestContext requestContext,
|
|
|
+ final CvrAdjustingModel adjustingModel) {
|
|
|
|
|
|
LRSamples lrSamples = null;
|
|
|
VlogAdCtrLRFeatureExtractor bytesFeatureExtractor;
|
|
@@ -113,6 +136,13 @@ public class VlogAdCvrLRScorer extends BaseLRModelScorer {
|
|
|
if (lrSamples != null && lrSamples.getFeaturesList() != null) {
|
|
|
try {
|
|
|
pro = lrModel.score(lrSamples);
|
|
|
+
|
|
|
+ // CVR校准
|
|
|
+ Double coef = adjustingModel.getAdjustingCoefficien(pro);
|
|
|
+ if (Objects.nonNull(coef)) {
|
|
|
+ pro = pro / coef;
|
|
|
+ }
|
|
|
+
|
|
|
} catch (Exception e) {
|
|
|
LOGGER.error("score error for doc={} exception={}", new Object[]{
|
|
|
item.getAdId(), ExceptionUtils.getFullStackTrace(e)});
|
|
@@ -135,7 +165,8 @@ public class VlogAdCvrLRScorer extends BaseLRModelScorer {
|
|
|
private void multipleScore(final List<AdRankItem> items,
|
|
|
final UserAdBytesFeature userInfoBytes,
|
|
|
final AdRequestContext requestContext,
|
|
|
- final LRModel model) {
|
|
|
+ final LRModel model,
|
|
|
+ final CvrAdjustingModel adjustingModel) {
|
|
|
|
|
|
List<Callable<Object>> calls = new ArrayList<Callable<Object>>();
|
|
|
for (int index = 0; index < items.size(); index++) {
|
|
@@ -145,7 +176,7 @@ public class VlogAdCvrLRScorer extends BaseLRModelScorer {
|
|
|
@Override
|
|
|
public Object call() throws Exception {
|
|
|
try {
|
|
|
- calcScore(model, items.get(fIndex), userInfoBytes, requestContext);
|
|
|
+ calcScore(model, items.get(fIndex), userInfoBytes, requestContext, adjustingModel);
|
|
|
} catch (Exception e) {
|
|
|
LOGGER.error("ctr exception: [{}] [{}]", items.get(fIndex).adId, ExceptionUtils.getFullStackTrace(e));
|
|
|
}
|