3. 内容理解与画像:用户画像构建、物品内容标签化、特征工程基础
好,咱们进入第三章。说实话,这一章是整个推荐系统的地基。
你想想看,不管你的模型多花哨,算法多高级,最终喂进去的都是特征。特征质量不行,模型再牛也白搭。我见过太多团队,花三个月调模型,不如花三天把用户画像做扎实了。
3.1 用户画像构建:从原始行为到结构化标签
用户画像,说白了就是把用户的行为数据,翻译成我们能理解的标签。
比如一个用户点了三次「篮球鞋」,收藏了一次「跑步机」。我们不能只记住这些行为,得提炼出「运动爱好者」、「高消费潜力」这样的标签。
3.1.1 画像的层级结构
我个人习惯把画像分成三层:
- 基础属性层:性别、年龄、地域、设备型号。这些相对稳定,变化慢。
- 兴趣偏好层:类目偏好、品牌偏好、价格带偏好。这些会随着时间漂移。
- 行为意图层:近期搜索词、加购未支付、浏览深度。这些时效性极强。
核心原则:越底层的标签越稳定,越顶层的标签越敏感。做推荐时,短期意图往往比长期兴趣更重要。
3.1.2 画像构建的常见方法
嗯,这里要注意。画像不是拍脑袋定的,得有数据支撑。
| 方法 | 适用场景 | 我的经验 |
|---|---|---|
| 规则统计 | 基础属性、高频行为 | 简单粗暴,但容易漏掉长尾 |
| 聚类分析 | 用户分群、兴趣圈层 | K-Means 够用,别一上来就上深度学习 |
| LDA主题模型 | 文本兴趣挖掘 | 适合做内容型产品的兴趣标签 |
| 图嵌入 | 社交关系、行为序列 | Node2Vec 效果不错,但计算量大 |
我曾经在一个电商项目中,只用规则统计做了画像。结果发现,有个用户明明只买过一次母婴用品,却被打上了「宝妈」标签。后来一查,是帮朋友买的。所以,画像一定要考虑置信度和衰减因子。
避坑指南:标签要有置信度阈值。比如「点击3次以上才打标」,避免单次行为误导画像。
3.2 物品内容标签化:让机器理解商品
用户画像搞定了,接下来是物品。你想想看,如果系统连商品是什么都不清楚,怎么推荐?
3.2.1 标签化的维度
我一般把物品标签分成四类:
- 结构化标签:品牌、类目、价格、规格。这些直接从商品库拿。
- 文本标签:标题、描述、评论中的关键词。需要 NLP 提取。
- 视觉标签:颜色、风格、场景。用图像模型识别。
- 行为标签:热门程度、关联购买、搭配组合。从用户行为反推。
3.2.2 文本标签提取实战
这里我分享一个我常用的流程:
# 伪代码:文本标签提取流程
def extract_tags(title, description):
# 1. 分词 + 词性标注
words = jieba.posseg.cut(title + description)
# 2. 过滤停用词,保留名词、形容词
tags = [w.word for w in words if w.flag in ['n', 'a', 'vn']]
# 3. 关键词提取(TF-IDF 或 TextRank)
keywords = jieba.analyse.extract_tags(' '.join(tags), topK=10)
# 4. 实体识别(品牌、型号等)
entities = ner_model.predict(title)
return {'keywords': keywords, 'entities': entities}
这个流程看着简单,但实际落地时坑很多。比如「苹果」这个词,可能是水果,也可能是手机品牌。我建议加上上下文消歧,或者直接用预训练模型做实体识别。
注意:标签不是越多越好。我见过有人给一个商品打了200个标签,结果模型直接过拟合。控制在10-20个核心标签就够了。
3.3 特征工程基础:从原始数据到模型输入
特征工程,说白了就是「翻译」工作。把用户画像和物品标签,翻译成模型能理解的数字。
3.3.1 特征类型与处理方式
| 特征类型 | 例子 | 处理方法 |
|---|---|---|
| 数值型 | 价格、年龄、点击次数 | 归一化、分桶、对数变换 |
| 类别型 | 性别、城市、类目 | One-Hot、Label Encoding、Embedding |
| 文本型 | 标题、描述 | TF-IDF、Word2Vec、BERT |
| 时序型 | 最近一次购买时间 | 时间差、周期性编码 |
| 交叉特征 | 用户类目偏好 × 商品类目 | 笛卡尔积、FM 自动交叉 |
3.3.2 我常用的特征工程技巧
做特征工程这些年,我总结了几条铁律:
- 先简单后复杂:别一上来就搞交叉特征。先把单特征做干净,效果往往就够用了。
- 特征要可解释:我遇到过用 200 维 Embedding 做特征,模型效果好了 0.5%,但上线后出了问题完全没法排查。后来我换成了 10 个可解释的统计特征,效果差不多,但出了问题一眼就能定位。
- 注意特征穿越:这是新手最容易犯的错。比如用「用户明天的购买行为」来预测「今天的推荐点击」。我刚开始做的时候也踩过这个坑,模型离线 AUC 0.85,上线后直接崩了。
核心思想:特征工程不是堆砌特征,而是理解业务。你越懂业务,特征做得越好。
3.3.3 一个完整的特征工程示例
假设我们要做一个「猜你喜欢」的推荐模型。特征可以这样构建:
# 用户侧特征
user_features = {
'user_id': 12345,
'gender': 'male', # 类别型
'age_bucket': '25-35', # 分桶后的数值
'click_7d': 15, # 近7天点击次数
'avg_price': 299.0, # 平均购买价格
'top_category': '运动户外', # 最常点击的类目
}
# 物品侧特征
item_features = {
'item_id': 67890,
'category': '运动鞋', # 类别型
'price': 599.0, # 数值型
'brand': 'Nike', # 类别型
'sales_7d': 1200, # 近7天销量
'avg_rating': 4.5, # 平均评分
}
# 交叉特征
cross_features = {
'user_cat_match': 1, # 用户偏好类目是否匹配
'price_diff': 300.0, # 商品价格 - 用户平均购买价格
'brand_clicked': 1, # 用户是否点击过该品牌
}
你看,这些特征都很直观。模型看到「用户偏好类目匹配 + 价格适中 + 品牌熟悉」,自然就知道该不该推荐了。
我的习惯:每次加新特征前,先做一次相关性分析。如果新特征和已有特征相关性超过 0.8,就别加了,容易引入共线性。
3.4 小结
这一章内容不少,但核心就三件事:
- 用户画像:把行为变成标签,注意置信度和衰减。
- 物品标签:从多维度理解商品,控制标签数量。
- 特征工程:翻译成模型能懂的数字,避免穿越和过拟合。
说实话,这三件事做好了,推荐系统的地基就稳了。下一章我们会聊召回策略,到时候你会发现,好的特征能让召回事半功倍。
嗯,今天就到这儿。有问题欢迎交流。