天天看點

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);


  }

}

           

二、使用者畫像

使用者畫像介紹

根據使用者的資訊和行為動作,用标簽将使用者的特征描繪出來,用于描繪的标簽就是使用者畫像。這些标簽都是根據一些行為來推算出來。建構使用者畫像的核心工作,主要是利用存儲在伺服器上的海量日志和資料庫裡的大量資料進行分析和挖掘,給使用者貼“标簽”,而“标簽”是能表示使用者某一次元特征的辨別。

Spark(二)——标簽計算、使用者畫像應用

使用者畫像作用

Spark(二)——标簽計算、使用者畫像應用

挑戰

  • 記錄和存儲億級使用者的畫像
  • 支援和擴充不斷增加的次元和偏好
  • 毫秒級更新
  • 支撐個性化推薦、廣告投放、精細化營銷的産品

使用者畫像處理流程

明确問題、需求、資料預處理

資料清洗、缺失值處理、噪聲資料

特征工程

資料和特征

決定了機器學習的上限,而模型和算法隻是逼近這個上限。

特征:對解決問題有幫助的屬性。

特征的提取、選擇與構造:

  • 特征提取
    • 業務日志
    • WEB公開資料抓取
    • 第三方合作
  • 針對所解決的問題選擇最有用的特征集合
  • 通過相關系數計算特征的重要性
    • 人工篩選
    • 算法篩選:Random Forest
    • 次元過多,PCA自動降維

模型與算法

Spark(二)——标簽計算、使用者畫像應用

使用者畫像系統架構

Spark(二)——标簽計算、使用者畫像應用
Spark(二)——标簽計算、使用者畫像應用

使用者畫像實作

(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大資料網際網路項目實戰推薦系統(全套)

繼續閱讀