推荐系统的起步阶段一般都从基于内容的推荐开始做起,内容推荐系统可以快速搭建并且快速见效。要把基于内容的推荐做好,重要的是要做好“抓、洗、挖、算”:
- 抓:持续抓取数据来丰富自己的内容源和分析维度是必不可少的(即便是对于千亿大厂来说);
- 洗:冗余、垃圾、政治、涩情等内容都需要被清洗出去;
- 挖:不管是抓来的数据还是自家的数据,如果不深入挖掘,那就是对资源的极度浪费。这是推荐系统最重要的环节;
- 算:将用户的兴趣和物品的属性相匹配,计算出更合理的相关性。这是推荐系统的使命。
快速搭建内容推荐系统,大体上可以分成三个步骤:
- 构建标签库(标签挖掘):利用文本挖掘算法,把非结构化内容进行结构化,去粗取精,保留关键信息,构建高质量的标签库(其结果的准确度、粒度、覆盖面决定了用户画像的质量);
- 构建用户兴趣画像(标签选择):根据用户注册数据、行为数据,把第一步的标签传递给用户,作为用户的兴趣标签;
- 内容推荐算法:通常包括相似性计算、相关性计算和学习算法等
标签挖掘是内容推荐中最重要的一环,本质上是将非结构化数据进行结构化的过程。利用成熟的NLP算法分析物品端的文本信息,可以得到如下信息:
- 关键词提取:最基础的标签来源,也为其他文本分析提供基础数据,常用TF-IDF和TextRank。
- 嵌入Embedding:从词到篇章,都可以学习其嵌入表达。嵌入表达可以挖掘出字面意思之下的语义信息,并且用有限的维度表达出来。
- 文本分类:将文本按照分类体系进行分类,用分类来表达粗粒度的结构化信息。
- 命名实体识别:人物、位置、著作、影视剧、历史事件和热点事件等,常用基于词典的方法结合CRF模型(Conditional Random Field,条件随机场)。
- 文本聚类:在无人制定分类体系的前提下,无监督地将文本划分成多个类簇。虽然不是标签,类簇编号也是用户画像的常见构成。
- 主题模型:从大量已有文本中学习主题向量,然后再预测新的文本在各个主题上的分布概率。主题模型也很实用,它其实也是一种聚类思想。主题向量不是标签形式,但也是用户画像的常用构成。
关键词提取是最基础的标签来源,也为其他文本分析提供基础数据。常用方法有TF-IDF和TextRank,都属于无监督方法,无需标注数据。
1.1.1 TF-IDF
TF-IDF提取关键词的思想来自信息检索领域,其思想很朴素:
- 在一篇文章中,反复出现的词会更重要;
- 在所有文本中都出现的词不重要。
这两点分别量化成TF和IDF两个指标:
TF(Term Frequence,词频)
某一个词在文本中出现的次数。由于在短文本中,词频通常都是1,因此TF在长文本中更加有用。
IDF(Inverse document Frequence,逆文本频率指数)
在已有的所有文本中,统计某一词出现在了多少文本中,也就是文档频率(记为n),以及一共有多少文本(语料库规模,记为N),
IDF的计算公式为:
IDF=log(N/(n+1))
IDF的计算公式有如下几个特点:
- 所有词的语料库规模N都是一样的,因此文档频率n越小的词,IDF值越大。
- 如果一个词的文档频率n为0,会得到无穷大的IDF值,因此分母中要有一个加1,起平滑作用。
- 对于新词,文档频率n应该是0,但也可以默认复制为所有词的文档频率平均数、众数或中位数。
IDF值的本质与信息熵息息相关,如果一个词在所有文档中出现的频率很大,那么它在一个文档中带来的信息量就很小。
IDF是提前统计好的:利用TF-IDF方法提取关键词,有一个必要的资源,就是提前根据词典计算的IDF值,尤其是对于短文本,TF值不生效,几乎就是依赖IDF排序。
TF*IDF
计算出TF值和IDF值后,将两个值相乘就能得到每一个词的权重。
根据权重筛选关键词有如下几种方式:
- 保留K个权重最高的关键词;
- 计算权重均值,保留均值之上的关键词;
- 设定权重阈值,保留阈值之上的关键词;
- 针对特定场景的过滤规则,如:仅提取动词和名词。
1.1.2 TextRank
TextRank的思想与PageRank类似,可以概括为以下几点:
- 文本中设定一个窗口宽度,比如K个词,统计窗口内词与词的共现关系,将其看成无向图;
- 所有词初始化的重要性都是1;
- 每个节点把自己的权重平均分配给和自己有连接的其他节点;
- 每个节点将所有其他节点分配给自己的权重求和,作为自己的新权重;
- 以上两步反复迭代,知道所有的节点权重收敛为止。
那些有共现关系的词,都会互相支持对方成为关键词。
常规的抽取标签方法,得到的标签都是稀疏的,而且为了覆盖广泛,往往会引入大量的同义或者近义标签。Embedding可以解决这个问题。
Embedding是一个数学概念,也叫作嵌入。嵌入表达可以挖掘出字面意思之下的语义信息,并且用有限的维度表达出来。
通过学习得到每个词低维度的稠密向量,有了这个向量就可以计算词之间的距离,从而实现标签的归一化,提高标签库的经济性。
比如某个词有100个语义,于是这个词可以用一个100维的向量表达,向量中各个维度值的大小代表了词包含的各个语义的量。
学习Embedding向量也叫作表示学习,常见方法有Word2Vec、GloVe、FastText。
其中FastText是Facebook开源工具,还可用于做文本分类。
图文信息流APP的资讯内容需要被自动分类到不同的频道中,从而得到最粗粒度的结构化信息,也可被推荐系统用来在冷启动时探索用户兴趣。
短文本分类方面最经典的算法是SVM,现在最常用的工具是FastText。
FastText是一个工具,它可以做两件事——学习词语的Embedding向量以及做文本分类,尤其是句子分类。
句子分类的场景就是给句子打标签,一个句子输出多个标签。
命名实体,是文本中具有特定意义的实体。例如地名、电影名、书籍名等,是一类非常有价值的标签。将这些描述客观实体的词,从非结构化的文本中识别出来, 有助于构建高质量的标签库。
命名实体识别(NER,Named-Entity Recognition)在NLP技术中是非常成熟的技术方向,通常被认为是一种序列标注问题,和分词、词性标注属于同一类问题。
所谓序列标注问题,就是从左到右遍历一个序列中的每个元素,一边遍历一边对每一个元素分类,分类的符号因序列标注问题的不同而不同。序列标注不是一个简单的分类问题,因为通常情况下预测某个元素的标签时会依赖前一个元素。
序列标注问题经典的模型是HMM(Hidden Markov Medel,隐马尔可夫模型)和CRF(Conditional Random Field,条件随机场);也可使用比较实用的词典法。
文本聚类如何用在挖掘标签库上呢?
- 对全量文本聚类,得到每一个类的中心;
- 将新的文本向最近的类中心靠拢,并归于某个聚类;
- 给每个类赋予一个独一无二的ID,也可以从该类中找出最能代表该类的主题词来作为类别标签。
文本聚类一般选择主题模型或者隐语义模型(LSI,Latent Semantic Index)。以LDA(Latent Dirichlet Allocation,潜在狄利克雷分布)为代表的主题模型能更准确地抓住主题,并且能够得到软聚类效果,也就是说可以让一条文本属于多个类簇。
- 标签覆盖面:能覆盖的用户/物品越多越好;
- 标签健康度:好的标签库,其标签覆盖分布熵要高,熵越高分布越均匀;
- 标签经济型:标签之间的相似性越小越好。
前文讲解了如何将用户端和物品端文本结构化,从而得到标签、关键词、Embedding向量等。接下来看看如何把物品的结构化信息传递给用户。
我们把用户是否消费物品看成一个分类问题。用户用实际行动帮我们标注了若干数据,那么挑选出他实际感兴趣的特性就变成了特征选择问题。
最常用的是卡方检验和信息增益两种方法,这两种方法都是有监督学习,基本思想如下:
- 把物品的结构化内容看成文档;
- 把用户对物品的行为看成类别;
- 每个用户访问过的物品就是一个文本集合;
- 在这个文本集合上使用特征选择算法选出每个用户关心的东西。
卡方检验与信息增益的不同之处在于:前者针对每个分类单独筛选出一套标签出来,后者则是全局统一筛选。
- 类别为Cj的文本中,出现词Wi的文本数A;
- 类别为Cj的文本中,没有出现词Wi的文本数C;
- 其他类别中,出现词Wi的文本数B;
- 其他类别中,没有出现词Wi的文本数D;
- N为全文本量,由于是比较卡方值的大小,N其对每个词都一样,计算时可以省略。
信息增益(IG,Information Gain)在数据挖掘的决策树分类算法中应用得最多,经典的决策树算法挑选分裂节点时,就要计算各个属性的信息增益,并且始终挑选信息增益最大的节点作为分裂点。
信息增益大的词可以作为关键词,计算步骤如下:
- 统计全局文本的信息熵
- 统计每个词的条件熵,即知道了一个词后再统计文本的信息熵,只不过这里要分别计算包含词和不包含词两部分的信息熵,再按各自文本比例加权平均
- 每个词的信息增益 = 全文本信息熵 - 单个的条件熵
备注:要理解信息增益,必先理解信息熵。但对于大多数能看到这儿的同学,想必对于信息熵的概念早已耳熟能详。
对于基于内容的推荐系统,最简单的推荐算法当然是计算相似性:
用户的画像内容表示为稀疏向量,同时内容端也有对应的稀疏向量,在两者之间计算余弦相似度,根据相似度对推荐物品排序。
如果再进一步,可以更好地利用内容中的结构化信息:
直观上新闻的标题更重要,所以我们可以借鉴信息检索中的相关性计算方法来做推荐排序计算,即BM25F算法。
收集优化目标类行为的日志数据,将其转换成训练样本,然后训练预估模型。
每个样本由两部分组成:
- 特征变量可以包含用户端的画像内容、物品端的结构化内容,可选的有日志记录时的一些上下文场景信息,如时间、位置、设备。
- 目标变量是用户行为,作为标注信息,包含“有反馈”和“无反馈”。
用这样的样本训练一个二分类器时,常用的模型师逻辑回归和梯度提升树,或二者的结合。在推荐匹配时,预估用户发生行为的概率,并按照概率排序。
基于内容的推荐系统一般是推荐系统的起步阶段,且会持续存在:
- 内容数据始终存在并蕴含了丰富的信息,不用太浪费;
- 产品冷启动阶段没有用户行为,别无选择;
- 新的物品要被推荐出去,首选内容推荐。