Spark(二)—— 标签计算、用户画像应用

一、标签计算

数据

86913510    {"reviewPics":[],"extInfoList":null,"expenseList":null,"reviewIndexes":[1,2],"scoreList":[{"score":5,"title":"环境","desc":""},{"score":5,"title":"服务","desc":""},{"score":5,"title":"口味","desc":""}]}

86913510    {"reviewPics":null,"extInfoList":[{"title":"contentTags","values":["午餐","分量适中"],"desc":"","defineType":0},{"title":"tagIds","values":["684","240"],"desc":"","defineType":0}],"expenseList":null,"reviewIndexes":[2],"scoreList":null}

77287793    {"reviewPics":null,"extInfoList":null,"expenseList":null,"reviewIndexes":[1,2],"scoreList":null}

77287793    {"reviewPics":null,"extInfoList":[{"title":"contentTags","values":["干净卫生","服务热情"],"desc":"","defineType":0},{"title":"tagIds","values":["852","22"],"desc":"","defineType":0}],"expenseList":null,"reviewIndexes":[1,2],"scoreList":null}

处理过程分析

(1)第一步:筛选出extInfoList不为空的记录,并去除values中的标签值

获取到的记录形式

86913510 午餐,分量适中
77287793 干净卫生,服务热情

(2)第二步:分离标签

获取到的记录形式

86913510 午餐,1
86913510 午餐,1
86913510 分量适中,1
77287793 干净卫生,1
77287793 服务热情,1

(3)第三步:统计标签

获取到的记录形式

JSON解析代码


public class JsonParse {

    public static String parseTag(String json) {

        JSONObject jsonObject = JSONObject.parseObject(json);
        JSONArray extInfoList = jsonObject.getJSONArray("extInfoList");
        if (extInfoList == null) {
            return "";
        }
        for (Object obj : extInfoList) {
            JSONObject jsonObject1 = (JSONObject) obj;
            if (jsonObject1.getString("title").equals("contentTags")) {
                String array2 = jsonObject1.getString("values");
                return array2.replace("[", "").replace("]", "").replace("\"", "");
            }

        }
        return "";
    }

}

Spark统计代码


object TagCompute {

  def main(args: Array[String]): Unit = {

    //创建Spark配置对象
    val conf = new SparkConf().setMaster("local[4]").setAppName("MyApp")
    //通过conf创建sc
    val sc = new SparkContext(conf)
    //读取文件
    val rdd1 = sc.textFile("/Users/opensource/dev-problem/source/temptags.txt");
    //计算
    val rdd2 = rdd1.map(line => line.split("\t"))
      .map(e => e(0) -> JsonParse.parseTag(e(1)))
      // (77287793,环境优雅,性价比高,干净卫生,停车方便,音响效果好)
      .filter(e => e._2.length > 0)
      //(70611801,["环境优雅","性价比高"])
      .map(e => e._1 -> e._2.split(",")(0))
      //     (77287793,环境优雅,性价比高,干净卫生,停车方便,音响效果好)
      .flatMapValues(e => e)
      //((70611801,价格实惠),1)
      .map(e => (e._1, e._2) -> 1)
      //((78824187,干净卫生),7)
      .reduceByKey(_ + _)
      //(73963176,List((环境优雅,6)))
      .map(e => e._1._1 -> List((e._1._2, e._2)))
      //(83084036,List((干净卫生,1), (价格实惠,1)))
      .reduceByKey(_ ::: _)
      //(79197522,List(服务热情:2, 干净卫生:1, 技师专业:1, 体验舒服:1, 放松舒服:1, 价格实惠:1))
      .map(e => e._1 -> e._2.sortBy(_._2).reverse.take(10).map(a => a._1 + ":" + a._2.toString));

    //85648235  List(味道赞:17, 服务热情:15, 干净卫生:13, 上菜快:12, 回头客:11, 性价比高:10, 体验好:9, 价格实惠:8, 环境优雅:8, 分量足:7)
    rdd2.map(e => e._1 + "\t" + e._2).foreach(println);


  }

}

二、用户画像

用户画像介绍

根据用户的信息和行为动作,用标签将用户的特征描绘出来,用于描绘的标签就是用户画像。这些标签都是根据一些行为来推算出来。构建用户画像的核心工作,主要是利用存储在服务器上的海量日志和数据库里的大量数据进行分析和挖掘,给用户贴“标签”,而“标签”是能表示用户某一维度特征的标识。

在这里插入图片描述

用户画像作用

在这里插入图片描述

挑战

  • 记录和存储亿级用户的画像
  • 支持和扩展不断增加的维度和偏好
  • 毫秒级更新
  • 支撑个性化推荐、广告投放、精细化营销的产品

用户画像处理流程

明确问题、需求、数据预处理

数据清洗、缺失值处理、噪声数据

特征工程

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。

特征:对解决问题有帮助的属性。

特征的提取、选择与构造:

  • 特征提取
    • 业务日志
    • WEB公开数据抓取
    • 第三方合作
  • 针对所解决的问题选择最有用的特征集合
  • 通过相关系数计算特征的重要性
    • 人工筛选
    • 算法筛选:Random Forest
    • 维度过多,PCA自动降维

模型与算法

在这里插入图片描述

用户画像系统架构

在这里插入图片描述

在这里插入图片描述

用户画像实现

(1)实例一:性别判断

性别判断属于数据挖掘中分类问题。

(2)需求描述
根据用户数据判断用户性别。

(3)已知数据

  • 数据1:用户使用App的行为数据
  • 数据2:用户浏览网页的行为数据

(4)实现代码


object UserPicture {

  def main(args: Array[String]): Unit = {


    //创建Spark配置对象
    val conf = new SparkConf().setMaster("local[4]").setAppName("MyApp");

    val spark = SparkSession
      .builder()
      .appName("Spark SQL basic example")
      .config(conf)
      .getOrCreate();

    //创建训练集
    val training = spark.createDataFrame(Seq(
      (1.0,Vectors.dense(2.0,1.1,0.1)),
      (1.0,Vectors.dense(2.0,1.1,0.1)),
      (1.0,Vectors.dense(2.0,1.1,0.1)),
      (1.0,Vectors.dense(2.0,1.1,0.1))
    )).toDF("label","features");


    val lr = new LogisticRegression();
    println(lr.explainParams())

    //Set the maximum number of iterations.
    lr.setMaxIter(10)
      //Set the regularization parameter.
      .setRegParam(0.01)

    //Fits a model to the input data.
    val model1 = lr.fit(training)



    var paramMap = ParamMap(lr.maxIter -> 20).put(lr.maxIter,30)
      .put(lr.regParam -> 0.1,lr.threshold -> 0.55)

    //The parent estimator that produced this model.
    //extractParamMap with no extra values.
    println(model1.parent.extractParamMap())

  }

}

参考文档

Spark大数据互联网项目实战推荐系统
腾讯防刷负责人:基于用户画像大数据的电商防刷架构
让机器读懂用户--大数据中的用户画像
大数据开发用户画像案例分析
大数据工程师 dmp用户画像系统开发项目(完)
Spark大数据互联网项目实战推荐系统(全套)

posted @ 2019-11-19 10:33  CoffeJoy  阅读(...)  评论(... 编辑 收藏