Bladeren bron

feature define 1204

sunmingze 1 jaar geleden
bovenliggende
commit
188bd7886e
15 gewijzigde bestanden met toevoegingen van 406 en 47 verwijderingen
  1. 33 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/ItemFeature.java
  2. 11 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/RankItem.java
  3. 21 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/RequestContext.java
  4. 33 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/RequestContextBytesFeature.java
  5. 17 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/UserActionFeature.java
  6. 66 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/UserBytesFeature.java
  7. 17 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/UserFeature.java
  8. 81 1
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/VideoBytesFeature.java
  9. 23 6
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/enums/VlogFeatureGroup.java
  10. 49 4
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/ScorerPipeline.java
  11. 4 4
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/VlogShareGBDTScorer.java
  12. 30 21
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/VlogShareLRScorer.java
  13. 17 4
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/feature/VlogShareLRFeatureExtractor.java
  14. 2 3
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/model/GBDTModel.java
  15. 2 0
      recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/model/LRModel.java

+ 33 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/ItemFeature.java

@@ -0,0 +1,33 @@
+package com.tzld.piaoquan.recommend.server.common.base;
+
+import lombok.Data;
+
+@Data
+public class ItemFeature {
+    private String videoId;
+
+    private String upId;
+
+    private String tags;
+
+    private String title;
+
+    private String titleLength;
+
+    private String playLength;
+
+    private String totolTime;
+
+    private String daysSinceUpload;
+
+
+    // 当天统计量信息
+    private UserActionFeature item_day1_cnt_features;
+    // 3天内统计量
+    private UserActionFeature item_day3_cnt_features;
+    // 7天内统计量
+    private UserActionFeature item_day7_cnt_features;
+    // 3个月统计量
+    private UserActionFeature item_month3_cnt_features;
+
+}

+ 11 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/RankItem.java

@@ -1,17 +1,27 @@
 package com.tzld.piaoquan.recommend.server.common.base;
 
 import com.tzld.piaoquan.recommend.server.model.Video;
+import lombok.Data;
 
