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 我常用的特征工程技巧

做特征工程这些年,我总结了几条铁律:

  1. 先简单后复杂:别一上来就搞交叉特征。先把单特征做干净,效果往往就够用了。
  2. 特征要可解释:我遇到过用 200 维 Embedding 做特征,模型效果好了 0.5%,但上线后出了问题完全没法排查。后来我换成了 10 个可解释的统计特征,效果差不多,但出了问题一眼就能定位。
  3. 注意特征穿越:这是新手最容易犯的错。比如用「用户明天的购买行为」来预测「今天的推荐点击」。我刚开始做的时候也踩过这个坑,模型离线 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 小结

这一章内容不少,但核心就三件事:

  • 用户画像:把行为变成标签,注意置信度和衰减。
  • 物品标签:从多维度理解商品,控制标签数量。
  • 特征工程:翻译成模型能懂的数字,避免穿越和过拟合。

说实话,这三件事做好了,推荐系统的地基就稳了。下一章我们会聊召回策略,到时候你会发现,好的特征能让召回事半功倍。

嗯,今天就到这儿。有问题欢迎交流。