点击查看我的知乎专栏:推荐搜索广告
本文以文章推荐为例,编写一个推荐系统,应用基于内容推荐算法解决问题。
实现过程
基于内容推荐的过程一般包括以下三步:
1、给出物品表示:为每个物品抽取出一些特征来表示此物品;
2、学习用户偏好:利用一个用户过去喜欢(及不喜欢)的物品的特征数据,来学习出此用户偏好;
3、生成推荐列表:根据候选物品表示和用户偏好,为该用户生成其最可能感兴趣的 n 个物品。
注:有关基于内容推荐的基本理论框架可参见之前的文章《推荐算法分类:协同过滤推荐、基于内容推荐、基于知识推荐、混合推荐》
本文的具体实现过程如下:
1、给出物品表示 - 基于向量空间模型的方法,具体采用了基于 TF-IDF 的文本表示法;
2、学习用户偏好 - 把用户所有喜欢的物品对应的向量的平均值作为此用户的 profile;
3、生成推荐列表 - 把候选物品里与此用户最相关(余弦相似度最大)的 N 个物品推荐给此用户。
基于 TF-IDF 的文本表示法
文本相似计算是进行文本聚类的基础,和传统结构化数值数据的聚类方法类似,文本聚类是通过计算文本之间"距离"来表示文本之间的相似度并产生聚类。文本相似度的常用计算方法有余弦定理和 Jaccard 系数。但是文本数据与普通的数值数据或类属数据不同,文本数据是一种半结构化数据,在进行文本挖掘之前必须要对文本数据源进行处理,如分词、向量化表示等。其目的就是使用量化的数值来表达这些半结构化的文本数据,使其适用于分析计算。下面以基于 TF-IDF 的文档表示法为例,先介绍 TF-IDF 算法,再基于 TF-IDF 算法表示文本。
TF-IDF
TF-IDF 是一种加权技术,它通过统计的方法来计算和表达某个关键词在文本中的重要程度。
TF-IDF 是由两部分组成,一部分是词频 TF(Token Frequency),TFtd=Ftd/Sd,关键词 t 在文档 d 中的词频=关键词 t 在文档 d 中出现的次数/所有关键词在文档 d 中出现的总次数。另一部分是逆向文档频率 IDF(Inverse Document Frequency),IDFt=ln((1+|D|)/|Dt|),关键词 t 的逆向文档频率=ln((1+文档总数)/包含关键词 t 的文档数量)。
TF-IDF 的值就是由这两部分相乘得到的,TF-IDFtd=TFtd*IDFt。要指出的是 TF-IDF 不是指某一个特定的公式,而是表示了一系列基于基本 TF-IDF 方法变形(分别对 TF 和 IDF 这两部分进行处理)的公式的集合,上述公式是被多数系统证明比较有效的一个公式。
TF-IDF 表示文本
通过上面的介绍可以发现,每个文本中的每个关键词都有属于自己的 TF-IDF 值,所以我们的思路大致是:
1、获取关键词表;
2、计算每个关键词的 TF-IDF 值;
3、使用 TF-IDF 表示一个文本。
1、获取关键词表
现有两个文本 d1 和 d2,将所有文本分词后得到关键词表【A, B, C, D, E, F, G】。
2、计算每个关键词的 TF-IDF 值
文本 d1 关键词分布:【A, B, C, C, E, D, A, B, F, E, E, E, F, G, G】
文本 d2 关键词分布:【C, E, E, F, G, G, A, B, E, B】
关键词 t 在文档 d 中出现的次数如下:
d1 | d2 | |
---|---|---|
A | 2 | 1 |
B | 2 | 2 |
C | 2 | 1 |
D | 1 | 0 |
E | 4 | 3 |
F | 2 | 1 |
G | 2 | 2 |
词频矩阵如下:
d1 | d2 | |
---|---|---|
A | 0.13 | 0.10 |
B | 0.13 | 0.20 |
C | 0.13 | 0.10 |
D | 0.07 | 0.00 |
E | 0.27 | 0.30 |
F | 0.13 | 0.10 |
G | 0.13 | 0.20 |
然后再计算每个关键词对应的逆向文档频率即 IDF 的值。如下表所示:
ln | |
---|---|
A | 0.4 |
B | 0.4 |
C | 0.4 |
D | 1.1 |
E | 0.4 |
F | 0.4 |
G | 0.4 |
最后将正规化后的词频与IDF值相乘,结果如下:
d1 | d2 | |
A | 0.052 | 0.040 |
B | 0.052 | 0.080 |
C | 0.052 | 0.040 |
D | 0.077 | 0.000 |
E | 0.108 | 0.120 |
F | 0.052 | 0.040 |
G | 0.052 | 0.080 |
3、使用 TF-IDF 表示一个文本
使用TF-IDF表示文本其实就是个填表的过程,将每一个文本中的每一个关键词对应关键词表的索引进行填值。
关键词表【A, B, C, D, E, F, G】
文本 d1 的文本表示:[0.052, 0.052, 0.052, 0.077, 0.108, 0.052, 0.052]
文本 d2 的文本表示:[0.040, 0.080, 0.040, 0.000, 0.120, 0.040, 0.080]
代码实例
#!/usr/bin/env python
# coding: utf-8
"""
@Time: Created on 2021-02-23 | Updated on 2021-02-23
@Author: 小小磊
@Website:
@Description: 基于 TF-IDF 的文本表示。具体地,
1、获取关键词表;
2、计算每个关键词的 TF-IDF 值;
3、使用 TF-IDF 表示一个文本。;
"""
import jieba
import numpy as np
import math
class TfIdf(