
1) 【一句话结论】用户画像构建需融合用户行为、内容、社交等多源数据,通过离线批量特征工程(处理历史/静态特征)与实时流式特征工程(处理动态行为)协同,为内容推荐提供用户兴趣与属性的综合表征。
2) 【原理/概念讲解】首先解释用户画像的核心是“用户兴趣与属性的建模”,类比“用户的数字指纹”——每个用户的行为、偏好、社交关系等数据,像指纹一样独特,用于精准推荐。
3) 【对比与适用场景】
| 维度 | 离线特征工程 | 实时特征工程 |
|---|---|---|
| 定义 | 批量处理历史数据,生成静态特征 | 流式处理实时行为,生成动态特征 |
| 处理方式 | 作业调度(如每日凌晨) | 实时计算框架(如Flink/Kafka) |
| 更新频率 | 低频(如每日/每周) | 高频(秒级/分钟级) |
| 适用场景 | 历史行为分析、基础兴趣建模 | 热点内容追踪、即时兴趣响应 |
| 注意点 | 需处理数据量巨大,避免过拟合 | 需低延迟计算,关注实时性 |
4) 【示例】
离线特征工程伪代码(以用户行为日志为例):
# 读取用户行为日志(示例:用户ID, 行为类型, 对象ID, 时间戳)
def offline_feature_engineering(log_path):
# 初始化特征字典
user_features = {}
# 读取日志
for record in read_log(log_path):
user_id = record['user_id']
action = record['action'] # click, like, comment
item_id = record['item_id']
# 更新行为计数
if user_id not in user_features:
user_features[user_id] = {}
if item_id not in user_features[user_id]:
user_features[user_id][item_id] = 0
user_features[user_id][item_id] += 1
# 生成特征:按类别统计行为次数
category_features = {}
for user_id, items in user_features.items():
for item_id, count in items.items():
category = get_category(item_id) # 获取视频类别
if category not in category_features:
category_features[category] = 0
category_features[category] += count
return category_features
实时特征工程示例(用户刚完成“点赞”操作):
# 用户实时行为请求示例(发送到实时计算系统)
{
"user_id": "user_123",
"action": "like",
"item_id": "video_456",
"timestamp": "2023-10-27T10:30:00Z"
}
# 实时系统处理逻辑(简化)
def real_time_feature_update(user_action):
# 更新用户当前兴趣特征(如最近点赞的视频类别)
user_interest = get_user_interest(user_id)
if user_action['item_id'] not in user_interest:
user_interest.append(user_action['item_id'])
# 更新后发送到推荐服务
send_to_recommender(user_id, user_interest)
5) 【面试口播版答案】
“在快手,用户画像构建是融合多源数据(用户行为、内容、社交)的动态建模过程。首先,数据源方面,用户行为数据(点击、点赞、收藏)反映兴趣强度,内容特征(标签、类别)帮助理解偏好主题,社交关系(关注、好友互动)体现社交影响力。然后,处理流程分离线和实时:离线通过批量计算(如每日处理用户行为日志),生成静态特征(比如用户对‘美食’类视频的点击率、最近一周点赞的创作者列表);实时通过流式处理(如用户刚刷完一个视频,实时更新当前兴趣特征),确保推荐时效性。这样,用户画像就能综合反映用户的兴趣、属性和社交关系,为内容推荐提供精准的用户表征。”
6) 【追问清单】
7) 【常见坑/雷区】