Browse Source

feat:新label表模型更新,添加新的分桶文件

zhaohaipeng 1 month ago
parent
commit
903d11c9f4

+ 38 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/extractor/ExtractorUtils.java

@@ -1,7 +1,11 @@
 package com.tzld.piaoquan.recommend.server.service.rank.extractor;
 
+import java.time.Instant;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -217,6 +221,40 @@ public class ExtractorUtils {
         return (int)bucket;
     }
 
+    public static long getDaysBetween(long timestamp1, long timestamp2) {
+        if (timestamp1 == 0 || timestamp2 == 0) {
+            return 0;
+        }
+        Instant instant1 = Instant.ofEpochSecond(timestamp1);
+        Instant instant2 = Instant.ofEpochSecond(timestamp2);
+
+        LocalDate date1 = instant1.atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDate date2 = instant2.atZone(ZoneId.systemDefault()).toLocalDate();
+
+        return ChronoUnit.DAYS.between(date1, date2);
+    }
+
+    public static int getHourByTimestamp(long timestamp) {
+        return LocalDateTime
+                .ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.systemDefault())
+                .getHour() + 1;
+    }
+
+    public static int getDayOfWeekByTimestamp(long timestamp) {
+        return LocalDateTime
+                .ofInstant(Instant.ofEpochSecond(timestamp), ZoneId.systemDefault())
+                .getDayOfWeek()
+                .getValue();
+    }
+
+
+    public static double reciprocal(double num) {
+        if (num == 0) {
+            return 0;
+        }
+        return 1.0 / (num + 1);
+    }
+
     public static void main(String[] args) {
 //        System.out.println(ceilLogRate(0.0002));
 //        System.out.println(ceilLogRate(0.01));

+ 303 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/util/ExtractFeature20250218.java

@@ -0,0 +1,303 @@
+package com.tzld.piaoquan.recommend.server.util;
+
+import com.tzld.piaoquan.recommend.server.service.rank.extractor.ExtractorUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ExtractFeature20250218 {
+
+    private ExtractFeature20250218() {
+    }
+
+    public static void handleB1(Map<String, Object> b1Feature, Map<String, Object> featureMap) {
+        List<String> times = Arrays.asList("1h", "3h", "6h", "12h", "24h", "72h", "168h");
+        List<String> indexList = Arrays.asList("is_share", "share_cnt", "is_return_1", "return_1_uv", "str_one", "ros_one", "str", "ros", "str_plus", "ros_minus", "rovn");
+        for (String time : times) {
+            for (String index : indexList) {
+                double value = Double.parseDouble(b1Feature.getOrDefault(index + "_" + time, "0").toString());
+                featureMap.put("b1_" + index + "_" + time, value);
+            }
+
+            double rovn = Double.parseDouble(b1Feature.getOrDefault("rovn_" + time, "0").toString());
+            double returnNUv = Double.parseDouble(b1Feature.getOrDefault("return_1_uv_" + time, "0").toString());
+
+            featureMap.put("b1_rovn*log(r)_" + time, rovn * ExtractorUtils.calLog(returnNUv));
+        }
+
+    }
+
+    public static void handleB2ToB11AndB13(Map<String, Map<String, Object>> videoFeature, Map<String, Object> featureMap) {
+        List<String> times = Arrays.asList("1h", "3h", "6h", "12h", "24h", "72h", "168h");
+        List<String> indexList = Arrays.asList("is_share", "share_cnt", "is_return_1", "return_n_uv", "str_one", "ros_one", "str", "ros", "str_plus", "ros_minus", "rovn");
+        for (Map.Entry<String, Map<String, Object>> entry : videoFeature.entrySet()) {
+            String key = entry.getKey();
+            Map<String, Object> feature = entry.getValue();
+            for (String time : times) {
+                for (String index : indexList) {
+                    double value = Double.parseDouble(feature.getOrDefault(index + "_" + time, "0").toString());
+                    featureMap.put(key + "_" + index + "_" + time, value);
+                }
+
+                double rovn = Double.parseDouble(feature.getOrDefault("rovn_" + time, "0").toString());
+                double returnNUv = Double.parseDouble(feature.getOrDefault("return_n_uv_" + time, "0").toString());
+
+                featureMap.put(key + "_rovn*log(r)_" + time, rovn * ExtractorUtils.calLog(returnNUv));
+            }
+
+        }
+    }
+
+    public static void handleB12(Map<String, Object> b12Feature, Map<String, Object> featureMap) {
+        List<String> times = Arrays.asList("7d", "14d", "30d", "60d");
+        List<String> indexList = Arrays.asList("is_share", "share_cnt", "is_return_1", "return_n_uv", "str_one", "ros_one", "str", "ros", "str_plus", "ros_minus", "rovn");
+        for (String time : times) {
+            for (String index : indexList) {
+                double value = Double.parseDouble(b12Feature.getOrDefault(index + "_" + time, "0").toString());
+                featureMap.put("b12_" + index + "_" + time, value);
+            }
+            double rovn = Double.parseDouble(b12Feature.getOrDefault("rovn_" + time, "0").toString());
+            double returnNUv = Double.parseDouble(b12Feature.getOrDefault("return_n_uv_" + time, "0").toString());
+            featureMap.put("b12_rovn*log(r)_" + time, rovn * ExtractorUtils.calLog(returnNUv));
+        }
+    }
+
+    public static void handleVideoBasicFeature(Map<String, Object> videoFeature, long ts, Map<String, Object> featureMap) {
+        Double totalTime = Double.parseDouble(videoFeature.getOrDefault("total_time", "0").toString());
+        Double width = Double.parseDouble(videoFeature.getOrDefault("width", "0d").toString());
+        Double height = Double.parseDouble(videoFeature.getOrDefault("height", "0d").toString());
+        Double size = Double.parseDouble(videoFeature.getOrDefault("size", "0d").toString());
+        Double bit_rate = Double.parseDouble(videoFeature.getOrDefault("bit_rate", "0d").toString());
+        String festiveLabel1 = videoFeature.getOrDefault("festive_label1", "").toString();
+        String festiveLabel2 = videoFeature.getOrDefault("festive_label2", "").toString();
+
+
+        featureMap.put("total_time", totalTime);
+        featureMap.put("width", width);
+        featureMap.put("height", height);
+        featureMap.put("size", size);
+        featureMap.put("bit_rate", bit_rate);
+        featureMap.put("width/height", ExtractorUtils.divisionDouble(width, height));
+        featureMap.put("is_festive", 0);
+        featureMap.put("is_greeting", 0);
+        if (StringUtils.equals(festiveLabel1, "节假日")) {
+            featureMap.put("is_festive", 1);
+        } else if (StringUtils.equals(festiveLabel1, "问候语")) {
+            featureMap.put("is_greeting", 1);
+        }
+
+        featureMap.put("hour", ExtractorUtils.getHourByTimestamp(ts));
+        featureMap.put("day_of_week", ExtractorUtils.getDayOfWeekByTimestamp(ts));
+
+        long createTs = Long.parseLong(videoFeature.getOrDefault("gmt_create_timestamp", "0").toString()) / 1000;
+        featureMap.put("create_ts_diff", ExtractorUtils.getDaysBetween(createTs, ts));
+
+        String date = LocalDateTime.ofInstant(Instant.ofEpochSecond(ts), ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        String festiveByDate = FestiveUtil.getFestiveByDate(date);
+        featureMap.put("today_is_fes", 0);
+        featureMap.put("video_fes_eq", 0);
+        if (StringUtils.isNotBlank(festiveByDate)) {
+            featureMap.put("today_is_fes", 1);
+            if (StringUtils.equals(festiveByDate, festiveLabel2)) {
+                featureMap.put("video_today_fes_eq", 1);
+            }
+        }
+
+    }
+
+    public static void handleC1(Map<String, Object> c1Feature, Map<String, Object> featureMap) {
+        List<String> times = Arrays.asList("12h", "24h", "72h", "168h");
+        List<String> indexList = Arrays.asList("is_share", "share_cnt", "is_return_1", "return_1_uv", "click", "str_one", "ros_one", "str", "ros", "str_plus", "ros_minus", "rovn");
+        for (String time : times) {
+            for (String index : indexList) {
+                double value = Double.parseDouble(c1Feature.getOrDefault(index + "_" + time, "0").toString());
+                featureMap.put("c1_" + index + "_" + time, value);
+            }
+            double rovn = Double.parseDouble(c1Feature.getOrDefault("rovn_" + time, "0").toString());
+            double returnNUv = Double.parseDouble(c1Feature.getOrDefault("return_1_uv_" + time, "0").toString());
+            featureMap.put("c1_rovn*log(r)_" + time, rovn * ExtractorUtils.calLog(returnNUv));
+        }
+    }
+
+    public static void handleC2ToC3(Map<String, Object> c2Feature, Map<String, Object> c3Feature, Map<String, Object> featureMap) {
+        Map<String, Map<String, Object>> featureMaps = new HashMap<>();
+        featureMaps.put("c2", c2Feature);
+        featureMaps.put("c3", c3Feature);
+
+        List<String> times = Arrays.asList("12h", "24h", "72h", "168h");
+        List<String> indexList = Arrays.asList("is_share", "share_cnt", "is_return_1", "return_n_uv", "click");
+
+        for (Map.Entry<String, Map<String, Object>> entry : featureMaps.entrySet()) {
+            String key = entry.getKey();
+            Map<String, Object> feature = entry.getValue();
+            for (String time : times) {
+                for (String index : indexList) {
+                    double value = Double.parseDouble(feature.getOrDefault(index + "_" + time, "0").toString());
+                    featureMap.put(key + "_" + index + "_" + time, value);
+                }
+            }
+        }
+    }
+
+    public static void handleC4(Map<String, Object> c4Feature, Map<String, Object> featureMap) {
+        List<String> times = Arrays.asList("24h", "72h", "168h");
+        List<String> indexList = Arrays.asList("str_one", "ros_one", "str", "ros", "str_plus", "ros_minus", "rovn");
+
+        for (String time : times) {
+            for (String index : indexList) {
+                double value = Double.parseDouble(c4Feature.getOrDefault("avg_" + index + "_" + time, "0").toString());
+                featureMap.put("c4_avg_" + index + "_" + time, value);
+
+                double max = Double.parseDouble(c4Feature.getOrDefault("max_" + index + "_" + time, "0").toString());
+                double min = Double.parseDouble(c4Feature.getOrDefault("min_" + index + "_" + time, "0").toString());
+
+                featureMap.put("c4_diff_" + index + "_" + time, max - min);
+            }
+        }
+
+    }
+
+    public static void handleC5ToC6(Map<String, Object> c5Feature, Map<String, Object> c6Feature, Map<String, Object> videoMap, Map<String, Object> featureMap) {
+        Map<String, Map<String, Object>> featureMaps = new HashMap<>();
+        featureMaps.put("c5", c5Feature);
+        featureMaps.put("c6", c6Feature);
+        List<String> times = Arrays.asList("tags_1d", "tags_3d", "tags_7d");
+
+        String title = videoMap.getOrDefault("title", "").toString();
+
+        for (Map.Entry<String, Map<String, Object>> entry : featureMaps.entrySet()) {
+            String key = entry.getKey();
+            Map<String, Object> feature = entry.getValue();
+            for (String time : times) {
+                String tags = feature.getOrDefault(time, "").toString();
+                Double[] scores = ExtractorUtils.funcC34567ForTagsNew(tags, title);
+                featureMap.put(key + "_matchnum" + "_" + time, scores[0]);
+                featureMap.put(key + "_maxscore" + "_" + time, scores[1]);
+                featureMap.put(key + "_avgscore" + "_" + time, scores[2]);
+            }
+        }
+
+    }
+
+    public static Map<String, Map<String, String[]>> handleC7ToC8(Map<String, Object> c7Feature, Map<String, Object> c8Feature) {
+        Map<String, Map<String, String[]>> resultMap = new HashMap<>();
+
+        Map<String, Map<String, Object>> featureMaps = new HashMap<>();
+        featureMaps.put("c7", c7Feature);
+        featureMaps.put("c8", c8Feature);
+        List<String> indexList = Arrays.asList("share", "return");
+        for (Map.Entry<String, Map<String, Object>> entry : featureMaps.entrySet()) {
+            String key = entry.getKey();
+            Map<String, Object> feature = entry.getValue();
+            for (String index : indexList) {
+                if (feature.containsKey(index)) {
+                    Map<String, String[]> cfMap = new HashMap<>();
+                    String[] entries = feature.get(index).toString().split(",");
+                    for (String e : entries) {
+                        String[] rList = e.split(":");
+                        if (rList.length >= 4) {
+                            String vid = rList[0];
+                            String value1 = rList[1];
+                            String value2 = rList[2];
+                            String value3 = rList[3];
+                            String[] strs = {value1, value2, value3};
+                            cfMap.put(vid, strs);
+                        }
+                    }
+                    resultMap.put(key, cfMap);
+                }
+            }
+        }
+
+        return resultMap;
+    }
+
+    public static void useC7ToC8(Map<String, Map<String, String[]>> map, String vid, Map<String, Object> featureMap) {
+        if (StringUtils.isBlank(vid)) {
+            return;
+        }
+        for (String key : Arrays.asList("c6", "c7")) {
+            for (String action : Arrays.asList("share", "return")) {
+                String featureKey = key + "_" + action;
+                if (map.containsKey(featureKey)) {
+                    Map<String, String[]> cfMap = map.get(featureKey);
+                    String[] scores = cfMap.get(vid);
+                    featureMap.put(featureKey + "_score", Double.parseDouble(scores[0]));
+                    featureMap.put(featureKey + "_num", Double.parseDouble(scores[1]));
+                    featureMap.put(featureKey + "_rank", ExtractorUtils.reciprocal(Double.parseDouble(scores[2])));
+                }
+            }
+        }
+    }
+
+    public static void handleD3(Map<String, Object> d3Feature, Map<String, Object> featureMap) {
+        for (String index : Arrays.asList("exp", "return_n", "rovn")) {
+            double value = Double.parseDouble(d3Feature.getOrDefault(index, "0").toString());
+            featureMap.put("d3_" + index, value);
+        }
+    }
+
+    public static void handleD1(Map<String, Object> d4Feature, Map<String, Object> featureMap) {
+        double rosCfScores = Double.parseDouble(d4Feature.getOrDefault("ros_cf_score", "0").toString());
+        featureMap.put("d1_ros_cf_score", rosCfScores);
+        double rovCfScores = Double.parseDouble(d4Feature.getOrDefault("rov_cf_score", "0").toString());
+        featureMap.put("d1_rov_cf_score", rovCfScores);
+
+        double rosCfRank = Double.parseDouble(d4Feature.getOrDefault("ros_cf_rank", "0").toString());
+        featureMap.put("d1_ros_cf_rank", ExtractorUtils.reciprocal(rosCfRank));
+        double rovCfRank = Double.parseDouble(d4Feature.getOrDefault("rov_cf_rank", "0").toString());
+        featureMap.put("d1_rov_cf_rank", ExtractorUtils.reciprocal(rovCfRank));
+    }
+
+    public static void handleD2(Map<String, Object> d5Feature, Map<String, Object> featureMap) {
+        double score = Double.parseDouble(d5Feature.getOrDefault("score", "0").toString());
+        featureMap.put("d2_score", score);
+
+        double rank = Double.parseDouble(d5Feature.getOrDefault("rank", "0").toString());
+        featureMap.put("d2_rank", ExtractorUtils.reciprocal(rank));
+    }
+
+    public static void handleVideoSimilarity(Map<String, Object> videoFeature, Map<String, Object> headVideoFeature, Map<String, Object> featureMap) {
+        String headVideoTitle = headVideoFeature.getOrDefault("title", "").toString();
+        String headVideoMergeCate2 = headVideoFeature.getOrDefault("merge_second_level_cate", "").toString();
+        String headVideoMergeCate1 = headVideoFeature.getOrDefault("merge_first_level_cate", "").toString();
+        String headVideoFestiveLabel2 = headVideoFeature.getOrDefault("festive_label2", "").toString();
+
+
+        String videoTitle = videoFeature.getOrDefault("title", "").toString();
+        String videoMergeCate2 = videoFeature.getOrDefault("merge_second_level_cate", "").toString();
+        String videoMergeCate1 = videoFeature.getOrDefault("merge_first_level_cate", "").toString();
+        String videoFestiveLabel2 = videoFeature.getOrDefault("festive_label2", "").toString();
+
+        double titleSimilarity = ExtractFeature20250218.calcTxtSimilarity(headVideoTitle, videoTitle);
+        double headTitleAndMerge1Similarity = ExtractFeature20250218.calcTxtSimilarity(headVideoTitle, videoMergeCate1);
+        double headTitleAndMerge2Similarity = ExtractFeature20250218.calcTxtSimilarity(headVideoTitle, videoMergeCate2);
+        double headTitleAndFestiveSimilarity = ExtractFeature20250218.calcTxtSimilarity(headVideoTitle, videoFestiveLabel2);
+        double merge1Similarity = ExtractFeature20250218.calcTxtSimilarity(headVideoMergeCate1, videoMergeCate1);
+        double merge2Similarity = ExtractFeature20250218.calcTxtSimilarity(headVideoMergeCate2, videoMergeCate2);
+        double festiveSimilarity = ExtractFeature20250218.calcTxtSimilarity(headVideoFestiveLabel2, videoFestiveLabel2);
+
+        featureMap.put("title_sim", titleSimilarity);
+        featureMap.put("head_title_merge1_sim", headTitleAndMerge1Similarity);
+        featureMap.put("head_title_merge2_sim", headTitleAndMerge2Similarity);
+        featureMap.put("head_title_festive_sim", headTitleAndFestiveSimilarity);
+        featureMap.put("merge1_sim", merge1Similarity);
+        featureMap.put("merge2_sim", merge2Similarity);
+        featureMap.put("festive_sim", festiveSimilarity);
+
+    }
+
+    private static double calcTxtSimilarity(String txt1, String txt2) {
+        if (StringUtils.isBlank(txt1) || StringUtils.isBlank(txt2)) {
+            return 0d;
+        }
+        return SimilarityUtils.word2VecSimilarity(txt1, txt2);
+    }
+}

+ 46 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/util/FestiveUtil.java

@@ -0,0 +1,46 @@
+package com.tzld.piaoquan.recommend.server.util;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+@Slf4j
+public class FestiveUtil {
+
+    private static Map<String, String> festiveMap = new HashMap<>();
+
+    public static void init() {
+        long start = System.currentTimeMillis();
+        InputStream resourceAsStream = FestiveUtil.class.getClassLoader().getResourceAsStream("festive.txt");
+
+        if (Objects.nonNull(resourceAsStream)) {
+            try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceAsStream))) {
+                Map<String, String> tmpMap = new HashMap<>();
+                String line;
+                while ((line = reader.readLine()) != null) {
+                    String[] split = line.split(",");
+                    if (split.length >= 2) {
+                        tmpMap.put(split[0], split[1]);
+                    }
+                }
+
+                FestiveUtil.festiveMap = tmpMap;
+            } catch (IOException e) {
+                log.error("read festive.txt error: ", e);
+            }
+        }
+
+        long end = System.currentTimeMillis();
+        log.info("festive.txt loaded successfully cost {}", end - start);
+    }
+
+    public static String getFestiveByDate(String date) {
+        return festiveMap.get(date);
+    }
+}

