Kaynağa Gözat

Merge branch 'feature/external_increase_fission' of algorithm/recommend-server into master

jiachanghui 1 ay önce
ebeveyn
işleme
402ff14e64
18 değiştirilmiş dosya ile 552 ekleme ve 40 silme
  1. 1 1
      recommend-server-client/pom.xml
  2. 22 21
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/Recommend.java
  3. 138 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/RecommendRequest.java
  4. 12 0
      recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/RecommendRequestOrBuilder.java
  5. 1 0
      recommend-server-client/src/main/proto/com/tzld/piaoquan/recommend/server/recommend.proto
  6. 1 1
      recommend-server-service/pom.xml
  7. 2 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/RecommendParam.java
  8. 3 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/RecommendService.java
  9. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankParam.java
  10. 22 4
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV566.java
  11. 22 12
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV568.java
  12. 5 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV569.java
  13. 1 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallParam.java
  14. 6 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallService.java
  15. 105 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate1STRRecallStrategy.java
  16. 105 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate2STRRecallStrategy.java
  17. 95 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/ProvinceSTRRecallStrategy.java
  18. 10 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/util/FeatureUtils.java

+ 1 - 1
recommend-server-client/pom.xml

@@ -10,7 +10,7 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>recommend-server-client</artifactId>
-    <version>1.1.5</version>
+    <version>1.1.6</version>
 
     <dependencies>
         <dependency>

+ 22 - 21
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/Recommend.java

