在前两篇文章里,我们讨论了推荐系统的两个关键能力:

CODE
协同过滤:通过别人的行为理解你
推荐系统实施细节:如何让系统真正稳定运行

但现实中,还有一种非常重要的情况:系统没有别人可以参考。 

比如:

CODE
新用户
新商品
冷门内容
小众领域

这时候,协同过滤就会遇到一个问题:

CODE
没有历史行为
没有相似用户
没有参考对象

于是系统必须换一种方式思考——不是别人喜欢什么,而是这个内容本身是什么。这就是今天要讲的:基于内容的过滤(Content-Based Filtering)。

什么是基于内容的过滤?

基于内容的过滤是指根据用户特征和内容特征之间的匹配程度来做推荐。

注意这里的关键词:特征(Feature)和匹配(Match)。

与协同过滤不同,基于内容的过滤并不依赖其他用户的行为,而是直接分析:

CODE
用户是谁
内容是什么

系统会通过这些信息,判断它们是否适合彼此。

假设你在做一个招聘 App。现在有:

CODE
用户:求职者
内容:岗位

岗位特征: 

CODE
城市:上海
行业:互联网
经验:3~5 年
技能:Python
薪资:20k

用户特征: 

CODE
城市:上海
行业:互联网
经验:4 年
技能:Python
期望薪资:18k

系统会计算匹配程度,如果匹配度高,则推荐这个岗位。这里完全不需要其他用户行为,只需要内容属性。

为什么基于内容的过滤一定会存在?

因为现实世界里,经常会出现数据不够的情况。例如:

CODE
新电影刚上线
新商品刚发布
新用户刚注册

协同过滤需要很多历史行为,但基于内容的过滤只需要内容本身的信息。

基于内容的过滤真正的核心:特征

这个算法的质量,几乎完全取决于你定义了哪些特征。

假设一篇新闻有这些特征:

CODE
主题:科技
关键词:AI
长度:1200 字
情绪:中性
发布时间:今天

一个用户的特征: 

CODE
最近阅读主题:科技
平均阅读长度:1000 字
关注关键词:AI

系统就会判断匹配度很高,然后推荐这篇文章。

一个关键概念:向量(Vector)

在系统内部,所有信息都会变成一组数字。例如:

用户:

CODE
[科技兴趣, 体育兴趣, 财经兴趣]

可能是: 

CODE
[0.9, 0.1, 0.3]

新闻:

CODE
[科技程度, 体育程度, 财经程度]

可能是: 

CODE
[0.8, 0.0, 0.2]

匹配的方式是:

CODE
匹配度 = 用户向量 · 内容向量

也就是点积(Dot Product)。

如果两个向量方向一致,匹配度就高;如果方向不同,匹配度就低。

这正是现代基于内容推荐系统的核心机制:通过用户向量和内容向量之间的点积来预测匹配程度。

现代系统是怎么生成这些向量的?

答案是神经网络。

通常会有两个网络:

CODE
用户网络
内容网络

一个非常直观的结构 

CODE
用户特征 → 用户网络 → 用户向量
内容特征 → 内容网络 → 内容向量
用户向量 · 内容向量 → 推荐分数

一个简化版 TensorFlow 示例如下:

CODE
import tensorflow as tf
user_net = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation="relu"),
    tf.keras.layers.Dense(32)
])
item_net = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation="relu"),
    tf.keras.layers.Dense(32)
])
user_input = tf.keras.Input(shape=(10,))
item_input = tf.keras.Input(shape=(8,))
user_vector = user_net(user_input)
item_vector = item_net(item_input)
output = tf.keras.layers.Dot(
    axes=1
)([user_vector, item_vector])
model = tf.keras.Model(
    inputs=[user_input, item_input],
    outputs=output
)

你只需要理解:

CODE
两个网络
输出两个向量
做一次点积
得到匹配度

这就是一个标准的基于内容推荐模型。

特征设计,比模型更重要

在实际项目中,团队往往花最多时间在设计特征,而不是调模型。

假设你在做一个电商推荐系统,一开始你使用:

CODE
价格
品牌
类别

效果一般。后来增加一个特征:

CODE
是否在促销

结果点击率显著提升。原因很简单,这个特征更接近真实决策。

基于内容推荐的优点和限制

这是产品经理必须知道的一点。

优点包括:

CODE
不依赖其他用户
适合新用户
适合新内容
可解释性强

主要的限制有:

CODE
需要大量特征工程
容易过度依赖标签
不容易发现新兴趣

例如,如果用户一直看科幻电影,系统可能永远推荐科幻电影。信息茧房就是这么产生的。

因此,现实世界的推荐系统,通常不是单一算法,而是:协同过滤 + 基于内容推荐 + 规则系统 。

例如: 

CODE
新用户 → 基于内容
老用户 → 协同过滤
热门内容 → 规则

当系统拥有大量历史数据时,它可以通过别人理解你。但在很多关键时刻,系统必须先学会一件更基础的能力:理解内容本身。

基于内容的过滤,本质上并不是一个复杂的算法,而是一种更直接的思考方式:通过描述用户和描述内容,让系统在两者之间找到合适的匹配。

从某种意义上说,这就像一个经验丰富的面试官。在没有任何推荐信的情况下,他仍然可以通过简历判断一个人是否适合这个岗位。

而一个成熟的推荐系统,也应该具备同样的能力:当没有别人可以参考时,它仍然能够做出一个合理的判断。

附录:本文涉及的专有名词中英文对照(标红为最核心)

中文
English
说明
基于内容的过滤
Content-Based Filtering
根据用户特征与内容特征之间的匹配程度进行推荐
特征
Feature
描述用户或内容属性的数据
向量
Vector
用一组数字表示对象特征
用户向量
User Vector
描述用户偏好的数字表示
内容向量
Item Vector
描述内容属性的数字表示
点积
Dot Product
衡量两个向量匹配程度的计算方式
特征工程
Feature Engineering
设计和选择有效特征的过程