Browse Source

增加ViewCountRateStrategy 评分计算

wangyunpeng 11 months ago
parent
commit
fe4155ab66

+ 15 - 5
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/rank/strategy/RankV3Strategy.java

@@ -46,11 +46,21 @@ public class RankV3Strategy implements RankStrategy {
             RankItem item = new RankItem();
             item.setContent(c);
             item.setScoreMap(scoreMap.get(c.getId()));
-            double score = 2 * item.getScore(SimilarityStrategy.class.getSimpleName())
-                    + item.getScore(ViewMultiplierStrategy.class.getSimpleName())
-                    + item.getScore(CategoryStrategy.class.getSimpleName())
-                    + item.getScore(AccountPreDistributeStrategy.class.getSimpleName())
-                    + item.getScore(ColdStartDecreaseStrategy.class.getSimpleName());
+            String[] contentPools = accountContentPoolConfigService.getContentPools(param.getAccountName());
+            double score;
+            if (contentPools[0].equals(item.getContent().getContentPoolType())) {
+                score = item.getScore(SimilarityStrategy.class.getSimpleName())
+                        + item.getScore(CategoryStrategy.class.getSimpleName())
+                        + item.getScore(ViewCountRateStrategy.class.getSimpleName());
+            } else if (contentPools[1].equals(item.getContent().getContentPoolType())) {
+                score = item.getScore(ViewCountStrategy.class.getSimpleName())
+                        + item.getScore(CategoryStrategy.class.getSimpleName());
+            } else {
+                score = item.getScore(SimilarityStrategy.class.getSimpleName())
+                        + item.getScore(CategoryStrategy.class.getSimpleName())
+                        + item.getScore(AccountPreDistributeStrategy.class.getSimpleName())
+                        + item.getScore(ColdStartDecreaseStrategy.class.getSimpleName());
+            }
             item.setScore(score);
             return item;
         });

+ 1 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/score/ScoreService.java

@@ -91,6 +91,7 @@ public class ScoreService implements ApplicationContextAware {
             strategies.add(strategyMap.get(CategoryStrategy.class.getSimpleName()));
             strategies.add(strategyMap.get(AccountPreDistributeStrategy.class.getSimpleName()));
             strategies.add(strategyMap.get(ColdStartDecreaseStrategy.class.getSimpleName()));
+            strategies.add(strategyMap.get(ViewCountRateStrategy.class.getSimpleName()));
         }
 
         return strategies;

+ 0 - 3
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/score/strategy/AccountPreDistributeStrategy.java

@@ -62,9 +62,6 @@ public class AccountPreDistributeStrategy implements ScoreStrategy {
                     score.setContentId(content.getId());
                     score.setScore(weight);
                 }
-            } else {
-                score.setContentId(content.getId());
-                score.setScore(weight);
             }
             if (StringUtils.hasText(score.getContentId())) {
                 scores.add(score);

+ 61 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/score/strategy/ViewCountRateStrategy.java

@@ -0,0 +1,61 @@
+package com.tzld.longarticle.recommend.server.service.score.strategy;
+
+import com.tzld.longarticle.recommend.server.model.Content;
+import com.tzld.longarticle.recommend.server.model.ContentHisPublishArticle;
+import com.tzld.longarticle.recommend.server.service.AccountContentPoolConfigService;
+import com.tzld.longarticle.recommend.server.service.AccountIndexAvgViewCountService;
+import com.tzld.longarticle.recommend.server.service.score.Score;
+import com.tzld.longarticle.recommend.server.service.score.ScoreParam;
+import com.tzld.longarticle.recommend.server.service.score.ScoreStrategy;
+import com.tzld.longarticle.recommend.server.util.MathUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+@Slf4j
+public class ViewCountRateStrategy implements ScoreStrategy {
+
+    @Autowired
+    AccountIndexAvgViewCountService accountIndexAvgViewCountService;
+    @Autowired
+    private AccountContentPoolConfigService accountContentPoolConfigService;
+
+    @Override
+    public List<Score> score(ScoreParam param) {
+        List<Score> scores = new ArrayList<>();
+        for (Content content: param.getContents()) {
+            String[] contentPools = accountContentPoolConfigService.getContentPools(param.getAccountName());
+            if (!contentPools[0].equals(content.getContentPoolType())) {
+                continue;
+            }
+            double firstAvgViewCount = accountIndexAvgViewCountService.getAvgReadCount(param.getGhId(), 1);
+            double showViewCountSum = 0D;
+            double avgViewCountSum = 0D;
+            for (ContentHisPublishArticle hisItem : content.getHisPublishArticleList()) {
+                if (hisItem.isInnerAccount() && hisItem.getShowViewCount() > 0 && hisItem.getAvgViewCount() > 0) {
+                    showViewCountSum += hisItem.getShowViewCount();
+                    avgViewCountSum += hisItem.getAvgViewCount();
+                }
+            }
+            double viewCountRate = 0D; // 设置默认值
+            if (avgViewCountSum > 0) {
+                viewCountRate = showViewCountSum / avgViewCountSum;
+            }
+            double viewCountRateW = MathUtils.sigmoid(avgViewCountSum, 0.0005, firstAvgViewCount);
+            double viewCountRateScore = 0;
+            if (viewCountRate > 0) {
+                viewCountRateScore = (Math.min(viewCountRate, 5) - 1D) * viewCountRateW;
+            }
+            Score score = new Score();
+            score.setStrategy(this);
+            score.setContentId(content.getId());
+            score.setScore(viewCountRateScore);
+            scores.add(score);
+        }
+        return scores;
+    }
+}

+ 25 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/util/MathUtils.java

@@ -0,0 +1,25 @@
+package com.tzld.longarticle.recommend.server.util;
+
+public class MathUtils {
+    // Sigmoid函数实现
+    public static double sigmoid(double x, double k, double m) {
+        return 1.0 / (1.0 + Math.exp(-k * (x - m)));
+    }
+
+    public static void main(String[] args) {
+        double[] xValues = {0, 25000, 50000, 75000, 100000};  // 示例阅读量
+
+        // 测试不同的 k 值
+        double[] kValues = {0.0005, 0.0001, 0.00005};  // 不同的 k 值
+        double m = 100;  // 中值
+
+        for (double k : kValues) {
+            System.out.println("k = " + k);
+            for (double x : xValues) {
+                double sigmoidValue = sigmoid(x, k, m);
+                System.out.printf("x = %.2f, Sigmoid = %.4f%n", x, sigmoidValue);
+            }
+            System.out.println();
+        }
+    }
+}