@@ -56,7 +56,7 @@ public final class Recommend {
       "\n2com/tzld/piaoquan/recommend/server/rec" +
       "ommend.proto\032\031google/protobuf/any.proto\032" +
       "/com/tzld/piaoquan/recommend/server/comm" +
-      "on.proto\"\304\004\n\020RecommendRequest\022\022\n\nrequest" +
+      "on.proto\"\334\004\n\020RecommendRequest\022\022\n\nrequest" +
       "_id\030\001 \001(\t\022\013\n\003mid\030\002 \001(\t\022\013\n\003uid\030\003 \001(\t\022\014\n\004s" +
       "ize\030\004 \001(\005\022\020\n\010app_type\030\005 \001(\005\022\021\n\tcity_code" +
       "\030\006 \001(\t\022\025\n\rprovince_code\030\007 \001(\t\022\023\n\013ab_exp_" +
@@ -69,25 +69,26 @@ public final class Recommend {
       "ion_id\030\021 \001(\t\022\026\n\016sub_session_id\030\022 \001(\t\022\023\n\013" +
       "page_source\030\023 \001(\t\022\023\n\013category_id\030\024 \001(\t\022\026" +
       "\n\016hot_scene_type\030\025 \001(\003\022\021\n\tclient_ip\030\026 \001(" +
-      "\t\022\024\n\014version_code\030\027 \001(\005\032.\n\014EventIdEntry\022" +
-      "\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\t:\0028\001\"\177\n\020Machi" +
-      "neInfoProto\022\r\n\005brand\030\001 \001(\t\022\r\n\005model\030\002 \001(" +
-      "\t\022\020\n\010platform\030\003 \001(\t\022\023\n\013sdk_version\030\004 \001(\t" +
-      "\022\016\n\006system\030\005 \001(\t\022\026\n\016wechat_version\030\006 \001(\t" +
-      "\"H\n\021RecommendResponse\022\027\n\006result\030\001 \001(\0132\007." +
-      "Result\022\032\n\005video\030\002 \003(\0132\013.VideoProto\"\336\001\n\nV" +
-      "ideoProto\022\020\n\010video_id\030\001 \001(\003\022\021\n\trov_score" +
-      "\030\002 \001(\001\022\021\n\tpush_from\030\003 \001(\t\022\017\n\007ab_code\030\004 \001" +
-      "(\t\022\022\n\nsort_score\030\005 \001(\001\022\020\n\010position\030\006 \001(\005" +
-      "\022\021\n\tflow_pool\030\007 \001(\t\022\027\n\017is_in_flow_pool\030\010" +
-      " \001(\005\022\014\n\004rand\030\t \001(\001\022\'\n\017push_from_index\030\n " +
-      "\003(\0132\016.PushFromIndex\"1\n\rPushFromIndex\022\021\n\t" +
-      "push_from\030\001 \001(\t\022\r\n\005index\030\002 \003(\t2\212\001\n\020Recom" +
-      "mendService\022:\n\021HomepageRecommend\022\021.Recom" +
-      "mendRequest\032\022.RecommendResponse\022:\n\021Relev" +
-      "antRecommend\022\021.RecommendRequest\032\022.Recomm" +
-      "endResponseB7\n0com.tzld.piaoquan.recomme" +
-      "nd.server.gen.recommendP\001\210\001\001b\006proto3"
+      "\t\022\024\n\014version_code\030\027 \001(\005\022\026\n\016root_source_i" +
+      "d\030\030 \001(\t\032.\n\014EventIdEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005" +
+      "value\030\002 \001(\t:\0028\001\"\177\n\020MachineInfoProto\022\r\n\005b" +
+      "rand\030\001 \001(\t\022\r\n\005model\030\002 \001(\t\022\020\n\010platform\030\003 " +
+      "\001(\t\022\023\n\013sdk_version\030\004 \001(\t\022\016\n\006system\030\005 \001(\t" +
+      "\022\026\n\016wechat_version\030\006 \001(\t\"H\n\021RecommendRes" +
+      "ponse\022\027\n\006result\030\001 \001(\0132\007.Result\022\032\n\005video\030" +
+      "\002 \003(\0132\013.VideoProto\"\336\001\n\nVideoProto\022\020\n\010vid" +
+      "eo_id\030\001 \001(\003\022\021\n\trov_score\030\002 \001(\001\022\021\n\tpush_f" +
+      "rom\030\003 \001(\t\022\017\n\007ab_code\030\004 \001(\t\022\022\n\nsort_score" +
+      "\030\005 \001(\001\022\020\n\010position\030\006 \001(\005\022\021\n\tflow_pool\030\007 " +
+      "\001(\t\022\027\n\017is_in_flow_pool\030\010 \001(\005\022\014\n\004rand\030\t \001" +
+      "(\001\022\'\n\017push_from_index\030\n \003(\0132\016.PushFromIn" +
+      "dex\"1\n\rPushFromIndex\022\021\n\tpush_from\030\001 \001(\t\022" +
+      "\r\n\005index\030\002 \003(\t2\212\001\n\020RecommendService\022:\n\021H" +
+      "omepageRecommend\022\021.RecommendRequest\032\022.Re" +
+      "commendResponse\022:\n\021RelevantRecommend\022\021.R" +
+      "ecommendRequest\032\022.RecommendResponseB7\n0c" +
+      "om.tzld.piaoquan.recommend.server.gen.re" +
+      "commendP\001\210\001\001b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
@@ -100,7 +101,7 @@ public final class Recommend {
     internal_static_RecommendRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_RecommendRequest_descriptor,
-        new java.lang.String[] { "RequestId", "Mid", "Uid", "Size", "AppType", "CityCode", "ProvinceCode", "AbExpCode", "EventId", "VersionAuditStatus", "RecommendTraceId", "VideoId", "City", "Province", "MachineInfo", "NewExpGroup", "SessionId", "SubSessionId", "PageSource", "CategoryId", "HotSceneType", "ClientIp", "VersionCode", });
+        new java.lang.String[] { "RequestId", "Mid", "Uid", "Size", "AppType", "CityCode", "ProvinceCode", "AbExpCode", "EventId", "VersionAuditStatus", "RecommendTraceId", "VideoId", "City", "Province", "MachineInfo", "NewExpGroup", "SessionId", "SubSessionId", "PageSource", "CategoryId", "HotSceneType", "ClientIp", "VersionCode", "RootSourceId", });
     internal_static_RecommendRequest_EventIdEntry_descriptor =
       internal_static_RecommendRequest_descriptor.getNestedTypes().get(0);
     internal_static_RecommendRequest_EventIdEntry_fieldAccessorTable = new

+ 138 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/RecommendRequest.java

@@ -31,6 +31,7 @@ private static final long serialVersionUID = 0L;
     pageSource_ = "";
     categoryId_ = "";
     clientIp_ = "";
+    rootSourceId_ = "";
   }
 
   @java.lang.Override
@@ -213,6 +214,12 @@ private static final long serialVersionUID = 0L;
             versionCode_ = input.readInt32();
             break;
           }
+          case 194: {
+            java.lang.String s = input.readStringRequireUtf8();
+
+            rootSourceId_ = s;
+            break;
+          }
           default: {
             if (!parseUnknownField(
                 input, unknownFields, extensionRegistry, tag)) {
@@ -1012,6 +1019,44 @@ private static final long serialVersionUID = 0L;
     return versionCode_;
   }
 
+  public static final int ROOT_SOURCE_ID_FIELD_NUMBER = 24;
+  private volatile java.lang.Object rootSourceId_;
+  /**
+   * <code>string root_source_id = 24;</code>
+   * @return The rootSourceId.
+   */
+  @java.lang.Override
+  public java.lang.String getRootSourceId() {
+    java.lang.Object ref = rootSourceId_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      rootSourceId_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string root_source_id = 24;</code>
+   * @return The bytes for rootSourceId.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getRootSourceIdBytes() {
+    java.lang.Object ref = rootSourceId_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      rootSourceId_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
   private byte memoizedIsInitialized = -1;
   @java.lang.Override
   public final boolean isInitialized() {
@@ -1098,6 +1143,9 @@ private static final long serialVersionUID = 0L;
     if (versionCode_ != 0) {
       output.writeInt32(23, versionCode_);
     }
+    if (!getRootSourceIdBytes().isEmpty()) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 24, rootSourceId_);
+    }
     unknownFields.writeTo(output);
   }
 
@@ -1195,6 +1243,9 @@ private static final long serialVersionUID = 0L;
       size += com.google.protobuf.CodedOutputStream
         .computeInt32Size(23, versionCode_);
     }
