|
@@ -11,7 +11,7 @@ import com.tzld.piaoquan.recommend.server.service.rank.RankService;
|
|
import com.tzld.piaoquan.recommend.server.service.rank.extractor.RankExtractorFeature;
|
|
import com.tzld.piaoquan.recommend.server.service.rank.extractor.RankExtractorFeature;
|
|
import com.tzld.piaoquan.recommend.server.service.rank.processor.RankProcessorDensity;
|
|
import com.tzld.piaoquan.recommend.server.service.rank.processor.RankProcessorDensity;
|
|
import com.tzld.piaoquan.recommend.server.service.rank.processor.RankProcessorTagFilter;
|
|
import com.tzld.piaoquan.recommend.server.service.rank.processor.RankProcessorTagFilter;
|
|
-import com.tzld.piaoquan.recommend.server.util.JSONUtils;
|
|
+import com.tzld.piaoquan.recommend.server.service.rank.extractor.RankExtractorItemTags;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
import org.apache.commons.lang3.RandomUtils;
|
|
import org.apache.commons.lang3.RandomUtils;
|
|
@@ -21,132 +21,105 @@ import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
- * @author zhangbo
|
|
+ * @author zhangbo sunxiaoyi
|
|
- * @desc 带密度控制的后处理 排序实验
|
|
+ * @desc 后处理规则 + roc池flow池的合并
|
|
|
|
+ * 后处理参考文档:https:
|
|
|
|
+ * roc池flow池的合并 文档: 暂无
|
|
*/
|
|
*/
|
|
@Service
|
|
@Service
|
|
@Slf4j
|
|
@Slf4j
|
|
public class RankStrategy4Density extends RankService {
|
|
public class RankStrategy4Density extends RankService {
|
|
@ApolloJsonValue("${RankStrategy4DensityFilter:}")
|
|
@ApolloJsonValue("${RankStrategy4DensityFilter:}")
|
|
- private Map<String,Map<String, Map<String, String>>> filterRules;
|
|
+ private Map<String,Map<String, Map<String, String>>> filterRules = new HashMap<>();
|
|
@Override
|
|
@Override
|
|
- public RankResult mergeAndSort(RankParam param, List<Video> rovRecallRank, List<Video> flowPoolRank) {
|
|
+ public RankResult mergeAndSort(RankParam param, List<Video> rovVideos, List<Video> flowVideos) {
|
|
|
|
|
|
- if (CollectionUtils.isEmpty(rovRecallRank)) {
|
|
+
|
|
- if (param.getSize() < flowPoolRank.size()) {
|
|
+ if (CollectionUtils.isEmpty(rovVideos)) {
|
|
- return new RankResult(flowPoolRank.subList(0, param.getSize()));
|
|
+ if (param.getSize() < flowVideos.size()) {
|
|
|
|
+ return new RankResult(flowVideos.subList(0, param.getSize()));
|
|
} else {
|
|
} else {
|
|
- return new RankResult(flowPoolRank);
|
|
+ return new RankResult(flowVideos);
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- Map<String, Integer> densityRules = new HashMap<>();
|
|
|
|
- String abCode = param.getAbCode();
|
|
|
|
- if (this.filterRules != null && this.filterRules.containsKey(abCode)){
|
|
|
|
- Map<String, Map<String, String>> rule = this.filterRules.get(abCode);
|
|
|
|
- for (Map.Entry<String, Map<String, String>> entry : rule.entrySet()){
|
|
|
|
- String key = entry.getKey();
|
|
|
|
- Map<String, String> value = entry.getValue();
|
|
|
|
- if (value.containsKey("density")){
|
|
|
|
- densityRules.put(key, Integer.valueOf(value.get("density")));
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+ String abCode = param.getAbCode();
|
|
|
|
+ Map<String, Map<String, String>> rulesMap = this.filterRules.getOrDefault(abCode, new HashMap<>(0));
|
|
|
|
|
|
-
|
|
+
|
|
- List<Long> videoIds = new ArrayList<>();
|
|
+ if (rulesMap != null && !rulesMap.isEmpty()){
|
|
- for (Video v : rovRecallRank) {
|
|
+ RankExtractorItemTags extractorItemTags = new RankExtractorItemTags(this.redisTemplate);
|
|
- videoIds.add(v.getVideoId());
|
|
+ extractorItemTags.processor(rovVideos, flowVideos);
|
|
- }
|
|
|
|
- for (Video v : flowPoolRank) {
|
|
|
|
- videoIds.add(v.getVideoId());
|
|
|
|
- }
|
|
|
|
- Map<Long, List<String>> videoTagDict = RankExtractorFeature.getVideoTags(this.redisTemplate, videoIds);
|
|
|
|
- for (Video v : rovRecallRank) {
|
|
|
|
- v.setTags(videoTagDict.getOrDefault(v.getVideoId(), new ArrayList<>()));
|
|
|
|
}
|
|
}
|
|
- for (Video v : flowPoolRank) {
|
|
+
|
|
- v.setTags(videoTagDict.getOrDefault(v.getVideoId(), new ArrayList<>()));
|
|
+ if (rulesMap != null && !rulesMap.isEmpty()){
|
|
|
|
+ RankProcessorTagFilter.tagFitlter(rovVideos, flowVideos, rulesMap);
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
+
|
|
- if (this.filterRules != null && this.filterRules.containsKey(abCode)){
|
|
+
|
|
- Map<String, Map<String, String>> rule = this.filterRules.get(abCode);
|
|
+
|
|
- RankProcessorTagFilter.tagFitlter(rovRecallRank, flowPoolRank, rule);
|
|
|
|
- }
|
|
|
|
|
|
|
|
-
|
|
+
|
|
List<Video> result = new ArrayList<>();
|
|
List<Video> result = new ArrayList<>();
|
|
- for (int i = 0; i < param.getTopK() && i < rovRecallRank.size(); i++) {
|
|
+ for (int i = 0; i < param.getTopK() && i < rovVideos.size(); i++) {
|
|
- result.add(rovRecallRank.get(i));
|
|
+ result.add(rovVideos.get(i));
|
|
}
|
|
}
|
|
-
|
|
|
|
double flowPoolP = getFlowPoolP(param);
|
|
double flowPoolP = getFlowPoolP(param);
|
|
int flowPoolIndex = 0;
|
|
int flowPoolIndex = 0;
|
|
int rovPoolIndex = param.getTopK();
|
|
int rovPoolIndex = param.getTopK();
|
|
-
|
|
|
|
for (int i = 0; i < param.getSize() - param.getTopK(); i++) {
|
|
for (int i = 0; i < param.getSize() - param.getTopK(); i++) {
|
|
double rand = RandomUtils.nextDouble(0, 1);
|
|
double rand = RandomUtils.nextDouble(0, 1);
|
|
log.info("rand={}, flowPoolP={}", rand, flowPoolP);
|
|
log.info("rand={}, flowPoolP={}", rand, flowPoolP);
|
|
if (rand < flowPoolP) {
|
|
if (rand < flowPoolP) {
|
|
- if (flowPoolIndex < flowPoolRank.size()) {
|
|
+ if (flowPoolIndex < flowVideos.size()) {
|
|
- result.add(flowPoolRank.get(flowPoolIndex++));
|
|
+ result.add(flowVideos.get(flowPoolIndex++));
|
|
} else {
|
|
} else {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- if (rovPoolIndex < rovRecallRank.size()) {
|
|
+ if (rovPoolIndex < rovVideos.size()) {
|
|
- result.add(rovRecallRank.get(rovPoolIndex++));
|
|
+ result.add(rovVideos.get(rovPoolIndex++));
|
|
} else {
|
|
} else {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if (rovPoolIndex >= rovRecallRank.size()) {
|
|
+ if (rovPoolIndex >= rovVideos.size()) {
|
|
- for (int i = flowPoolIndex; i < flowPoolRank.size() && result.size() < param.getSize(); i++) {
|
|
+ for (int i = flowPoolIndex; i < flowVideos.size() && result.size() < param.getSize(); i++) {
|
|
- result.add(flowPoolRank.get(i));
|
|
+ result.add(flowVideos.get(i));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if (flowPoolIndex >= flowPoolRank.size()) {
|
|
+ if (flowPoolIndex >= flowVideos.size()) {
|
|
- for (int i = rovPoolIndex; i < rovRecallRank.size() && result.size() < param.getSize(); i++) {
|
|
+ for (int i = rovPoolIndex; i < rovVideos.size() && result.size() < param.getSize(); i++) {
|
|
- result.add(rovRecallRank.get(i));
|
|
+ result.add(rovVideos.get(i));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
+
|
|
|
|
+ Map<String, Integer> densityRules = new HashMap<>();
|
|
|
|
+ if (rulesMap != null && !rulesMap.isEmpty()) {
|
|
|
|
+ for (Map.Entry<String, Map<String, String>> entry : rulesMap.entrySet()) {
|
|
|
|
+ String key = entry.getKey();
|
|
|
|
+ Map<String, String> value = entry.getValue();
|
|
|
|
+ if (value.containsKey("density")) {
|
|
|
|
+ densityRules.put(key, Integer.valueOf(value.get("density")));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
Set<Long> videosSet = result.stream().map(r-> r.getVideoId()).collect(Collectors.toSet());
|
|
Set<Long> videosSet = result.stream().map(r-> r.getVideoId()).collect(Collectors.toSet());
|
|
- List<Video> rovRecallRankNew = rovRecallRank.stream().filter(r -> !videosSet.contains(r.getVideoId())).collect(Collectors.toList());
|
|
+ List<Video> rovRecallRankNew = rovVideos.stream().filter(r -> !videosSet.contains(r.getVideoId())).collect(Collectors.toList());
|
|
- List<Video> flowPoolRankNew = flowPoolRank.stream().filter(r -> !videosSet.contains(r.getVideoId())).collect(Collectors.toList());
|
|
+ List<Video> flowPoolRankNew = flowVideos.stream().filter(r -> !videosSet.contains(r.getVideoId())).collect(Collectors.toList());
|
|
List<Video> resultWithDnsity = RankProcessorDensity.mergeDensityControl(result,
|
|
List<Video> resultWithDnsity = RankProcessorDensity.mergeDensityControl(result,
|
|
rovRecallRankNew, flowPoolRankNew, densityRules);
|
|
rovRecallRankNew, flowPoolRankNew, densityRules);
|
|
-
|
|
+
|
|
-
|
|
|
|
return new RankResult(resultWithDnsity);
|
|
return new RankResult(resultWithDnsity);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -156,6 +129,26 @@ public class RankStrategy4Density extends RankService {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
+
|
|
-
|
|
+
|
|
-}
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|