基于内容的推荐:TF-IDF 与余弦相似度计算
字数 3185 2025-12-08 21:46:24

基于内容的推荐:TF-IDF 与余弦相似度计算

题目描述
在推荐系统中,基于内容的推荐是一种重要的方法。其核心思想是通过分析物品(如文章、商品、视频)的内容特征,为用户推荐与其历史喜好物品相似的物品。本专题将详细讲解如何将文本内容(如文章标题、描述)转化为数值特征,并使用 TF-IDF 和余弦相似度计算物品之间的相似性,从而构建一个简易的基于内容的推荐模型。

知识点剖析
基于内容的推荐主要包括以下步骤:

  1. 特征提取:将非结构化的文本内容转化为结构化的特征向量。
  2. 特征加权:使用 TF-IDF 等统计方法,评估特征词在描述特定内容时的重要性。
  3. 相似度计算:通过余弦相似度等度量方法,计算不同内容特征向量之间的相似程度。

详细步骤讲解

第一步:文本预处理与特征提取
目标是构建一个“词袋”(Bag of Words),即所有文档中出现的独特词汇的集合。

  1. 分词:将每篇文档(例如商品描述)的文本,分割成独立的词(Token)。例如,文档 D1: "这个苹果手机很流畅" -> ["这个", "苹果", "手机", "很", "流畅"]。
  2. 去除停用词:移除对内容区分意义不大的高频词,如“这个”、“很”。得到 ["苹果", "手机", "流畅"]。
  3. 构建词汇表:统计所有文档处理后得到的独特词汇,形成一个列表。假设我们有三个商品描述:
    • D1: ["苹果", "手机", "流畅"]
    • D2: ["华为", "手机", "拍照", "清晰"]
    • D3: ["苹果", "电脑", "办公"]
    • 词汇表 V = ["苹果", "手机", "流畅", "华为", "拍照", "清晰", "电脑", "办公"]
  4. 向量化:将每篇文档表示为一个向量,向量的维度等于词汇表大小。向量每个位置的值,初始可以使用该词在文档中出现的次数(词频,TF)。例如:
    • D1 向量: [1, 1, 1, 0, 0, 0, 0, 0] (对应“苹果”出现1次,“手机”1次,“流畅”1次,其他词0次)
    • D2 向量: [0, 1, 0, 1, 1, 1, 0, 0]
    • D3 向量: [1, 0, 0, 0, 0, 0, 1, 1]

第二步:TF-IDF 特征加权
仅用词频(TF)无法有效衡量一个词的重要性。例如,“手机”这个词在所有文档中都常见,其区分度不高。TF-IDF 通过以下公式改进:

  • 词频(Term Frequency, TF):词在当前文档中出现的频率。通常用 TF(t, d) = (词t在文档d中出现的次数) / (文档d中总词数) 或简单的计数表示。我们用计数简化版。
  • 逆文档频率(Inverse Document Frequency, IDF):衡量一个词的普遍重要性。如果某个词在所有文档中都出现,则其IDF值低。公式为:IDF(t) = log( (文档总数N) / (包含词t的文档数 df(t) + 1) )。加1是为了防止分母为0。
  • TF-IDFTF-IDF(t, d) = TF(t, d) * IDF(t)

计算示例
我们有3篇文档(N=3)。

  1. 计算每个词的IDF(以自然对数log为例):
    • “苹果”: df(苹果)=2 (D1, D3), IDF = log(3 / (2+1)) = log(1) = 0
    • “手机”: df(手机)=2 (D1, D2), IDF = log(3 / 3) = 0
    • “流畅”: df(流畅)=1, IDF = log(3 / 2) ≈ 0.405
    • “华为”: df(华为)=1, IDF = log(3 / 2) ≈ 0.405
    • “拍照”: df(拍照)=1, IDF = log(3 / 2) ≈ 0.405
    • “清晰”: df(清晰)=1, IDF = log(3 / 2) ≈ 0.405
    • “电脑”: df(电脑)=1, IDF = log(3 / 2) ≈ 0.405
    • “办公”: df(办公)=1, IDF = log(3 / 2) ≈ 0.405
  2. 计算每篇文档的 TF-IDF 向量(这里TF用计数,非归一化值):
    • D1: [10, 10, 1*0.405, 0, 0, 0, 0, 0] = [0, 0, 0.405, 0, 0, 0, 0, 0]
    • D2: [0, 10, 0, 10.405, 10.405, 10.405, 0, 0] = [0, 0, 0, 0.405, 0.405, 0.405, 0, 0]
    • D3: [10, 0, 0, 0, 0, 0, 10.405, 1*0.405] = [0, 0, 0, 0, 0, 0, 0.405, 0.405]
    • 可以看出,“苹果”、“手机”这类常见词的权重被降低甚至清零,而更能体现文档特色的词获得了更高权重。

第三步:余弦相似度计算
有了物品的特征向量,我们需要一个指标来衡量两个向量(即两个物品)的相似程度。余弦相似度通过计算两个向量夹角的余弦值来实现,其值在[-1,1]之间,通常用于非负向量(如TF-IDF),其值在[0,1]之间,值越大越相似。