+    if (!getRootSourceIdBytes().isEmpty()) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(24, rootSourceId_);
+    }
     size += unknownFields.getSerializedSize();
     memoizedSize = size;
     return size;
@@ -1259,6 +1310,8 @@ private static final long serialVersionUID = 0L;
         .equals(other.getClientIp())) return false;
     if (getVersionCode()
         != other.getVersionCode()) return false;
+    if (!getRootSourceId()
+        .equals(other.getRootSourceId())) return false;
     if (!unknownFields.equals(other.unknownFields)) return false;
     return true;
   }
@@ -1324,6 +1377,8 @@ private static final long serialVersionUID = 0L;
     hash = (53 * hash) + getClientIp().hashCode();
     hash = (37 * hash) + VERSION_CODE_FIELD_NUMBER;
     hash = (53 * hash) + getVersionCode();
+    hash = (37 * hash) + ROOT_SOURCE_ID_FIELD_NUMBER;
+    hash = (53 * hash) + getRootSourceId().hashCode();
     hash = (29 * hash) + unknownFields.hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -1528,6 +1583,8 @@ private static final long serialVersionUID = 0L;
 
       versionCode_ = 0;
 
+      rootSourceId_ = "";
+
       return this;
     }
 
@@ -1587,6 +1644,7 @@ private static final long serialVersionUID = 0L;
       result.hotSceneType_ = hotSceneType_;
       result.clientIp_ = clientIp_;
       result.versionCode_ = versionCode_;
+      result.rootSourceId_ = rootSourceId_;
       onBuilt();
       return result;
     }
@@ -1724,6 +1782,10 @@ private static final long serialVersionUID = 0L;
       if (other.getVersionCode() != 0) {
         setVersionCode(other.getVersionCode());
       }
+      if (!other.getRootSourceId().isEmpty()) {
+        rootSourceId_ = other.rootSourceId_;
+        onChanged();
+      }
       this.mergeUnknownFields(other.unknownFields);
       onChanged();
       return this;
@@ -3396,6 +3458,82 @@ private static final long serialVersionUID = 0L;
       onChanged();
       return this;
     }
