|
@@ -1,109 +1,61 @@
|
|
|
package com.tzld.piaoquan.recommend.server.service.rank.processor;
|
|
|
+
|
|
|
import com.tzld.piaoquan.recommend.server.model.Video;
|
|
|
-import org.apache.commons.lang3.tuple.Pair;
|
|
|
+import com.tzld.piaoquan.recommend.server.util.ProbabilityCalculator;
|
|
|
|
|
|
-import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
|
public class RankProcessorTagFilter {
|
|
|
|
|
|
- public static void processor(List<Video> rov, List<Video> flow, Map<String, Map<String, String>> rule) {
|
|
|
+ public static void processor(List<Video> rov, List<Video> flow, Map<String, Map<String, String>> rules) {
|
|
|
+
|
|
|
+ Set<String> filterTags = new HashSet<>();
|
|
|
+ Random random = new Random();
|
|
|
|
|
|
- Map<String, String> tag2Rate = new HashMap<>();
|
|
|
- Map<String, List<Pair<String, String>>> tag2Dates = new HashMap<>();
|
|
|
- for (Map.Entry<String, Map<String, String>> entry : rule.entrySet()){
|
|
|
+ // 遍历每一个规则条目
|
|
|
+ for (Map.Entry<String, Map<String, String>> entry : rules.entrySet()) {
|
|
|
String key = entry.getKey();
|
|
|
- Map<String, String> value = entry.getValue();
|
|
|
- if (value.containsKey("filter_rate")){
|
|
|
- tag2Rate.put(key, value.get("filter_rate"));
|
|
|
- }
|
|
|
- if (value.containsKey("filter_date")){
|
|
|
- List<Pair<String, String>> tmpList = new ArrayList<>();
|
|
|
- for (String tmp : value.get("filter_date").split(",")){
|
|
|
- String start = tmp.split("-")[0];
|
|
|
- String end = tmp.split("-")[1];
|
|
|
- tmpList.add(Pair.of(start, end));
|
|
|
- }
|
|
|
- tag2Dates.put(key, tmpList);
|
|
|
- }
|
|
|
- }
|
|
|
+ Map<String, String> rule = entry.getValue();
|
|
|
+ String filterRate = rule.get("filter_rate");
|
|
|
+ String filterDate = rule.get("filter_date");
|
|
|
|
|
|
- // 通过过滤概率获取本轮过滤tag集合
|
|
|
- Set<String> filterTags = new HashSet<>();
|
|
|
- for (Map.Entry<String, String> entry : tag2Rate.entrySet()) {
|
|
|
- try {
|
|
|
- String key = entry.getKey();
|
|
|
- String value = entry.getValue();
|
|
|
- String[] boostArray = value.split("-");
|
|
|
- if (boostArray.length != 2) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- double min = Double.parseDouble(boostArray[0]);
|
|
|
- double max = Double.parseDouble(boostArray[1]);
|
|
|
- // 生成min到max之间的随机数
|
|
|
- double randomValue = min + (Math.random() * (max - min));
|
|
|
- if (Math.random() <= randomValue) {
|
|
|
+ // 使用 calculateCurrentProbability 方法计算当前概率
|
|
|
+ double currentProbability = ProbabilityCalculator.calculateCurrentProbability(filterRate, filterDate);
|
|
|
+
|
|
|
+ // 生成随机浮点数并与 filter_rate 比较
|
|
|
+ if (currentProbability > 0) { // 确保有有效的概率
|
|
|
+ double randomValue = random.nextDouble();
|
|
|
+ if (randomValue < currentProbability) {
|
|
|
filterTags.add(key);
|
|
|
}
|
|
|
- } catch (Exception ignored) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 获取系统时间
|
|
|
- Calendar calendar = Calendar.getInstance();
|
|
|
- String dateHour = new SimpleDateFormat("yyyyMMddHH").format(calendar.getTime());
|
|
|
+ if (filterTags.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
//执行过滤
|
|
|
Iterator<Video> iterator = rov.iterator();
|
|
|
while (iterator.hasNext()) {
|
|
|
Video video = iterator.next();
|
|
|
List<String> tags = video.getTags();
|
|
|
- boolean filter = false;
|
|
|
- for (String tag : tags){
|
|
|
- if (!filterTags.contains(tag)){
|
|
|
- continue;
|
|
|
- }
|
|
|
- boolean flag = ifFiter(tag2Dates, tag, dateHour);
|
|
|
- if (flag){
|
|
|
- filter = true;
|
|
|
- break;
|
|
|
+ for (String tag : tags) {
|
|
|
+ if (filterTags.contains(tag)) {
|
|
|
+ iterator.remove();
|
|
|
}
|
|
|
}
|
|
|
- if (filter){
|
|
|
- iterator.remove();
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
iterator = flow.iterator();
|
|
|
while (iterator.hasNext()) {
|
|
|
Video video = iterator.next();
|
|
|
List<String> tags = video.getTags();
|
|
|
- boolean filter = false;
|
|
|
- for (String tag : tags){
|
|
|
- if (!filterTags.contains(tag)){
|
|
|
- continue;
|
|
|
+ for (String tag : tags) {
|
|
|
+ if (filterTags.contains(tag)) {
|
|
|
+ iterator.remove();
|
|
|
}
|
|
|
- boolean flag = ifFiter(tag2Dates, tag, dateHour);
|
|
|
- if (flag){
|
|
|
- filter = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if (filter){
|
|
|
- iterator.remove();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public static boolean ifFiter(Map<String, List<Pair<String, String>>> tag2Dates, String tag, String dateHour){
|
|
|
- if (!tag2Dates.containsKey(tag) || tag2Dates.get(tag).isEmpty()){
|
|
|
- return false;
|
|
|
- }
|
|
|
- for (Pair<String, String> d: tag2Dates.get(tag)){
|
|
|
- if (dateHour.compareTo(d.getLeft()) >= 0 && dateHour.compareTo(d.getRight()) < 0){
|
|
|
- return true;
|
|
|
}
|
|
|
}
|
|
|
- return false;
|
|
|
}
|
|
|
|
|
|
}
|