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自动降维

模型与算法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgjysy.html