+
+    private java.lang.Object rootSourceId_ = "";
+    /**
+     * <code>string root_source_id = 24;</code>
+     * @return The rootSourceId.
+     */
+    public java.lang.String getRootSourceId() {
+      java.lang.Object ref = rootSourceId_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        rootSourceId_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string root_source_id = 24;</code>
+     * @return The bytes for rootSourceId.
+     */
+    public com.google.protobuf.ByteString
+        getRootSourceIdBytes() {
+      java.lang.Object ref = rootSourceId_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        rootSourceId_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string root_source_id = 24;</code>
+     * @param value The rootSourceId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRootSourceId(
+        java.lang.String value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  
+      rootSourceId_ = value;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string root_source_id = 24;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearRootSourceId() {
+      
+      rootSourceId_ = getDefaultInstance().getRootSourceId();
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string root_source_id = 24;</code>
+     * @param value The bytes for rootSourceId to set.
+     * @return This builder for chaining.
+     */
+    public Builder setRootSourceIdBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+      
+      rootSourceId_ = value;
+      onChanged();
+      return this;
+    }
     @java.lang.Override
     public final Builder setUnknownFields(
         final com.google.protobuf.UnknownFieldSet unknownFields) {

+ 12 - 0
recommend-server-client/src/main/java/com/tzld/piaoquan/recommend/server/gen/recommend/RecommendRequestOrBuilder.java

@@ -296,4 +296,16 @@ public interface RecommendRequestOrBuilder extends
    * @return The versionCode.
    */
   int getVersionCode();
+
+  /**
+   * <code>string root_source_id = 24;</code>
+   * @return The rootSourceId.
+   */
+  java.lang.String getRootSourceId();
+  /**
+   * <code>string root_source_id = 24;</code>
+   * @return The bytes for rootSourceId.
+   */
+  com.google.protobuf.ByteString
+      getRootSourceIdBytes();
 }

+ 1 - 0
recommend-server-client/src/main/proto/com/tzld/piaoquan/recommend/server/recommend.proto

@@ -32,6 +32,7 @@ message RecommendRequest {
   int64 hot_scene_type = 21;
   string client_ip = 22;
   int32 version_code = 23;
+  string root_source_id = 24;
 }
 
 message MachineInfoProto {

+ 1 - 1
recommend-server-service/pom.xml

@@ -175,7 +175,7 @@
         <dependency>
             <groupId>com.tzld.piaoquan</groupId>
             <artifactId>recommend-server-client</artifactId>
-            <version>1.1.5</version>
+            <version>1.1.6</version>
         </dependency>
         <dependency>
             <groupId>com.tzld.piaoquan</groupId>

+ 2 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/RecommendParam.java

@@ -42,5 +42,7 @@ public class RecommendParam {
     private String clientIp;
 
     private Integer versionCode;
+
+    private String rootSourceId;
 }
 

+ 3 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/RecommendService.java

@@ -352,6 +352,7 @@ public class RecommendService {
         param.setHotSceneType(request.getHotSceneType());
         param.setClientIp(request.getClientIp());
         param.setVersionCode(request.getVersionCode());
+        param.setRootSourceId(request.getRootSourceId());
 
         return param;
     }
@@ -415,6 +416,7 @@ public class RecommendService {
 
         recallParam.setHotSceneType(param.getHotSceneType());
         recallParam.setClientIp(param.getClientIp());
+        recallParam.setRootSourceId(param.getRootSourceId());
 
         return recallParam;
     }
@@ -439,6 +441,7 @@ public class RecommendService {
         rankParam.setHeadVid(param.getVideoId());
         rankParam.setHotSceneType(param.getHotSceneType());
         rankParam.setVersionCode(param.getVersionCode());
+        rankParam.setRootSourceId(param.getRootSourceId());
         return rankParam;
     }
 

+ 1 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankParam.java

@@ -30,5 +30,6 @@ public class RankParam {
 
     private Integer categoryId;
     private Integer versionCode;
+    private String rootSourceId;
 
 }

+ 22 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV566.java

@@ -3,6 +3,7 @@ package com.tzld.piaoquan.recommend.server.service.rank.strategy;
 import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
 import com.tzld.piaoquan.recommend.server.model.Video;
 import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
+import com.tzld.piaoquan.recommend.server.util.MathUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.math3.util.Pair;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,19 +20,33 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
     @Autowired
     private RankStrategy4RegionMergeModelV563 modelV563Service;
 
+    @Autowired
+    private RankStrategy4RegionMergeModelV564 modelV564Service;
+
     @Override
     public List<Video> mergeAndRankRovRecall(RankParam param) {
         Map<String, Double> mergeWeight = this.mergeWeight != null ? this.mergeWeight : new HashMap<>(0);
 
-        List<Video> result = modelV563Service.mergeAndRankRovRecall(param);
+        List<Video> result;
+        String rosScoreKey;
+        int baseRankId = mergeWeight.getOrDefault("baseRankId", 563D).intValue();
+        if (564 == baseRankId) {
+            rosScoreKey = "NorXGBScore";
+            result = modelV564Service.mergeAndRankRovRecall(param);
+        } else {
+            rosScoreKey = "hasReturnRovScore";
+            result = modelV563Service.mergeAndRankRovRecall(param);
+        }
         if (null != result && !result.isEmpty()) {
             try {
                 Integer versionCode = param.getVersionCode();
                 int orderVersionCode = mergeWeight.getOrDefault("orderVersionCode", 1500D).intValue();
                 if (null != versionCode && versionCode == orderVersionCode) {
                     int keepTopN = mergeWeight.getOrDefault("keepTopN", 1D).intValue();
+                    boolean useRandFlag = mergeWeight.getOrDefault("useRandFlag", 0D).intValue() > 0;
                     boolean firstRovFlag = mergeWeight.getOrDefault("firstRovFlag", 1D).intValue() > 0;
-                    return resort(keepTopN, firstRovFlag, result);
+                    double rovRandRate = mergeWeight.getOrDefault("rovRandRate", 0.5);
+                    return resort(keepTopN, useRandFlag, firstRovFlag, rovRandRate, rosScoreKey, result);
                 }
             } catch (Exception e) {
                 log.error("diversity resort error", e);
@@ -40,7 +55,7 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
         return result;
     }
 
-    private List<Video> resort(int keepTopN, boolean firstRovFlag, List<Video> videos) {
+    private List<Video> resort(int keepTopN, boolean useRandFlag, boolean firstRovFlag, double rovRandRate, String rosScoreKey, List<Video> videos) {
         Map<Long, Video> videoMap = new HashMap<>();
         List<Pair<Long, Double>> rovList = new ArrayList<>();
         List<Pair<Long, Double>> rosList = new ArrayList<>();
@@ -50,7 +65,7 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
 
             Map<String, Double> scoreMap = video.getScoresMap();
             rovList.add(Pair.create(vid, scoreMap.getOrDefault("fmRov", 0d)));
-            rosList.add(Pair.create(vid, scoreMap.getOrDefault("hasReturnRovScore", 0d)));
+            rosList.add(Pair.create(vid, scoreMap.getOrDefault(rosScoreKey, 0d)));
         }
         rovList.sort(Comparator.comparingDouble(o -> -o.getSecond()));
         rosList.sort(Comparator.comparingDouble(o -> -o.getSecond()));
@@ -69,6 +84,9 @@ public class RankStrategy4RegionMergeModelV566 extends RankStrategy4RegionMergeM
         int rosIndex = 0;
         boolean flag = firstRovFlag;
         for (int i = keepTopN; i < videos.size(); i++) {
+            if (useRandFlag) {
+                flag = MathUtil.nextDouble(0, 1) < rovRandRate;
+            }
             if (flag) {
                 rovIndex = fillVideo(rovIndex, rovList, videoMap, hit, result);
             } else {

+ 22 - 12
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV568.java

@@ -10,6 +10,7 @@ import com.tzld.piaoquan.recommend.server.service.rank.extractor.ExtractorUtils;
 import com.tzld.piaoquan.recommend.server.service.recall.strategy.*;
 import com.tzld.piaoquan.recommend.server.service.score.ScorerUtils;
 import com.tzld.piaoquan.recommend.server.util.CommonCollectionUtils;
+import com.tzld.piaoquan.recommend.server.util.FeatureUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.math3.util.Pair;
@@ -77,18 +78,17 @@ public class RankStrategy4RegionMergeModelV568 extends RankStrategy4RegionMergeM
         sceneCFRosn = sceneCFRosn.subList(0, Math.min(mergeWeight.getOrDefault("sceneCFRosn", 5.0).intValue(), sceneCFRosn.size()));
         rovRecallRank.addAll(sceneCFRosn);
         setVideo.addAll(sceneCFRosn.stream().map(Video::getVideoId).collect(Collectors.toSet()));
-        //-------------------省份ros指标实时召回------------------
-        List<Video> hourROSRecall = extractAndSort(param, RegionRealtimeRecallStrategyROS.PUSH_FORM);
-        hourROSRecall = hourROSRecall.stream().filter(r -> !setVideo.contains(r.getVideoId())).collect(Collectors.toList());
-        hourROSRecall = hourROSRecall.subList(0, Math.min(mergeWeight.getOrDefault("hourROSRecall", 5.0).intValue(), hourROSRecall.size()));
-        rovRecallRank.addAll(hourROSRecall);
-        setVideo.addAll(hourROSRecall.stream().map(Video::getVideoId).collect(Collectors.toSet()));
-        //-------------------长周期ros------------------
-        List<Video> LongTermROSRecall = extractAndSort(param, RegionRealtimeRecallStrategyV7LongTermV1.PUSH_FORM);
-        LongTermROSRecall = LongTermROSRecall.stream().filter(r -> !setVideo.contains(r.getVideoId())).collect(Collectors.toList());
-        LongTermROSRecall = LongTermROSRecall.subList(0, Math.min(mergeWeight.getOrDefault("LongTermROSRecall", 1.0).intValue(), LongTermROSRecall.size()));
-        rovRecallRank.addAll(LongTermROSRecall);
-        setVideo.addAll(LongTermROSRecall.stream().map(Video::getVideoId).collect(Collectors.toSet()));
+        if (FeatureUtils.lowFissionChannel(param.getRootSourceId())) {
+            // head cate1 str
+            int headCate1StrN = mergeWeight.getOrDefault("headCate1StrN", 5.0).intValue();
+            addRecall(param, headCate1StrN, HeadCate1STRRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+            // head cate2 str
+            int headCate2StrN = mergeWeight.getOrDefault("headCate2StrN", 5.0).intValue();
+            addRecall(param, headCate2StrN, HeadCate2STRRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+            // province str
+            int provinceStrN = mergeWeight.getOrDefault("provinceStrN", 5.0).intValue();
+            addRecall(param, provinceStrN, ProvinceSTRRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        }
 
         //-------------------排-------------------
         //-------------------序-------------------
@@ -357,4 +357,14 @@ public class RankStrategy4RegionMergeModelV568 extends RankStrategy4RegionMergeM
         result.sort(Comparator.comparingDouble(o -> -o.getSortScore()));
         return result;
     }
+
+    private void addRecall(RankParam param, int recallNum, String recallName, Set<Long> setVideo, List<Video> rovRecallRank) {
+        if (recallNum > 0) {
+            List<Video> list = extractAndSort(param, recallName);
+            list = list.stream().filter(r -> !setVideo.contains(r.getVideoId())).collect(Collectors.toList());
+            list = list.subList(0, Math.min(recallNum, list.size()));
+            rovRecallRank.addAll(list);
+            setVideo.addAll(list.stream().map(Video::getVideoId).collect(Collectors.toSet()));
+        }
+    }
 }

+ 5 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV569.java

@@ -227,13 +227,17 @@ public class RankStrategy4RegionMergeModelV569 extends RankStrategy4RegionMergeM
             double originScoreRos = item.getScoreRos();
             double scoreRos = this.handleRos(originScoreRos, calcRosMode, item, mergeWeight);
 
+            double rosAdd = mergeWeight.getOrDefault("ros_add", 0.00001);
+            double vorAdd = mergeWeight.getOrDefault("vor_add", 0.1);
 
             item.getScoresMap().put("hasReturnRovScore", scoreRos);
             item.getScoresMap().put("vor", vor24h);
             item.getScoresMap().put("calcVorMode", calcVorMode);
             item.getScoresMap().put("calcRosMode", calcRosMode);
             item.getScoresMap().put("RosXGBScore", originScoreRos);
-            score = fmRov * (0.1 + scoreRos) * (0.1 + vor24h);
+            item.getScoresMap().put("rosAdd", rosAdd);
+            item.getScoresMap().put("vorAdd", vorAdd);
+            score = fmRov * (rosAdd + scoreRos) * (vorAdd + vor24h);
 
 
             Video video = item.getVideo();

+ 1 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallParam.java

@@ -31,5 +31,6 @@ public class RecallParam {
     private String clientIp;
 
     private boolean riskUser;
+    private String rootSourceId;
 
 }

+ 6 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/RecallService.java

@@ -5,6 +5,7 @@ import com.tzld.piaoquan.recommend.server.common.ThreadPoolFactory;
 import com.tzld.piaoquan.recommend.server.common.enums.AppTypeEnum;
 import com.tzld.piaoquan.recommend.server.model.Video;
 import com.tzld.piaoquan.recommend.server.service.recall.strategy.*;
+import com.tzld.piaoquan.recommend.server.util.FeatureUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -120,6 +121,11 @@ public class RecallService implements ApplicationContextAware {
             strategies.add(strategyMap.get(HeadProvinceCate1RecallStrategy.class.getSimpleName()));
             strategies.add(strategyMap.get(HeadProvinceCate2RecallStrategy.class.getSimpleName()));
         }
+        if (CollectionUtils.isNotEmpty(abExpCodes) && abExpCodes.contains("568") && FeatureUtils.lowFissionChannel(param.getRootSourceId())) {
+            strategies.add(strategyMap.get(HeadCate1STRRecallStrategy.class.getSimpleName()));
+            strategies.add(strategyMap.get(HeadCate2STRRecallStrategy.class.getSimpleName()));
+            strategies.add(strategyMap.get(ProvinceSTRRecallStrategy.class.getSimpleName()));
+        }
 
         // 命中用户黑名单不走流量池
         if (!param.isRiskUser()) {

+ 105 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate1STRRecallStrategy.java

@@ -0,0 +1,105 @@
+package com.tzld.piaoquan.recommend.server.service.recall.strategy;
+
+import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.FeatureService;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterParam;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterResult;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterService;
+import com.tzld.piaoquan.recommend.server.service.recall.FilterParamFactory;
+import com.tzld.piaoquan.recommend.server.service.recall.RecallParam;
+import com.tzld.piaoquan.recommend.server.service.recall.RecallStrategy;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Component
+@Slf4j
+public class HeadCate1STRRecallStrategy implements RecallStrategy {
+    private final String CLASS_NAME = this.getClass().getSimpleName();
+    @Autowired
+    private FilterService filterService;
+    @Autowired
+    @Qualifier("redisTemplate")
+    public RedisTemplate<String, String> redisTemplate;
+
+    @Autowired
+    private FeatureService featureService;
+
+    public static final String PUSH_FORM = "recall_strategy_head_cate1_str";
+    public static final String redisKeyPrefix = "merge_cate_str_recall:cate1";
+
+    @Override
+    public String pushFrom() {
+        return PUSH_FORM;
+    }
+
+    @Override
+    public List<Video> recall(RecallParam param) {
+        List<Video> videosResult = new ArrayList<>();
+        try {
+            if (null == param.getVideoId() || 0 == param.getVideoId()) {
+                return videosResult;
+            }
+            Long headVid = param.getVideoId();
+            Map<String, String> headVideoInfo = featureService.getHeadVideoInfo(String.valueOf(headVid));
+            if (null != headVideoInfo) {
+                String cate = headVideoInfo.getOrDefault("merge_first_level_cate", "").trim();
+                if (!cate.isEmpty() && !"unknown".equals(cate)) {
+                    String key = String.format("%s:%s", redisKeyPrefix, cate);
+                    String value = redisTemplate.opsForValue().get(key);
+                    if (null == value || value.isEmpty()) {
+                        return videosResult;
+                    }
+                    List<Long> vidList = parseVidList(headVid, value);
+                    fillVideoResult(param, vidList, videosResult);
+                }
+            }
+        } catch (Exception e) {
+            log.error("recall is wrong in {}, error={}", CLASS_NAME, e);
+        }
+        return videosResult;
+    }
+
+    private List<Long> parseVidList(Long headVid, String data) {
+        List<Long> vidList = new ArrayList<>();
+        if (null != data && !data.isEmpty()) {
+            String[] pair = data.split("\t");
+            if (2 == pair.length) {
+                Set<Long> hit = new HashSet<>();
+                hit.add(headVid);
+                List<Long> ids = Arrays.stream(pair[0].split(",")).map(Long::valueOf).collect(Collectors.toList());
+                if (!ids.isEmpty()) {
+                    for (Long id : ids) {
+                        if (!hit.contains(id)) {
+                            hit.add(id);
+                            vidList.add(id);
+                        }
+                    }
+                }
+            }
+        }
+        return vidList;
+    }
+
+    private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
+        FilterParam filterParam = FilterParamFactory.create(param, vidList);
+        FilterResult filterResult = filterService.filter(filterParam);
+        if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
+            List<Long> filterIds = filterResult.getVideoIds();
+            int n = filterIds.size();
+            for (int i = 0; i < n; i++) {
+                Video video = new Video();
+                video.setVideoId(filterIds.get(i));
+                video.setRovScore(n - i);
+                video.setPushFrom(pushFrom());
+                videosResult.add(video);
+            }
+        }
+    }
+}

+ 105 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/HeadCate2STRRecallStrategy.java

@@ -0,0 +1,105 @@
+package com.tzld.piaoquan.recommend.server.service.recall.strategy;
+
+import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.FeatureService;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterParam;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterResult;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterService;
+import com.tzld.piaoquan.recommend.server.service.recall.FilterParamFactory;
+import com.tzld.piaoquan.recommend.server.service.recall.RecallParam;
+import com.tzld.piaoquan.recommend.server.service.recall.RecallStrategy;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Component
+@Slf4j
+public class HeadCate2STRRecallStrategy implements RecallStrategy {
+    private final String CLASS_NAME = this.getClass().getSimpleName();
+    @Autowired
+    private FilterService filterService;
+    @Autowired
+    @Qualifier("redisTemplate")
+    public RedisTemplate<String, String> redisTemplate;
+
+    @Autowired
+    private FeatureService featureService;
+
+    public static final String PUSH_FORM = "recall_strategy_head_cate2_str";
+    public static final String redisKeyPrefix = "merge_cate_str_recall:cate2";
+
+    @Override
+    public String pushFrom() {
+        return PUSH_FORM;
+    }
+
+    @Override
+    public List<Video> recall(RecallParam param) {
+        List<Video> videosResult = new ArrayList<>();
+        try {
+            if (null == param.getVideoId() || 0 == param.getVideoId()) {
+                return videosResult;
+            }
+            Long headVid = param.getVideoId();
+            Map<String, String> headVideoInfo = featureService.getHeadVideoInfo(String.valueOf(headVid));
+            if (null != headVideoInfo) {
+                String cate = headVideoInfo.getOrDefault("merge_second_level_cate", "").trim();
+                if (!cate.isEmpty() && !"unknown".equals(cate)) {
+                    String key = String.format("%s:%s", redisKeyPrefix, cate);
+                    String value = redisTemplate.opsForValue().get(key);
+                    if (null == value || value.isEmpty()) {
+                        return videosResult;
+                    }
+                    List<Long> vidList = parseVidList(headVid, value);
+                    fillVideoResult(param, vidList, videosResult);
+                }
+            }
+        } catch (Exception e) {
+            log.error("recall is wrong in {}, error={}", CLASS_NAME, e);
+        }
+        return videosResult;
+    }
+
+    private List<Long> parseVidList(Long headVid, String data) {
+        List<Long> vidList = new ArrayList<>();
+        if (null != data && !data.isEmpty()) {
+            String[] pair = data.split("\t");
+            if (2 == pair.length) {
+                Set<Long> hit = new HashSet<>();
+                hit.add(headVid);
+                List<Long> ids = Arrays.stream(pair[0].split(",")).map(Long::valueOf).collect(Collectors.toList());
+                if (!ids.isEmpty()) {
+                    for (Long id : ids) {
+                        if (!hit.contains(id)) {
+                            hit.add(id);
+                            vidList.add(id);
+                        }
+                    }
+                }
+            }
+        }
+        return vidList;
+    }
+
+    private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
+        FilterParam filterParam = FilterParamFactory.create(param, vidList);
+        FilterResult filterResult = filterService.filter(filterParam);
+        if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
+            List<Long> filterIds = filterResult.getVideoIds();
+            int n = filterIds.size();
+            for (int i = 0; i < n; i++) {
+                Video video = new Video();
+                video.setVideoId(filterIds.get(i));
+                video.setRovScore(n - i);
+                video.setPushFrom(pushFrom());
+                videosResult.add(video);
+            }
+        }
+    }
+}

+ 95 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/recall/strategy/ProvinceSTRRecallStrategy.java

@@ -0,0 +1,95 @@
+package com.tzld.piaoquan.recommend.server.service.recall.strategy;
+
+import com.tzld.piaoquan.recommend.server.model.Video;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterParam;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterResult;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterService;
+import com.tzld.piaoquan.recommend.server.service.recall.FilterParamFactory;
+import com.tzld.piaoquan.recommend.server.service.recall.RecallParam;
+import com.tzld.piaoquan.recommend.server.service.recall.RecallStrategy;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Component
+@Slf4j
+public class ProvinceSTRRecallStrategy implements RecallStrategy {
+    private final String CLASS_NAME = this.getClass().getSimpleName();
+    @Autowired
+    private FilterService filterService;
+    @Autowired
+    @Qualifier("redisTemplate")
+    public RedisTemplate<String, String> redisTemplate;
+
+    public static final String PUSH_FORM = "recall_strategy_province_str";
+    public static final String redisKeyPrefix = "province_str_recall";
+
+    @Override
+    public String pushFrom() {
+        return PUSH_FORM;
+    }
+
+    @Override
+    public List<Video> recall(RecallParam param) {
+        List<Video> videosResult = new ArrayList<>();
+        try {
+            String province = param.getProvince().replaceAll("省$", "");
+            if (province.isEmpty()) {
+                return videosResult;
+            }
+            String key = String.format("%s:%s", redisKeyPrefix, province);
+            String value = redisTemplate.opsForValue().get(key);
+            if (null == value || value.isEmpty()) {
+                return videosResult;
+            }
+            List<Long> vidList = parseVidList(param.getVideoId(), value);
+            fillVideoResult(param, vidList, videosResult);
+        } catch (Exception e) {
+            log.error("recall is wrong in {}, error={}", CLASS_NAME, e);
+        }
+        return videosResult;
+    }
+
+    private List<Long> parseVidList(Long headVid, String data) {
+        List<Long> vidList = new ArrayList<>();
+        if (null != data && !data.isEmpty()) {
+            String[] pair = data.split("\t");
+            if (2 == pair.length) {
+                Set<Long> hit = new HashSet<>();
+                hit.add(headVid);
+                List<Long> ids = Arrays.stream(pair[0].split(",")).map(Long::valueOf).collect(Collectors.toList());
+                if (!ids.isEmpty()) {
+                    for (Long id : ids) {
+                        if (!hit.contains(id)) {
+                            hit.add(id);
+                            vidList.add(id);
+                        }
+                    }
+                }
+            }
+        }
+        return vidList;
+    }
+
+    private void fillVideoResult(RecallParam param, List<Long> vidList, List<Video> videosResult) {
+        FilterParam filterParam = FilterParamFactory.create(param, vidList);
+        FilterResult filterResult = filterService.filter(filterParam);
+        if (filterResult != null && CollectionUtils.isNotEmpty(filterResult.getVideoIds())) {
+            List<Long> filterIds = filterResult.getVideoIds();
+            int n = filterIds.size();
+            for (int i = 0; i < n; i++) {
+                Video video = new Video();
+                video.setVideoId(filterIds.get(i));
+                video.setRovScore(n - i);
+                video.setPushFrom(pushFrom());
+                videosResult.add(video);
+            }
+        }
+    }
+}

+ 10 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/util/FeatureUtils.java

@@ -17,9 +17,11 @@ public class FeatureUtils {
     private static final String goodMorningRegex = "(早安|早上好|早晨好|上午好)";
     private static final String goodAfternoonRegex = "(午安|中午好|下午好)";
     private static final String goodEveningRegex = "(晚安|晚上好)";
+    private static final String lowFissionChannelRegex = "(longArticles_|dyyjs_|daitou_tencentgzh|DaiTou_gh)";
     private static final Pattern goodMorningPattern = Pattern.compile(goodMorningRegex);
     private static final Pattern goodAfternoonPattern = Pattern.compile(goodAfternoonRegex);
     private static final Pattern goodEveningPattern = Pattern.compile(goodEveningRegex);
+    private static final Pattern lowFissionChannelPattern = Pattern.compile(lowFissionChannelRegex);
 
     static {
         cate1MAP.put("情感", 1);
@@ -146,4 +148,12 @@ public class FeatureUtils {
     public static boolean greaterThanZero(double value) {
         return value > 1E-8;
     }
+
+    public static boolean lowFissionChannel(String s) {
+        if (null != s && !s.isEmpty()) {
+            Matcher morning = lowFissionChannelPattern.matcher(s);
+            return morning.find();
+        }
+        return false;
+    }
 }