spark 用户画像挖掘分析_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));

/*

* 85648235List(味道赞: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())

}

}

参考文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值