+import java.util.Map;
+
+
+@Data
 public class RankItem implements Comparable<RankItem> {
     public long videoid;
-    private double rankScore;
+    private double score; // 记录最终的score
 
+    // 记录Item侧用到的特征
+    private ItemFeature itemFeature;
 
     public RankItem(Video video) {
         this.videoid = video.getVideoId() ;
         this.rankScore = 0.0 ;
     }
 
+    private Map<String, Double> rankerScore;
+    private Map<String, Integer> rankerIndex;
+
 
     @Override
     public int compareTo(RankItem o) {

+ 21 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/RequestContext.java

@@ -5,5 +5,25 @@ import lombok.Data;
 
 @Data
 public class RequestContext {
-    String cityCode;
+
+    private String request_id;
+    // 机型等信息
+    private String apptype;
+    private String machineinfo_brand;
+    private String machineinfo_model;
+    private String machineinfo_platform;
+    private String machineinfo_sdkversion;
+    private String machineinfo_system;
+    private String machineinfo_wechatversion;
+
+    // 时间等信息
+    private String day;
+    private String week;
+    private String hour;
+    private String region;
+    private String city;
+
+
+
+
 }

+ 33 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/RequestContextBytesFeature.java

@@ -1,11 +1,44 @@
 package com.tzld.piaoquan.recommend.server.common.base;
 
 
+import lombok.Data;
 
+@Data
 public class RequestContextBytesFeature {
+    private final byte[] apptype;
+    private final byte[]  machineinfo_brand;
+    private final byte[]  machineinfo_model;
+    private final byte[]  machineinfo_platform;
+    private final byte[]  machineinfo_sdkversion;
+    private final byte[]  machineinfo_system;
+    private final byte[]  machineinfo_wechatversion;
+
+    // 时间等信息
+    private final byte[]  day;
+    private final byte[]  week;
+    private final byte[]  hour;
+    private final byte[]  region;
+    private final byte[]  city;
 
 
     public RequestContextBytesFeature(RequestContext requestContext){
+        apptype = requestContext.getApptype().getBytes();
+        machineinfo_brand = requestContext.getMachineinfo_brand().getBytes();
+        machineinfo_model = requestContext.getMachineinfo_model().getBytes();
+        machineinfo_platform = requestContext.getMachineinfo_platform().getBytes();
+        machineinfo_sdkversion = requestContext.getMachineinfo_sdkversion().getBytes();
+        machineinfo_system = requestContext.getMachineinfo_system().getBytes();
+        machineinfo_wechatversion = requestContext.getMachineinfo_wechatversion().getBytes();
 
+        day = requestContext.getDay().getBytes();
+        week = requestContext.getWeek().getBytes();
+        hour = requestContext.getHour().getBytes();
+        region = requestContext.getRegion().getBytes();
+        city = requestContext.getCity().getBytes();
     }
+
+
+
+
+
 }

+ 17 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/UserActionFeature.java

@@ -0,0 +1,17 @@
+package com.tzld.piaoquan.recommend.server.common.base;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class UserActionFeature {
+    private double exp_cnt;
+    private double click_cnt;
+    private double share_cnt;
+    private double return_cnt;
+
+    private double ctr;
+    private double str;
+    private double rov;
+}

+ 66 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/UserBytesFeature.java

@@ -2,9 +2,74 @@ package com.tzld.piaoquan.recommend.server.common.base;
 import io.lettuce.core.StrAlgoArgs;
 import lombok.Data;
 
+import java.util.Map;
+
 @Data
 public class UserBytesFeature {
-    public final byte[]  sex;
+
+    private final byte[]  mid;
+    private final byte[]  uid;
+
+    // 当天统计量信息
+    private Map<String, byte[]> day1_cnt_features;
+    // 3天内统计量
+    private Map<String, byte[]> day3_cnt_features;
+    // 7天内统计量
+    private Map<String, byte[]> day7_cnt_features;
+    // 3个月统计量
+    private Map<String, byte[]> month3_cnt_features;
+    // 用户行为周期
+    private final byte[]  user_cycle_bucket_7days;
+    private final byte[]  user_cycle_bucket_30days;
+    private final byte[]  user_share_bucket_30days;
+
+
+    public UserBytesFeature(UserFeature userFeature) {
+        mid = userFeature.getMid().getBytes();
+        uid = userFeature.getUid().getBytes();
+        user_cycle_bucket_7days = userFeature.getUser_cycle_bucket_7days().getBytes();
+        user_cycle_bucket_30days = userFeature.getUser_cycle_bucket_30days().getBytes();
+        user_share_bucket_30days = userFeature.getUser_share_bucket_30days().getBytes();
+
+
+        // 1 day statistic
+        day1_cnt_features.put("exp", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("click", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("share", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("return", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("ctr", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("str", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("rov", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+
+        // 3 day statistic
+        day1_cnt_features.put("exp", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("click", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("share", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("return", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("ctr", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("str", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("rov", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+
+        // 7 day statistic
+        day1_cnt_features.put("exp", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("click", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("share", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("return", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("ctr", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("str", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("rov", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+
+
+        // 3 month statisic
+        day1_cnt_features.put("exp", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("click", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("share", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("return", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("ctr", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("str", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+        day1_cnt_features.put("rov", String.valueOf(userFeature.getDay1_cnt_features().getExp_cnt()).getBytes());
+
+    }
 
 
 

+ 17 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/UserFeature.java

@@ -2,8 +2,24 @@ package com.tzld.piaoquan.recommend.server.common.base;
 
 import lombok.Data;
 
+import java.util.Map;
+
 @Data
 public class UserFeature {
-    private String sex;
+    private String mid;
+    private String uid;
+
+    // 当天统计量信息
+    private UserActionFeature day1_cnt_features;
+    // 3天内统计量
+    private UserActionFeature day3_cnt_features;
+    // 7天内统计量
+    private UserActionFeature day7_cnt_features;
+    // 3个月统计量
+    private UserActionFeature month3_cnt_features;
+    // 用户行为周期
+    private String user_cycle_bucket_7days;
+    private String user_cycle_bucket_30days;
+    private String user_share_bucket_30days;
 
 }

+ 81 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/base/VideoBytesFeature.java

@@ -3,10 +3,90 @@ package com.tzld.piaoquan.recommend.server.common.base;
 import com.tzld.piaoquan.recommend.server.model.Video;
 import lombok.Data;
 
+import java.util.Map;
+@Data
 public class VideoBytesFeature {
     private final byte[] videoId;
 
-    public VideoBytesFeature(RankItem video) {
+    private final byte[] upId;
+
+    private final byte[] tags;
+
+    private final byte[] title;
+
+    private final byte[] titleLength;
+
+    private final byte[] playLength;
+
+    private final byte[] totolTime;
+
+    private final byte[] daysSinceUpload;
+
+
+    // 当天统计量信息
+    private Map<String, byte[]> item_day1_cnt_features;
+    // 3天内统计量
+    private Map<String, byte[]> item_day3_cnt_features;
+    // 7天内统计量
+    private Map<String, byte[]> item_day7_cnt_features;
+    // 3个月统计量
+    private Map<String, byte[]> item_month3_cnt_features;
+
+    public VideoBytesFeature(ItemFeature itemFeature) {
+        videoId  = itemFeature.getVideoId().getBytes();
+        upId  = itemFeature.getVideoId().getBytes();
+
+        tags  = itemFeature.getTags().getBytes();
+        title  = itemFeature.getTitle().getBytes();
+        titleLength  = itemFeature.getTitleLength().getBytes();
+        playLength  = itemFeature.getPlayLength().getBytes();
+        totolTime  = itemFeature.getTotolTime().getBytes();
+        daysSinceUpload  = itemFeature.getDaysSinceUpload().getBytes();
+        // 1day
+        item_day1_cnt_features.put("exp", String.valueOf(itemFeature.getItem_day1_cnt_features().getExp_cnt()).getBytes());
+        item_day1_cnt_features.put("click", String.valueOf(itemFeature.getItem_day1_cnt_features().getExp_cnt()).getBytes());
+        item_day1_cnt_features.put("share", String.valueOf(itemFeature.getItem_day1_cnt_features().getExp_cnt()).getBytes());
+        item_day1_cnt_features.put("return", String.valueOf(itemFeature.getItem_day1_cnt_features().getExp_cnt()).getBytes());
+        item_day1_cnt_features.put("ctr", String.valueOf(itemFeature.getItem_day1_cnt_features().getExp_cnt()).getBytes());
+        item_day1_cnt_features.put("str", String.valueOf(itemFeature.getItem_day1_cnt_features().getExp_cnt()).getBytes());
+        item_day1_cnt_features.put("rov", String.valueOf(itemFeature.getItem_day1_cnt_features().getExp_cnt()).getBytes());
+
+        // 3day
+        item_day3_cnt_features.put("exp", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_day3_cnt_features.put("click", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_day3_cnt_features.put("share", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_day3_cnt_features.put("return", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_day3_cnt_features.put("ctr", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_day3_cnt_features.put("str", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_day3_cnt_features.put("rov", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+
+
+        // 7day
+        item_day3_cnt_features.put("exp", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_day3_cnt_features.put("click", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_day3_cnt_features.put("share", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_day3_cnt_features.put("return", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_day3_cnt_features.put("ctr", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_day3_cnt_features.put("str", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_day3_cnt_features.put("rov", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+
+
+
+        // 3month
+        item_month3_cnt_features.put("exp", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_month3_cnt_features.put("click", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_month3_cnt_features.put("share", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_month3_cnt_features.put("return", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_month3_cnt_features.put("ctr", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_month3_cnt_features.put("str", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+        item_month3_cnt_features.put("rov", String.valueOf(itemFeature.getItem_day3_cnt_features().getExp_cnt()).getBytes());
+
+
+
+
+
+
+
 
     }
 

+ 23 - 6
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/common/enums/VlogFeatureGroup.java

@@ -1,16 +1,33 @@
 package com.tzld.piaoquan.recommend.server.common.enums;
 
 public enum VlogFeatureGroup {
+
     // video
+    APPTYP,
     VIDEOID,
-
-    // context
-    DAY_OF_WEEK,
-    SEX,
+    MID,
+    UID,
+    MACHINEINFO_BRAND,
+    MACHINEINFO_MODEL,
+    MACHINEINFO_PLATFORM,
+    MACHINEINFO_SDKVERSION,
+    MACHINEINFO_SYSTEM,
+    MACHINEINFO_WECHATVERSION,
+
+    UP_ID,
+    TITLE_LEN,
+    PLAY_LEN,
+    TOTAL_TIME,
+    DAYS_SINCE_UPLOAD,
+    DAY,
+    WEEK,
+    HOUR,
+
+    USER_CYCLE_BUCKET_7DAY,
+    USER_CYCLE_BUCKET_30DAY,
+    USER_SHARE_BUCKET_30DAY,
     ;
 
-    // user
-
 
     private final byte[] idBytes;
     private final byte[] nameBytes;

+ 49 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/ScorerPipeline.java

@@ -51,6 +51,8 @@ public class ScorerPipeline {
             // log.error()
         }
         long scoreStart = System.currentTimeMillis();
+        List<RankItem> items = rankItems;
+
         for (final AbstractScorer scorer : scorers) {
             if (!scorer.isEnable()) {
                 continue;
@@ -63,18 +65,61 @@ public class ScorerPipeline {
             String[] scorerNames = fullScorerName.split("\\.");
             final String scorerName = scorerNames.length > 0 ? scorerNames[scorerNames.length - 1] : fullScorerName;
 
-            final List<RankItem> scoreRankerItems = rankItems;
-            Callable<List<RankItem>> callable = new Callable<List<Video>>() {
+            final List<RankItem> scoreRankerItems = items;
+            Callable<List<RankItem>> callable = new Callable<List<RankItem>>() {
                 @Override
                 public List<RankItem> call() throws Exception {
-                    return scorer.scoring(recommendRequest, param, userFeature, rankItems);
+                    return scorer.scoring(recommendRequest, param, userFeature, scoreRankerItems);
                 }
             };
+
+            // execute score use thread to protected score worst time
+            List<RankItem> scoredItems = new ArrayList<RankItem>();
+            try {
+                List<Future<List<RankItem>>> futures = executorService.invokeAll(Arrays.asList(callable), SCORE_TIME_OUT, TimeUnit.MILLISECONDS);
+                for (Future<List<RankItem>> future : futures) {
+                    try {
+                        if (future.isDone() && !future.isCancelled() && future.get() != null) {
+                            scoredItems.addAll(future.get());
+                        } else {
+                            LOGGER.error("score task is cancelled, scorename [{}] fail items [{}]",
+                                    new Object[]{scorerName, scoreRankerItems.size()});
+                        }
+                    } catch (Exception e) {
+                        LOGGER.error("thread pool exception scorename [{}], exception [{}]",
+                                new Object[]{scorerName, ExceptionUtils.getFullStackTrace(e)});
+                    }
+                }
+            } catch (Exception e) {
+                LOGGER.error("thread pool exception uid [{}] scorename [{}], exception [{}]",
+                        new Object[]{scorerName, ExceptionUtils.getFullStackTrace(e)});
+            }
+
+            //  变更item
+            if (CollectionUtils.isNotEmpty(scoreRankerItems)) {
+                items = scoreRankerItems;
+            } else {
+                items = new ArrayList<>(items);
+            }
+
+            int position = 0;
+            for (RankItem item : items) {
+                item.getRankerIndex().put(scorerName, position++);
+                item.getRankerScore().put(scorerName, item.getScore());
+            }
+
            //
             long spentTime = System.currentTimeMillis() - startTime;
             LOGGER.debug("after scorer [{}], spentTime [{}], before size [{}], remaining size [{}]",
-                    new Object[]{scorerName, spentTime, beforeSize, items.size()});
+                    new Object[]{scorerName, spentTime, beforeSize, scoreRankerItems.size()});
         }
+
+        int position = 0;
+        for (RankItem item : items) {
+            item.getRankerIndex().put("finalScore", position++);
+            item.getRankerScore().put("finalScore", item.getScore());
+        }
+
         return items;
     }
 }

+ 4 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/VlogShareGBDTScorer.java

@@ -98,7 +98,7 @@ public class VlogShareGBDTScorer extends BaseGBDTModelScorer {
         return newScore;
     }
 
-    private void gbdtBaseScore(final Video item,
+    private void gbdtBaseScore(final RankItem item,
                                 final GBDTModel model,
                                 final RequestContext requestContext,
                                 final Map<String, Double> userFeatures,
@@ -116,11 +116,11 @@ public class VlogShareGBDTScorer extends BaseGBDTModelScorer {
                 double pro = model.score(features, featureScoreMap);
                 featureScoreMap.put("TOTAL_SCORE", pro);
                 pro = pro > 1 ? pro : 1;
-                Double rankScore = item.getRankScore();
+                Double rankScore = item.getScore();
                 LOGGER.debug("xgb score = {}, lgb score = {}", rankScore, pro);
                 double lgbWeight = 1.0;
                 pro = (rankScore + lgbWeight * pro) / (1.0 + lgbWeight);
-                item.setRankScore(pro);
+                item.setScore(pro);
             }
 
         } catch (Exception e) {
@@ -129,7 +129,7 @@ public class VlogShareGBDTScorer extends BaseGBDTModelScorer {
     }
 
 
-    public void multipleGBDTScore(final List<Video> items,
+    public void multipleGBDTScore(final List<RankItem> items,
                                        final GBDTModel model,
                                        final UserFeature user,
                                        final RecommendRequest requestData,

+ 30 - 21
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/VlogShareLRScorer.java

@@ -27,7 +27,8 @@ import java.util.concurrent.*;
 public class VlogShareLRScorer extends BaseLRModelScorer{
 
     private final static int CORE_POOL_SIZE = 64;
-    private final static int TIME_OUT = 150;
+
+    private static final int LOCAL_TIME_OUT= 150;
     private final static Logger LOGGER = LoggerFactory.getLogger(VlogShareLRScorer.class);
     private static final ExecutorService executorService = Executors.newFixedThreadPool(128);
     private static final FeatureUsage featureUsage = new FeatureUsage();
@@ -53,7 +54,6 @@ public class VlogShareLRScorer extends BaseLRModelScorer{
             return rankItems;
         }
 
-
         List<RankItem> result = rankItems;
         result = rankByJava(rankItems, request, userFeature);
 
@@ -70,13 +70,14 @@ public class VlogShareLRScorer extends BaseLRModelScorer{
         LRModel model = (LRModel) this.getModel();
         LOGGER.debug("model size: [{}]", model.getModelSize());
 
+        // init request context
         String cityCode = request.getCityCode();
         RequestContext requestContext = new RequestContext();
-        requestContext.setCityCode(cityCode);
-
+        requestContext.setCity(request.getCityCode());
 
+        // userBytes
         UserBytesFeature userInfoBytes = null;
-        userInfoBytes = new UserBytesFeature(user.getSex());
+        userInfoBytes = new UserBytesFeature(user);
 
         // 所有都参与打分,按照ctr排序
         multipleCtrScore(items, userInfoBytes, requestContext, model);
@@ -110,11 +111,11 @@ public class VlogShareLRScorer extends BaseLRModelScorer{
         bytesFeatureExtractor = new VlogShareLRFeatureExtractor(featureUsage, 100.0, 1);
 
         try {
-            VideoBytesFeature newsInfoBytes = new VideoBytesFeature(item);
+            VideoBytesFeature newsInfoBytes = new VideoBytesFeature(item.getItemFeature());
             lrSamples = bytesFeatureExtractor.single(userInfoBytes, newsInfoBytes,
                     new RequestContextBytesFeature(requestContext));
         } catch (Exception e) {
-            LOGGER.error("extract feature error for imei={}, doc={}, [{}]", new Object[]{new String(userInfoBytes.imei), item.getId(),
+            LOGGER.error("extract feature error for imei={}, doc={}, [{}]", new Object[]{new String(userInfoBytes.getUid()), item.getVideoid(),
                     ExceptionUtils.getFullStackTrace(e)});
         }
 
@@ -125,11 +126,11 @@ public class VlogShareLRScorer extends BaseLRModelScorer{
                 pro = lrModel.score(lrSamples);
             } catch (Exception e) {
                 LOGGER.error("score error for doc={} exception={}", new Object[]{
-                        item.getVideoId(), ExceptionUtils.getFullStackTrace(e)});
+                        item.getVideoid(), ExceptionUtils.getFullStackTrace(e)});
             }
 
 
-            CtrSamples samples = CtrSamples.newBuilder();
+            CtrSamples.Builder samples =  com.tzld.piaoquan.recommend.server.gen.recommend.CtrSamples.newBuilder();
             samples.setLr_samples(lrSamples);
             item.setSamples(samples);
         }
@@ -143,22 +144,31 @@ public class VlogShareLRScorer extends BaseLRModelScorer{
      * 并行打分
      *
      */
-    private void multipleCtrScore(final RecommendRequest request,
-                                  final RankParam param,
-                                  final UserFeature userFeature,
-                                  final List<RankItem> rankItems) {
+
+    /**
+     * 并行打分
+     *
+     * @param items
+     * @param userInfoBytes
+     * @param requestContext
+     * @param model
+     */
+    private void multipleCtrScore(final List<RankItem> items,
+                                  final UserBytesFeature userInfoBytes,
+                                  final RequestContext requestContext,
+                                  final LRModel model) {
 
         List<Callable<Object>> calls = new ArrayList<Callable<Object>>();
-        for (int index = 0; index < rankItems.size(); index++) {
+        for (int index = 0; index < items.size(); index++) {
             final int fIndex = index;
-            rankItems.get(fIndex).setRankScore(0.0);//原始分为 cube中的粗打分,如果超时,为原始值存在问题, 需要置0
+            items.get(fIndex).setScore(0.0);   //原始分为 cube中的粗打分,如果超时,为原始值存在问题, 需要置0
             calls.add(new Callable<Object>() {
                 @Override
                 public Object call() throws Exception {
                     try {
-                        calcScore(model, items.get(fIndex), userInfoBytes, requestContext, feedsContext);
+                        calcScore(model, items.get(fIndex), userInfoBytes, requestContext);
                     } catch (Exception e) {
-                        LOGGER.error("ctr exception: [{}] [{}]", items.get(fIndex).getId(), ExceptionUtils.getFullStackTrace(e));
+                        LOGGER.error("ctr exception: [{}] [{}]", items.get(fIndex).videoid, ExceptionUtils.getFullStackTrace(e));
                     }
                     return new Object();
                 }
@@ -167,7 +177,7 @@ public class VlogShareLRScorer extends BaseLRModelScorer{
 
         List<Future<Object>> futures = null;
         try {
-            futures = executorService.invokeAll(calls, 200, TimeUnit.MILLISECONDS);
+            futures = executorService.invokeAll(calls, LOCAL_TIME_OUT, TimeUnit.MILLISECONDS);
         } catch (InterruptedException e) {
             LOGGER.error("execute invoke fail: {}", ExceptionUtils.getFullStackTrace(e));
         }
@@ -183,13 +193,12 @@ public class VlogShareLRScorer extends BaseLRModelScorer{
                 } catch (InterruptedException e) {
                     LOGGER.error("InterruptedException {},{}", ExceptionUtils.getFullStackTrace(e));
                 } catch (ExecutionException e) {
-                    LOGGER.error("ExecutionException {},{}", request.getRequestId(),
+                    LOGGER.error("ExecutionException {},{}", requestContext.getRequest_id(),
                             ExceptionUtils.getFullStackTrace(e));
                 }
             }
         }
-
-        LOGGER.debug("Ctr Score {}, Total: {}, Cancel: {}", new Object[]{request.getRequestId(), rankItems.size(), cancel});
+        LOGGER.debug("Ctr Score {}, Total: {}, Cancel: {}", new Object[]{requestContext.getRequest_id(), items.size(), cancel});
     }
 }
 

+ 17 - 4
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/feature/VlogShareLRFeatureExtractor.java

@@ -25,18 +25,30 @@ public class VlogShareLRFeatureExtractor extends LRBytesFeatureExtractorBase {
     // TODO
     // 补充待抽取的context feature
     private void getContextFeatures(RequestContextBytesFeature requestContextBytes) {
-        makeFea(VlogFeatureGroup.DAY_OF_WEEK, "1".getBytes());
+        makeFea(VlogFeatureGroup.MACHINEINFO_BRAND, requestContextBytes.getMachineinfo_brand());
+        makeFea(VlogFeatureGroup.MACHINEINFO_MODEL, requestContextBytes.getMachineinfo_model());
+        makeFea(VlogFeatureGroup.MACHINEINFO_PLATFORM, requestContextBytes.getMachineinfo_platform());
+        makeFea(VlogFeatureGroup.MACHINEINFO_SDKVERSION, requestContextBytes.getMachineinfo_sdkversion());
+        makeFea(VlogFeatureGroup.MACHINEINFO_SYSTEM, requestContextBytes.getMachineinfo_system());
+        makeFea(VlogFeatureGroup.MACHINEINFO_WECHATVERSION, requestContextBytes.getMachineinfo_brand());
+
+        makeFea(VlogFeatureGroup.DAY, requestContextBytes.getWeek());
+        makeFea(VlogFeatureGroup.WEEK, requestContextBytes.getWeek());
+        makeFea(VlogFeatureGroup.HOUR, requestContextBytes.getHour());
 
     }
 
     //TODO
     private void getUserFeatures(UserBytesFeature user) {
-        makeFea(VlogFeatureGroup.SEX, user.sex);
+        makeFea(VlogFeatureGroup.USER_CYCLE_BUCKET_7DAY,user.getUser_cycle_bucket_7days());
+        makeFea(VlogFeatureGroup.USER_SHARE_BUCKET_30DAY,user.getUser_share_bucket_30days());
+        makeFea(VlogFeatureGroup.USER_SHARE_BUCKET_30DAY,user.getUser_cycle_bucket_30days());
 
     }
 
     private void getItemFeature(VideoBytesFeature videoBytesFeature) {
-        makeFea(VlogFeatureGroup.VIDEOID, videoBytesFeature.videoId);
+        makeFea(VlogFeatureGroup.VIDEOID, videoBytesFeature.getVideoId());
+        makeFea(VlogFeatureGroup.UP_ID, videoBytesFeature.getUpId());
     }
 
     @Override
@@ -44,11 +56,12 @@ public class VlogShareLRFeatureExtractor extends LRBytesFeatureExtractorBase {
                             VideoBytesFeature videoBytesFeature,
                             RequestContextBytesFeature requestContextBytesFeature) {
         features.clear();
-        //
+        // extract features
         getUserFeatures(userBytesFeature);
         getContextFeatures(requestContextBytesFeature);
         getItemFeature(videoBytesFeature);
 
+
         LRSamples.Builder lr =  com.tzld.piaoquan.recommend.server.gen.recommend.LRSamples.newBuilder();
         lr.setGroupNum(groupCount);
         List<FeatureGroup> keys = new ArrayList<>(features.keySet());

+ 2 - 3
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/score/model/GBDTModel.java

@@ -12,9 +12,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-/**
- * Created by liulixiang on 4/27/16.
- */
+
+
 public class GBDTModel extends Model {
     private static final Logger LOGGER = LoggerFactory.getLogger(GBDTModel.class);
     private static final float LINEAR_TRANSFORM_LOWER_BOUND = 0f;

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

@@ -33,6 +33,8 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
+
+
 public class LRModel extends Model {
     protected static final int MODEL_FIRST_LOAD_COUNT = 1 << 25; // 32M
     private static final Logger LOGGER = LoggerFactory.getLogger(LRModel.class);