公式cos(θ) = (A·B) / (||A|| * ||B||)

  • A·B 是向量A和B的点积(对应元素相乘再求和)。
  • ||A|| 是向量A的欧几里得范数(模长),即各元素平方和开根号。

计算示例:比较 D1 和 D2 的余弦相似度。

  1. D1向量: [0, 0, 0.405, 0, 0, 0, 0, 0]
  2. D2向量: [0, 0, 0, 0.405, 0.405, 0.405, 0, 0]
  3. 点积 A·B: (00)+(00)+(0.4050)+(00.405)+... = 0
  4. 模长 ||A||: sqrt(0^2 + 0^2 + 0.405^2 + ...) = 0.405
  5. 模长 ||B||: sqrt(0^2+0^2+0^2+0.405^2+0.405^2+0.405^2) ≈ sqrt(0.492) ≈ 0.701
  6. 余弦相似度: 0 / (0.405 * 0.701) = 0
    • 因为D1和D2没有共享任何有区分度的词(TF-IDF权重大于0的词),所以相似度为0。

比较 D1 和 D3

  1. D1: [0, 0, 0.405, 0, 0, 0, 0, 0]
  2. D3: [0, 0, 0, 0, 0, 0, 0.405, 0.405]
  3. 点积: 0
  4. 模长:||D1||=0.405, ||D3||≈0.573
  5. 余弦相似度: 0
    • 虽然D1和D3共享“苹果”,但“苹果”的IDF为0,不贡献相似度。

第四步:推荐生成
在基于内容的推荐中,我们通常有一个用户的历史偏好物品集合(称为用户画像)。

  1. 构建用户画像向量:将该用户喜欢(或交互过)的所有物品的TF-IDF向量求平均,得到一个代表该用户整体偏好的综合向量。例如,假设用户喜欢D1,则其画像向量就是D1的TF-IDF向量本身。
  2. 计算相似度并排序:对于尚未被该用户交互过的候选物品(如D2, D3),计算其向量与用户画像向量之间的余弦相似度。
  3. 生成推荐列表:将候选物品按照相似度得分从高到低排序,将排名靠前的物品推荐给用户。

总结
基于内容的推荐通过将物品内容量化为特征向量,利用 TF-IDF 进行特征加权,并使用余弦相似度衡量物品间或物品与用户画像间的匹配度。其优点是可解释性强,不依赖其他用户数据(不存在冷启动问题),但缺点在于特征提取依赖领域知识,且推荐结果可能局限于与用户历史兴趣高度相似的物品,缺乏多样性。在实际系统中,常与协同过滤等算法结合使用。