File diff suppressed because it is too large
+ 41 - 0
recommend-server-service/src/main/resources/20250218_bucket_322.txt


+ 249 - 0
recommend-server-service/src/main/resources/festive.txt

@@ -0,0 +1,249 @@
+2024-01-01,元旦
+2024-01-18,腊八节
+2024-02-02,小年
+2024-02-03,小年
+2024-02-09,除夕
+2024-02-10,春节
+2024-02-10,初一
+2024-02-11,初二
+2024-02-12,初三
+2024-02-13,初四
+2024-02-14,初五
+2024-02-15,初六
+2024-02-16,初七
+2024-02-17,初八
+2024-02-18,初九
+2024-02-19,初十
+2024-02-14,情人节
+2024-02-24,元宵节
+2024-03-11,龙抬头
+2024-03-08,妇女节
+2024-03-12,植树节
+2024-05-01,劳动节
+2024-05-12,母亲节
+2024-06-01,儿童节
+2024-06-10,端午节
+2024-06-16,父亲节
+2024-07-01,建党节
+2024-08-01,建军节
+2024-08-10,七夕节
+2024-08-18,中元节
+2024-09-17,中秋节
+2024-10-01,国庆节
+2024-10-11,重阳节
+2024-11-28,感恩节
+2024-12-13,公祭日
+2024-12-24,平安夜
+2024-12-25,圣诞节
+2024-01-06,小寒
+2024-01-20,大寒
+2024-02-04,立春
+2024-02-19,雨水
+2024-03-05,惊蛰
+2024-03-20,春分
+2024-04-04,清明
+2024-04-19,谷雨
+2024-05-05,立夏
+2024-05-20,小满
+2024-06-05,芒种
+2024-06-21,夏至
+2024-07-06,小暑
+2024-07-22,大暑
+2024-08-07,立秋
+2024-08-22,处暑
+2024-09-07,白露
+2024-09-22,秋分
+2024-10-08,寒露
+2024-10-23,霜降
+2024-11-07,立冬
+2024-11-22,小雪
+2024-12-06,大雪
+2024-12-21,冬至
+2024-11-12,孙中山诞辰
+2024-03-12,孙中山逝世
+2024-12-26,毛主席诞辰
+2024-09-09,毛主席逝世
+2024-03-05,周恩来诞辰
+2024-01-08,周恩来逝世
+2024-08-22,邓小平诞辰
+2024-02-19,邓小平逝世
+2024-07-03,李克强诞辰
+2024-10-27,李克强逝世
+2024-09-18,九一八
+2024-07-07,七七事变
+2024-09-07,袁隆平诞辰
+2024-05-22,袁隆平逝世
+2024-10-24,彭德怀诞辰
+2024-11-29,彭德怀逝世
+2024-12-01,朱德诞辰
+2024-07-06,朱德逝世
+2024-10-27,吴尊友逝世
+2024-03-05,学雷锋
+2024-03-05,两会
+2024-03-15,315国际消费者权益日
+2025-01-01,元旦
+2025-01-07,腊八节
+2025-01-22,小年
+2025-01-23,小年
+2025-01-28,除夕
+2025-01-29,春节
+2025-01-29,初一
+2025-01-30,初二
+2025-01-31,初三
+2025-02-01,初四
+2025-02-02,初五
+2025-02-03,初六
+2025-02-04,初七
+2025-02-05,初八
+2025-02-06,初九
+2025-02-07,初十
+2025-02-14,情人节
+2025-02-22,元宵节
+2025-03-01,龙抬头
+2025-03-08,妇女节
+2025-03-12,植树节
+2025-05-01,劳动节
+2025-05-11,母亲节
+2025-06-01,儿童节
+2025-05-31,端午节
+2025-06-15,父亲节
+2025-07-01,建党节
+2025-08-01,建军节
+2025-08-29,七夕节
+2025-09-06,中元节
+2025-10-06,中秋节
+2025-10-01,国庆节
+2025-10-29,重阳节
+2025-11-27,感恩节
+2025-12-13,公祭日
+2025-12-24,平安夜
+2025-12-25,圣诞节
+2025-01-05,小寒
+2025-01-20,大寒
+2025-02-03,立春
+2025-02-18,雨水
+2025-03-05,惊蛰
+2025-03-20,春分
+2025-04-04,清明
+2025-04-20,谷雨
+2025-05-05,立夏
+2025-05-21,小满
+2025-06-05,芒种
+2025-06-21,夏至
+2025-07-07,小暑
+2025-07-22,大暑
+2025-08-07,立秋
+2025-08-23,处暑
+2025-09-07,白露
+2025-09-23,秋分
+2025-10-08,寒露
+2025-10-23,霜降
+2025-11-07,立冬
+2025-11-22,小雪
+2025-12-07,大雪
+2025-12-21,冬至
+2025-11-12,孙中山诞辰
+2025-03-12,孙中山逝世
+2025-12-26,毛主席诞辰
+2025-09-09,毛主席逝世
+2025-03-05,周恩来诞辰
+2025-01-08,周恩来逝世
+2025-08-22,邓小平诞辰
+2025-02-19,邓小平逝世
+2025-07-03,李克强诞辰
+2025-10-27,李克强逝世
+2025-09-18,九一八
+2025-07-07,七七事变
+2025-09-07,袁隆平诞辰
+2025-05-22,袁隆平逝世
+2025-10-24,彭德怀诞辰
+2025-11-29,彭德怀逝世
+2025-12-01,朱德诞辰
+2025-07-06,朱德逝世
+2025-10-27,吴尊友逝世
+2025-03-05,学雷锋
+2024-03-05,两会
+2024-03-15,315国际消费者权益日
+2026-01-01,元旦
+2026-01-26,腊八节
+2026-02-10,小年
+2026-02-11,小年
+2026-02-16,除夕
+2026-02-17,春节
+2026-02-17,初一
+2026-02-18,初二
+2026-02-19,初三
+2026-02-20,初四
+2026-02-21,初五
+2026-02-22,初六
+2026-02-23,初七
+2026-02-24,初八
+2026-02-25,初九
+2026-02-26,初十
+2026-02-14,情人节
+2026-03-03,元宵节
+2026-03-20,龙抬头
+2026-03-08,妇女节
+2026-03-12,植树节
+2026-05-01,劳动节
+2026-05-10,母亲节
+2026-06-01,儿童节
+2026-06-19,端午节
+2026-06-21,父亲节
+2026-07-01,建党节
+2026-08-01,建军节
+2026-08-19,七夕节
+2026-08-27,中元节
+2026-09-25,中秋节
+2026-10-01,国庆节
+2026-10-18,重阳节
+2026-11-26,感恩节
+2026-12-13,公祭日
+2026-12-24,平安夜
+2026-12-25,圣诞节
+2026-01-05,小寒
+2026-01-20,大寒
+2026-02-04,立春
+2026-02-18,雨水
+2026-03-05,惊蛰
+2026-03-20,春分
+2026-04-05,清明
+2026-04-20,谷雨
+2026-05-05,立夏
+2026-05-21,小满
+2026-06-05,芒种
+2026-06-21,夏至
+2026-07-07,小暑
+2026-07-23,大暑
+2026-08-07,立秋
+2026-08-23,处暑
+2026-09-07,白露
+2026-09-23,秋分
+2026-10-08,寒露
+2026-10-23,霜降
+2026-11-07,立冬
+2026-11-22,小雪
+2026-12-07,大雪
+2026-12-22,冬至
+2026-11-12,孙中山诞辰
+2026-03-12,孙中山逝世
+2026-12-26,毛主席诞辰
+2026-09-09,毛主席逝世
+2026-03-05,周恩来诞辰
+2026-01-08,周恩来逝世
+2026-08-22,邓小平诞辰
+2026-02-19,邓小平逝世
+2026-07-03,李克强诞辰
+2026-10-27,李克强逝世
+2026-09-18,九一八
+2026-07-07,七七事变
+2026-09-07,袁隆平诞辰
+2026-05-22,袁隆平逝世
+2026-10-24,彭德怀诞辰
+2026-11-29,彭德怀逝世
+2026-12-01,朱德诞辰
+2026-07-06,朱德逝世
+2026-10-27,吴尊友逝世
+2026-03-05,学雷锋
+2024-03-05,两会
+2024-03-15,315国际消费者权益日

Some files were not shown because too many files changed in this diff