电商导购平台的“猜你喜欢”优化:基于Spark MLlib的商品关联规则挖掘与Java服务化部署

大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿!

在电商导购平台中,“猜你喜欢”是提升用户粘性、促进商品曝光和转化的核心模块之一。传统的“猜你喜欢”往往基于简单的热门推荐、协同过滤或人工规则,难以精准捕捉用户潜在的关联购买意图。而基于 商品关联规则挖掘(如Apriori、FP-Growth),我们可以从用户历史行为(如浏览、加购、购买序列)中发现 “买了X的用户也买了Y” 的强关联模式,从而实现更精准、个性化的商品推荐。

本文将深入讲解如何利用 Spark MLlib 提供的 FP-Growth 算法,挖掘商品之间的关联规则,并通过 Java 服务化部署,将挖掘结果应用于“猜你喜欢”推荐模块,提升推荐的相关性与转化率。
电商导购平台


一、为什么选择关联规则挖掘?

关联规则挖掘是一种经典的 无监督学习方法,用于发现数据集中项与项之间的频繁共现模式,典型应用如:

  • 超市购物篮分析:“买牛奶的人经常买面包”
  • 电商场景:“购买了手机的用户,通常也会购买手机壳/耳机”

在导购平台中,我们可以从用户行为日志中提取 商品组合(Itemsets),通过设定最小支持度(support)与最小置信度(confidence),找出频繁共现的商品对或商品组,并生成形如 “若购买A,则推荐B” 的规则,用于“猜你喜欢”推荐。


二、技术选型与架构设计

  • 数据源: 用户行为日志(如浏览、加购、购买的商品ID序列),通常存储于 Kafka、HDFS 或 Hive;
  • 挖掘引擎: Spark MLlib 提供的 FP-Growth 算法,适合大规模商品关联规则挖掘;
  • 规则存储: 挖掘出的关联规则存入 Redis / MySQL,供推荐服务实时查询;
  • 推荐服务: Java 后端服务根据用户当前浏览或购买的商品,实时匹配关联规则,返回推荐商品列表。

三、Spark MLlib 实现商品关联规则挖掘

1. 准备用户行为数据(商品序列)

假设我们已通过埋点收集了用户行为数据,每条记录代表一个用户一次会话中浏览/购买的商品ID列表,格式如下:

用户ID | 商品ID列表(如 [101, 102, 105])

我们只关心商品ID列表,用于挖掘频繁项集与关联规则。

2. 引入 Spark 依赖(Maven)

<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.12</artifactId>
    <version>3.3.1</version>
</dependency>
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-mllib_2.12</artifactId>
    <version>3.3.1</version>
</dependency>

3. 构造交易数据集并运行 FP-Growth

package cn.juwatech.spark.association;

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.ml.fpm.FPGrowth;
import org.apache.spark.ml.fpm.FPGrowthModel;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import java.util.Arrays;
import java.util.List;

public class ProductAssociationMining {

    public static void main(String[] args) {
        SparkSession spark = SparkSession.builder()
                .appName("ProductAssociationMining")
                .master("local[*]") // 生产环境应使用 yarn/standalone/cluster
                .getOrCreate();

        JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext());

        // 模拟用户购买商品序列数据:每行是一个用户的商品ID列表
        List<List<Integer>> rawData = Arrays.asList(
                Arrays.asList(101, 102, 105),
                Arrays.asList(101, 103),
                Arrays.asList(102, 104),
                Arrays.asList(101, 102, 104),
                Arrays.asList(102, 105),
                Arrays.asList(101, 105)
        );

        JavaRDD<List<Integer>> transactions = jsc.parallelize(rawData);

        // 转换为 Spark DataFrame 所需的格式
        Dataset<Row> df = spark.createDataset(transactions.rdd(), org.apache.spark.sql.Encoders.kryo(List.class))
                .toDF("items");

        // 构造 FP-Growth 算法,设置最小支持度为 0.3(可根据数据量调整)
        FPGrowth fpGrowth = new FPGrowth()
                .setItemsCol("items")
                .setMinSupport(0.3)
                .setMinConfidence(0.7);

        FPGrowthModel model = fpGrowth.fit(df);

        // 获取频繁项集
        System.out.println("频繁项集:");
        model.freqItemsets().show();

        // 获取关联规则
        System.out.println("关联规则:");
        model.associationRules().show();

        spark.stop();
    }
}

输出示例:

  • 频繁项集:显示哪些商品组合经常一起出现(如 [101,102], [102,105])
  • 关联规则:显示形如 101 → 102(如果买了101,那么很可能也会买102),并给出置信度与提升度

四、Java 服务化部署:关联规则查询与推荐

挖掘出的规则可存储至 Redis 或 MySQL,Java 推荐服务根据用户当前浏览的商品,实时查询匹配的“关联推荐商品”。

伪代码:关联规则查询服务

package cn.juwatech.recommend.service;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class AssociationRecommendService {

    // 模拟从数据库/Redis加载的关联规则:Map<前提商品集合, 推荐商品列表>
    private static final List<AssociationRule> rules = loadRulesFromDB();

    public List<Long> recommendAssociatedProducts(Long currentProductId) {
        return rules.stream()
                .filter(rule -> rule.getPremise().contains(currentProductId))
                .flatMap(rule -> rule.getConclusions().stream())
                .distinct()
                .collect(Collectors.toList());
    }

    private static List<AssociationRule> loadRulesFromDB() {
        // 实际应从 DB/Redis 加载,这里模拟
        return List.of(
                new AssociationRule(Set.of(101L), Set.of(102L, 105L)),
                new AssociationRule(Set.of(102L), Set.of(104L, 105L))
        );
    }

    private static class AssociationRule {
        private Set<Long> premise;
        private Set<Long> conclusions;

        public AssociationRule(Set<Long> premise, Set<Long> conclusions) {
            this.premise = premise;
            this.conclusions = conclusions;
        }

        public Set<Long> getPremise() { return premise; }
        public Set<Long> getConclusions() { return conclusions; }
    }
}

五、总结与优化方向

  • 数据质量: 关联规则依赖用户行为数据的准确性与覆盖度,需做好埋点与清洗;
  • 规则筛选: 可按商品类目、热度、季节性动态过滤规则,提升推荐相关性;
  • 实时性: 可结合 Flink 实时更新频繁项集,或定期(如小时级/天级)离线挖掘;
  • 混合推荐: 关联规则可与协同过滤、内容推荐结合,形成混合推荐策略。

通过 Spark MLlib 挖掘商品关联规则,并服务化部署到推荐系统,“猜你喜欢”模块能够精准捕捉用户潜在兴趣,显著提升点击率与转化率,是电商导购平台推荐系统的强力助推器。

本文著作权归聚娃科技省赚客app开发者团队,转载请注明出处!

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