基于内容的推荐:TF-IDF 与余弦相似度计算 题目描述 在推荐系统中,基于内容的推荐是一种重要的方法。其核心思想是通过分析物品(如文章、商品、视频)的内容特征,为用户推荐与其历史喜好物品相似的物品。本专题将详细讲解如何将文本内容(如文章标题、描述)转化为数值特征,并使用 TF-IDF 和余弦相似度计算物品之间的相似性,从而构建一个简易的基于内容的推荐模型。 知识点剖析 基于内容的推荐主要包括以下步骤: 特征提取 :将非结构化的文本内容转化为结构化的特征向量。 特征加权 :使用 TF-IDF 等统计方法,评估特征词在描述特定内容时的重要性。 相似度计算 :通过余弦相似度等度量方法,计算不同内容特征向量之间的相似程度。 详细步骤讲解 第一步:文本预处理与特征提取 目标是构建一个“词袋”(Bag of Words),即所有文档中出现的独特词汇的集合。 分词 :将每篇文档(例如商品描述)的文本,分割成独立的词(Token)。例如,文档 D1: "这个苹果手机很流畅" -> [ "这个", "苹果", "手机", "很", "流畅" ]。 去除停用词 :移除对内容区分意义不大的高频词,如“这个”、“很”。得到 [ "苹果", "手机", "流畅" ]。 构建词汇表 :统计所有文档处理后得到的独特词汇,形成一个列表。假设我们有三个商品描述: D1: [ "苹果", "手机", "流畅" ] D2: [ "华为", "手机", "拍照", "清晰" ] D3: [ "苹果", "电脑", "办公" ] 词汇表 V = [ "苹果", "手机", "流畅", "华为", "拍照", "清晰", "电脑", "办公" ] 向量化 :将每篇文档表示为一个向量,向量的维度等于词汇表大小。向量每个位置的值,初始可以使用该词在文档中出现的次数(词频,TF)。例如: D1 向量: [ 1, 1, 1, 0, 0, 0, 0, 0 ] (对应“苹果”出现1次,“手机”1次,“流畅”1次,其他词0次) D2 向量: [ 0, 1, 0, 1, 1, 1, 0, 0 ] D3 向量: [ 1, 0, 0, 0, 0, 0, 1, 1 ] 第二步:TF-IDF 特征加权 仅用词频(TF)无法有效衡量一个词的重要性。例如,“手机”这个词在所有文档中都常见,其区分度不高。TF-IDF 通过以下公式改进: 词频(Term Frequency, TF) :词在 当前文档 中出现的频率。通常用 TF(t, d) = (词t在文档d中出现的次数) / (文档d中总词数) 或简单的计数表示。我们用计数简化版。 逆文档频率(Inverse Document Frequency, IDF) :衡量一个词的普遍重要性。如果某个词在 所有文档 中都出现,则其IDF值低。公式为: IDF(t) = log( (文档总数N) / (包含词t的文档数 df(t) + 1) ) 。加1是为了防止分母为0。 TF-IDF : TF-IDF(t, d) = TF(t, d) * IDF(t) 。 计算示例 : 我们有3篇文档(N=3)。 计算每个词的IDF(以自然对数log为例): “苹果”: df(苹果)=2 (D1, D3), IDF = log(3 / (2+1)) = log(1) = 0 “手机”: df(手机)=2 (D1, D2), IDF = log(3 / 3) = 0 “流畅”: df(流畅)=1, IDF = log(3 / 2) ≈ 0.405 “华为”: df(华为)=1, IDF = log(3 / 2) ≈ 0.405 “拍照”: df(拍照)=1, IDF = log(3 / 2) ≈ 0.405 “清晰”: df(清晰)=1, IDF = log(3 / 2) ≈ 0.405 “电脑”: df(电脑)=1, IDF = log(3 / 2) ≈ 0.405 “办公”: df(办公)=1, IDF = log(3 / 2) ≈ 0.405 计算每篇文档的 TF-IDF 向量(这里TF用计数,非归一化值): D1: [ 1 0, 1 0, 1* 0.405, 0, 0, 0, 0, 0] = [ 0, 0, 0.405, 0, 0, 0, 0, 0 ] D2: [ 0, 1 0, 0, 1 0.405, 1 0.405, 1 0.405, 0, 0] = [ 0, 0, 0, 0.405, 0.405, 0.405, 0, 0 ] D3: [ 1 0, 0, 0, 0, 0, 0, 1 0.405, 1* 0.405] = [ 0, 0, 0, 0, 0, 0, 0.405, 0.405 ] 可以看出,“苹果”、“手机”这类常见词的权重被降低甚至清零,而更能体现文档特色的词获得了更高权重。 第三步:余弦相似度计算 有了物品的特征向量,我们需要一个指标来衡量两个向量(即两个物品)的相似程度。余弦相似度通过计算两个向量夹角的余弦值来实现,其值在[ -1,1]之间,通常用于非负向量(如TF-IDF),其值在[ 0,1 ]之间,值越大越相似。 公式 : cos(θ) = (A·B) / (||A|| * ||B||) A·B 是向量A和B的点积(对应元素相乘再求和)。 ||A|| 是向量A的欧几里得范数(模长),即各元素平方和开根号。 计算示例 :比较 D1 和 D2 的余弦相似度。 D1向量: [ 0, 0, 0.405, 0, 0, 0, 0, 0 ] D2向量: [ 0, 0, 0, 0.405, 0.405, 0.405, 0, 0 ] 点积 A·B : (0 0)+(0 0)+(0.405 0)+(0 0.405)+... = 0 模长 ||A|| : sqrt(0^2 + 0^2 + 0.405^2 + ...) = 0.405 模长 ||B|| : sqrt(0^2+0^2+0^2+0.405^2+0.405^2+0.405^2) ≈ sqrt(0.492) ≈ 0.701 余弦相似度 : 0 / (0.405 * 0.701) = 0 因为D1和D2没有共享任何有区分度的词(TF-IDF权重大于0的词),所以相似度为0。 比较 D1 和 D3 : D1: [ 0, 0, 0.405, 0, 0, 0, 0, 0 ] D3: [ 0, 0, 0, 0, 0, 0, 0.405, 0.405 ] 点积 : 0 模长 :||D1||=0.405, ||D3||≈0.573 余弦相似度 : 0 虽然D1和D3共享“苹果”,但“苹果”的IDF为0,不贡献相似度。 第四步:推荐生成 在基于内容的推荐中,我们通常有一个用户的历史偏好物品集合(称为用户画像)。 构建用户画像向量 :将该用户喜欢(或交互过)的所有物品的TF-IDF向量 求平均 ,得到一个代表该用户整体偏好的综合向量。例如,假设用户喜欢D1,则其画像向量就是D1的TF-IDF向量本身。 计算相似度并排序 :对于尚未被该用户交互过的候选物品(如D2, D3),计算其向量与用户画像向量之间的余弦相似度。 生成推荐列表 :将候选物品按照相似度得分从高到低排序,将排名靠前的物品推荐给用户。 总结 基于内容的推荐通过将物品内容量化为特征向量,利用 TF-IDF 进行特征加权,并使用余弦相似度衡量物品间或物品与用户画像间的匹配度。其优点是可解释性强,不依赖其他用户数据(不存在冷启动问题),但缺点在于特征提取依赖领域知识,且推荐结果可能局限于与用户历史兴趣高度相似的物品,缺乏多样性。在实际系统中,常与协同过滤等算法结合使用。