本文源碼:GitHub·點這裏 || GitEE·點這裏java
互聯網行業的朋友必定了解或者據說過下列幾個場景:git
阿里:千人千面,意思不一樣用戶使用阿里相關的產品感受是不同的,例如支付寶首頁的推薦內容,和其餘相關推薦流信息是徹底不一樣的。程序員
騰訊:社交廣告,不一樣用戶的朋友圈或者其餘媒體場景下的廣告信息是不一樣的,會基於用戶特徵推薦。github
頭條:信息價值,根據用戶瀏覽信息,分析用戶相關喜愛,針對分析結果推薦相關的信息流,越關注某類內容,獲取相關的信息越多。算法
如上幾種場景的邏輯就是:基於不斷分析用戶的行爲,生成用戶的特徵畫像,而後再基於用戶標籤,定製化的推薦相關內容。sql
經過上面的場景,衍生出來兩個概念:segmentfault
用戶畫像緩存
用戶畫像,做爲一種勾畫目標用戶、聯繫用戶訴求與設計方向的有效工具,把該用戶相關聯的數據的可視化的展示,就造成了用戶畫像。用戶畫像在各領域獲得了普遍的應用,最初是在電商領域獲得應用的,在大數據時代背景下,用戶信息充斥在網絡中,將用戶的每一個具體信息抽象成標籤,利用這些標籤將用戶形象具體化,從而爲用戶提供有針對性的服務。網絡
標籤數據架構
標籤在生活中很是常見,好比商品標籤,我的標籤,行業標籤,例如提到996就想到程序員,提到程序員就想到格子衫。
標籤是把分散的多方數據進行整合歸入統一的技術平臺,並對這些數據進行標準化和細分,進行結構化存儲和更新管理,讓業務線能夠把這些細分結果推向現有的互動營銷環境裏的平臺,產生價值,這些數據稱爲標籤數據,也就是常說的標籤庫。數據標籤的概念也是在最近幾年大數據的發展中不斷火熱起來的。
標籤價值
標籤的核心價值,或者說最經常使用的場景:實時智能推薦,精準化數字營銷。
屬性標籤
屬性標籤是變化最小的,例如用戶實名認證以後,基於身份信息獲取相關:性別,生日,出生年月,年齡,等相關標籤。變更頻率小,且最具備精準性。
行爲標籤
行爲標籤就是用戶經過在產品上的一系列操做,基於行爲日誌分析得出:例如購買能力、消費愛好、季節性消費標籤等。在信息流的APP上,經過相關瀏覽行爲,不斷推薦用戶感興趣的內容就是基於該邏輯。
規則標籤
根據業務場景需求,配置指定規則,基於規則生成分析結果,例如:
這類標籤能夠基於動態的規則配置,通過計算和分析,生成描述結果,也就是規則標籤。
擬合標籤
擬合類的標籤最具備複雜性,經過用戶上述幾種標籤,智能組合分析,給的預測值,例如:未婚、瀏覽相關婚禮內容,經過分析預測用戶將要舉辦婚禮,獲得一個擬合結果:預測將要結婚。這個預測邏輯也能夠反向執行,用戶購買嬰兒用品:預測已婚已育。
這就是數據時代常說的一句話:用戶在某個應用上一通操做以後,算法分析的結果可能比用戶對本身的描述還要真實。
數據採集
數據採集的渠道相對較多,好比同一APP內的各類業務線:購物、支付、理財、外賣、信息瀏覽等等。經過數據通道傳輸到統一的數據聚合平臺。有了這些海量日誌數據的支撐,才具備數據分析的基礎條件。不論是數據智能,深度學習,算法等都是創建在海量數據的基礎條件上,這樣才能獲取具備價值的分析結果。
數據加工
結合如上業務,經過對海量數據的加工,分析和提取,獲取相對精準的用戶標籤,這裏還有關鍵的一步,就是對已有的用戶標籤進行不斷的驗證和修復,尤爲是規則類和擬合類的相關標籤。
標籤庫
經過標籤庫,管理複雜的標籤結果,除了複雜的標籤,和基於時間線的標籤變,標籤數據到這裏,已經具備至關大的價值,能夠圍繞標籤庫開放一些收費服務,例如常見的,用戶在某電商APP瀏覽某些商品,能夠在某信息流平臺看到商品推薦。大數據時代就是這麼使人感受智能和窒息。
標籤業務
數據走了一大圈轉換成標籤,天然仍是要回歸到業務層面,經過對標籤數據的用戶的分析,能夠進行精準營銷,和智能推薦等相關操做,電商應用中能夠提升成交量,信息流中能夠更好的吸引用戶。
應用層
把上述業務開發成服務,集成到具備的應用層面,不斷提高應用服務的質量,不斷的吸引用戶,提供服務。固然用戶的數據不斷在應用層面產生,在轉到數據採集服務中,最終造成完整的閉環流程。
從流程和業務層面描述都是簡單的,到開發層面都會變得複雜和很差處理,這可能就是產品和開發之間的隔閡。
標籤的數據類型
不一樣標籤的分析結果須要用不一樣的數據類型描述,在標籤體系中,經常使用描述標籤的數據類型以下:枚舉、數值、日期、布爾、文本類型。不一樣的類型須要不同的分析流程。
商品和標籤
這裏提供一個基礎案例,用商品的標籤來分析商品,例如經過商品產地,價格,狀態等條件,來查詢產品庫有多少符合條件的商品。
數據表設計
主要分四張表:標籤分類,標籤庫,標籤值,標籤數據。
CREATE TABLE `tc_tag_catalog` ( `id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID', `catalog_name` VARCHAR (50) NOT NULL DEFAULT '' COMMENT '名稱', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', `update_time` datetime DEFAULT NULL COMMENT '更新時間', `state` INT (1) DEFAULT '1' COMMENT '狀態1啓用,2禁用', PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '標籤層級目錄'; CREATE TABLE `tc_tag_cloud` ( `id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID', `catalog_id` INT (11) NOT NULL COMMENT '目錄ID', `tag_name` VARCHAR (100) DEFAULT '' COMMENT '標籤名稱', `tag_code` INT (11) DEFAULT NULL COMMENT '標籤編碼', `bind_column` VARCHAR (100) DEFAULT '' COMMENT '綁定數據列', `data_type` INT (2) NOT NULL COMMENT '1枚舉,2數值,3日期,4布爾,5值類型', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', `update_time` datetime DEFAULT NULL COMMENT '更新時間', `remark` VARCHAR (150) DEFAULT NULL COMMENT '備註', `state` INT (1) DEFAULT '1' COMMENT '狀態1啓用,2禁用', PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '標籤雲'; CREATE TABLE `tc_tag_data_enum` ( `tag_code` INT (11) NOT NULL COMMENT '標籤編碼', `data_value` VARCHAR (150) NOT NULL COMMENT '枚舉值', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', KEY `tag_code_index` (`tag_code`) USING BTREE ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '標籤枚舉值'; CREATE TABLE `tc_tag_data_set` ( `id` INT (11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID', `product_name` VARCHAR (100) DEFAULT '' COMMENT '商品名稱', `unit_price` DECIMAL (10, 2) DEFAULT '0.00' COMMENT '單價', `is_shelves` INT (1) DEFAULT '1' COMMENT '是否上架:1否,2是', `origin_place` VARCHAR (100) DEFAULT '' COMMENT '產地', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '標籤數據集';
模擬入參接口
這裏的參數應該是基於需求,動態選取,進行組織到一塊兒:
例如圖片中這裏給定的標籤值列表,稱爲枚舉值。
@RestController public class AnalyzeController { @Resource private TagDataSetService tagDataSetService ; @GetMapping("/analyze") public String analyze (){ List<TagParam> tagParamList = new ArrayList<>() ; TagParam tagParam1 = new TagParam(1,"產地","origin_place") ; List<String> valueList1 = new ArrayList<>() ; valueList1.add("深圳"); valueList1.add("廣東"); tagParam1.setValueList(valueList1); tagParamList.add(tagParam1) ; TagParam tagParam2 = new TagParam(2,"價格","unit_price") ; List<String> valueList2 = new ArrayList<>() ; valueList2.add("1999"); tagParam2.setValueList(valueList2); tagParamList.add(tagParam2) ; TagParam tagParam3 = new TagParam(3,"生產日期","create_time") ; List<String> valueList3 = new ArrayList<>() ; valueList3.add("2020-05-01 13:43:54"); tagParam3.setValueList(valueList3); tagParamList.add(tagParam3) ; TagParam tagParam4 = new TagParam(4,"是否上架","is_shelves") ; List<String> valueList4 = new ArrayList<>() ; valueList4.add("1"); tagParam4.setValueList(valueList4); tagParamList.add(tagParam4) ; TagParam tagParam5 = new TagParam(5,"產品名稱","product_name") ; List<String> valueList5 = new ArrayList<>() ; valueList5.add("智能"); tagParam5.setValueList(valueList5); tagParamList.add(tagParam5) ; Integer count = tagDataSetService.analyze(tagParamList) ; return "Result:" + count ; } }
參數解析查詢
經過對參數的解析,最終造成查詢的SQL語句,獲取精準的結果數據。
@Service public class TagDataSetServiceImpl extends ServiceImpl<TagDataSetMapper, TagDataSet> implements TagDataSetService { @Resource private TagDataSetMapper tagDataSetMapper ; @Override public Integer analyze(List<TagParam> tagParamList) { StringBuffer querySQL = new StringBuffer() ; for (TagParam tagParam:tagParamList){ querySQL.append(" AND ") ; querySQL.append(tagParam.getBindColumn()) ; // 1枚舉,2數值,3日期,4布爾,5值類型 List<String> valueList = tagParam.getValueList(); switch (tagParam.getDataType()){ case 1: querySQL.append(" IN (") ; for (int i = 0 ; i < valueList.size() ;i++){ if (i != valueList.size()-1){ querySQL.append("'").append(valueList.get(i)).append("',"); } else { querySQL.append("'").append(valueList.get(i)).append("'"); } } querySQL.append(" )") ; break; case 2: querySQL.append("=").append(tagParam.getValueList().get(0)) ; break; case 3: querySQL.append(">='").append(tagParam.getValueList().get(0)).append("'") ; break; case 4: querySQL.append("=").append(tagParam.getValueList().get(0)) ; break; case 5: querySQL.append(" LIKE '%").append(tagParam.getValueList().get(0)).append("%'") ; break; default: break; } } /* 最終執行的 SQL SELECT COUNT(*) FROM tc_tag_data_set WHERE 1 = 1 AND origin_place IN ('深圳', '廣東') AND unit_price = 1999 AND create_time >= '2020-05-01 13:43:54' AND is_shelves = 1 AND product_name LIKE '%智能%' */ String whereCondition = String.valueOf(querySQL); return tagDataSetMapper.analyze(whereCondition); } }
可能有人會說這不就是個查詢流程嗎?若是有這樣的疑問,把上述案例換成用戶查詢,標籤數據的價值會更直觀。
用戶畫像
做爲一種勾畫目標用戶、聯繫用戶訴求與設計方向的有效工具,用戶畫像在各領域獲得了普遍的應用。最初是在電商領域獲得應用的,在大數據時代背景下,用戶信息充斥在網絡中,將用戶的每一個具體信息抽象成標籤,利用這些標籤將用戶形象具體化,從而爲用戶提供有針對性的服務。
行業畫像
經過行業屬性標籤,行業下用戶標籤的綜合分析,生成行業分析報告,提供極有價值的導向,這是最近兩年極其熱門的應用。
畫像補全
經過不斷分析用戶數據,豐富標籤庫,使用戶的畫像更加豐富立體。
經過標籤數據的分析,生成一份分析報告,報告內容包含豐富的用戶標籤統計數據。
例如:90後畫像報告
這個報告,互聯網用戶必定或多或少都看到過。主要是一些標籤統計,共性標籤展現,或者哪些羣體對90後三觀影響最大,收入來源,學歷等各類分析解讀。
GitHub·地址 https://github.com/cicadasmile/data-manage-parent GitEE·地址 https://gitee.com/cicadasmile/data-manage-parent
推薦閱讀:《架構設計系列》,蘿蔔青菜,各有所需
序號 | 標題 |
---|---|
01 | 架構設計:單服務.集羣.分佈式,基本區別和聯繫 |
02 | 架構設計:分佈式業務系統中,全局ID生成策略 |
03 | 架構設計:分佈式系統調度,Zookeeper集羣化管理 |
04 | 架構設計:接口冪等性原則,防重複提交Token管理 |
05 | 架構設計:緩存管理模式,監控和內存回收策略 |