|
@@ -2,6 +2,8 @@ package com.tzld.piaoquan.recommend.server.service.score;
|
|
|
|
|
|
|
|
|
|
import com.typesafe.config.Config;
|
|
import com.typesafe.config.Config;
|
|
|
|
+import com.tzld.piaoquan.recommend.server.service.score4recall.AbstractScorer4Recall;
|
|
|
|
+import com.tzld.piaoquan.recommend.server.service.score4recall.ScorerPipeline4Recall;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.commons.lang.exception.ExceptionUtils;
|
|
import org.apache.commons.lang.exception.ExceptionUtils;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
@@ -18,6 +20,7 @@ public final class ScorerUtils {
|
|
private static Logger LOGGER = LoggerFactory.getLogger(ScorerUtils.class);
|
|
private static Logger LOGGER = LoggerFactory.getLogger(ScorerUtils.class);
|
|
|
|
|
|
private static Map<String, ScorerPipeline> scorerPipelineCache = new ConcurrentHashMap<>();
|
|
private static Map<String, ScorerPipeline> scorerPipelineCache = new ConcurrentHashMap<>();
|
|
|
|
+ private static Map<String, ScorerPipeline4Recall> scorerPipelineCache4Recall = new ConcurrentHashMap<>();
|
|
|
|
|
|
public static String BASE_CONF = "feeds_score_config_baseline.conf";
|
|
public static String BASE_CONF = "feeds_score_config_baseline.conf";
|
|
public static String VIDEO_SCORE_CONF_FOR_AD = "video_score_config_for_ad.conf";
|
|
public static String VIDEO_SCORE_CONF_FOR_AD = "video_score_config_for_ad.conf";
|
|
@@ -30,6 +33,10 @@ public final class ScorerUtils {
|
|
ScorerUtils.init(BASE_CONF);
|
|
ScorerUtils.init(BASE_CONF);
|
|
ScorerUtils.init(FLOWPOOL_CONF);
|
|
ScorerUtils.init(FLOWPOOL_CONF);
|
|
ScorerUtils.init(VIDEO_SCORE_CONF_FOR_AD);
|
|
ScorerUtils.init(VIDEO_SCORE_CONF_FOR_AD);
|
|
|
|
+ ScorerUtils.init4Recall("feeds_recall_config_region_v1.conf");
|
|
|
|
+ ScorerUtils.init4Recall("feeds_recall_config_region_v2.conf");
|
|
|
|
+ ScorerUtils.init4Recall("feeds_recall_config_region_v3.conf");
|
|
|
|
+ ScorerUtils.init4Recall("feeds_recall_config_region_v4.conf");
|
|
}
|
|
}
|
|
|
|
|
|
private ScorerUtils() {
|
|
private ScorerUtils() {
|
|
@@ -44,6 +51,14 @@ public final class ScorerUtils {
|
|
initLoadModel(scorers);
|
|
initLoadModel(scorers);
|
|
scorerPipelineCache.put(configFile, new ScorerPipeline(scorers));
|
|
scorerPipelineCache.put(configFile, new ScorerPipeline(scorers));
|
|
}
|
|
}
|
|
|
|
+ public static void init4Recall(String configFile) {
|
|
|
|
+ ScorerConfig scorerConfig = new ScorerConfig();
|
|
|
|
+ scorerConfig.load(configFile);
|
|
|
|
+ List<AbstractScorer4Recall> scorers = ScorerUtils.constructScorers4Recall(scorerConfig);
|
|
|
|
+
|
|
|
|
+ initLoadModel4Recall(scorers);
|
|
|
|
+ scorerPipelineCache4Recall.put(configFile, new ScorerPipeline4Recall(scorers));
|
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
/**
|
|
* init load model
|
|
* init load model
|
|
@@ -57,6 +72,13 @@ public final class ScorerUtils {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ public static void initLoadModel4Recall(List<AbstractScorer4Recall> scorers) {
|
|
|
|
+ for (AbstractScorer4Recall scorer : scorers) {
|
|
|
|
+ if (scorer.isEnable()) {
|
|
|
|
+ scorer.loadModel();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
public static void initLoadModel(String configFile) {
|
|
public static void initLoadModel(String configFile) {
|
|
ScorerConfig scorerConfig = new ScorerConfig();
|
|
ScorerConfig scorerConfig = new ScorerConfig();
|
|
@@ -86,6 +108,19 @@ public final class ScorerUtils {
|
|
return pipeline;
|
|
return pipeline;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public static ScorerPipeline4Recall getScorerPipeline4Recall(String configFile) {
|
|
|
|
+ // 不需要保证严格意义的单例
|
|
|
|
+ if (scorerPipelineCache4Recall.containsKey(configFile)) {
|
|
|
|
+ return scorerPipelineCache4Recall.get(configFile);
|
|
|
|
+ }
|
|
|
|
+ ScorerConfig scorerConfig = new ScorerConfig();
|
|
|
|
+ scorerConfig.load(configFile);
|
|
|
|
+ List<AbstractScorer4Recall> scorers = ScorerUtils.constructScorers4Recall(scorerConfig);
|
|
|
|
+ ScorerPipeline4Recall pipeline = new ScorerPipeline4Recall(scorers);
|
|
|
|
+ scorerPipelineCache4Recall.put(configFile, pipeline);
|
|
|
|
+ return pipeline;
|
|
|
|
+ }
|
|
|
|
+
|
|
public static ScorerPipeline getScorerPipeline(Config mergeConfig) {
|
|
public static ScorerPipeline getScorerPipeline(Config mergeConfig) {
|
|
ScorerConfig scorerConfig = new ScorerConfig();
|
|
ScorerConfig scorerConfig = new ScorerConfig();
|
|
scorerConfig.load(mergeConfig);
|
|
scorerConfig.load(mergeConfig);
|
|
@@ -126,6 +161,32 @@ public final class ScorerUtils {
|
|
return scorers;
|
|
return scorers;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * construct scorers
|
|
|
|
+ *
|
|
|
|
+ * @param scorerConfig
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public static List<AbstractScorer4Recall> constructScorers4Recall(ScorerConfig scorerConfig) {
|
|
|
|
+
|
|
|
|
+ List<AbstractScorer4Recall> scorers = new ArrayList<AbstractScorer4Recall>();
|
|
|
|
+ for (ScorerConfigInfo configInfo : scorerConfig.getConfigInfoList()) {
|
|
|
|
+ if (!configInfo.getDisableSwitch()) {
|
|
|
|
+ try {
|
|
|
|
+ AbstractScorer4Recall scorer = (AbstractScorer4Recall) Class.forName(configInfo.getScorerName())
|
|
|
|
+ .getConstructor(ScorerConfigInfo.class)
|
|
|
|
+ .newInstance(configInfo);
|
|
|
|
+ scorers.add(scorer);
|
|
|
|
+ LOGGER.debug("construct score [{}]", configInfo.getScorerName());
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ LOGGER.error("instance scorer {} failed {}", configInfo.getScorerName(), ExceptionUtils.getFullStackTrace(e));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return scorers;
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* construct scorers
|
|
* construct scorers
|
|
*
|
|
*
|