推荐系统三十六式——学习笔记(二)

由于工作需要,开始学习推荐算法,参考【极客时间】->【刑无刀大牛】的【推荐系统三十六式】,学习并整理。

2. 原理篇之内容推荐

做好一个推荐系统,总共分三步:

1. 认识每一个用户

2. 给他推荐他感兴趣的东西;

3. 坐等各项指标上升。

2.1 用户画像(User Profile)

User Profile 原本用于营销领域。营销人员需要对营销的客户有更精准的认识,从而能够更有针对性地对客户和市场制定营销方案。

在推荐系统中,用户画像是给机器看的,所以就要将用户和物品都向量化。根据推荐算法不同,向量化的方式也不同。用户向量化后的结果,就是 User Profile,俗称“用户画像”。用户画像不是推荐系统的目的,而是在构建推荐系统的过程中产生的一个关键环节的副产品。

2.2 用户画像的关键因素

第一个是维度,第二个是量化。

2.2.1 维度

维度名称+维度数量+哪些维度

2.2.2 量化

要根据使用效果(排序好坏、召回覆盖等指标)来指导用户画像的量化。

2.3 用户画像构建方法

2.3.1 第一类就是查户口

直接使用原始数据作为用户画像的内容,数据本身并没有做任何抽象和归纳,没什么技术含量,但通常对于用户冷启动等场景非常有用。

2.3.2 第二类就是堆数据

堆积历史数据,做统计工作,就是从历史行为数据中去挖掘出标签,然后在标签维度上做数据统计,用统计结果作为量化结果。

2.3.3 第三类就是黑盒子

就是用机器学习方法,学习出人类无法直观理解的稠密向量,也最不被非技术人员重视,但实际上在推荐系统中承担的作用非常大。

2.4 从文本开始

数据举例来说有:

1. 物品的标题、描述;

2. 物品本身的内容(一般指新闻资讯类);

3. 物品的其他基本属性的文本。

文本数据是互联网产品中最常见的信息表达形式,数量多、处理快、存储小,因为文本数据的特殊地位,所以下面专门介绍一些建立用户画像过程中用到的文本挖掘算法

2.5 构建用户画像

大致需要做这些事:

1. 把所有非结构化的文本结构化,去粗取精,保留关键信息;

2. 根据用户行为数据把物品的结构化结果传递给用户,与用户自己的结构化信息合并。

第一步最关键也最基础,其准确性、粒度、覆盖面都决定了用户画像的质量。

第二步会把物品的文本分析结果,按照用户历史行为把物品画像( Item Profile )传递给用户。

2.6 结构化文本

我们拿到的文本,常常是自然语言描述的,就是“非结构化”的,但是计算机在处理时,只能使用结构化的数据索引,检索,然后向量化后再计算;所以分析文本,就是为了将非结构化的数据结构化

从物品端的文本信息,我们可以利用成熟的 NLP 算法分析得到的信息有下面几种:

1. 关键词提取:最基础的标签来源,也为其他文本分析提供基础数据,常用 TF-IDF 和 TextRank。

2. 实体识别:人物、位置和地点、著作、影视剧、历史事件和热点事件等,常用基于词典的方法结合 CRF 模型。

3. 内容分类:将文本按照分类体系分类,用分类来表达较粗粒度的结构化信息。

4. 文本 :在无人制定分类体系的前提下,无监督地将文本划分成多个类簇也很常见,别看不是标签,类簇编号也是用户画像的常见构成。

5. 主题模型:从大量已有文本中学习主题向量,然后再预测新的文本在各个主题上的概率分布情况,也很实用,其实这也是一种聚类思想,主题向量也不是标签形式,也是用户画像的常用构成。

6. 嵌入:“嵌入”也叫作 Embedding,从词到篇章,无不可以学习这种嵌入表达。嵌入表达是为了挖掘出字面意思之下的语义信息,并且用有限的维度表达出来。

下面介绍常用的文本结构化算法:

2.6.1  TF-IDF(无监督关键词提取算法

TF 全称就是 Term Frequency,是词频的意思,IDF 就是 Inverse Document Frequency 是逆文档频率的意思。TF-IDF 提取关键词的思想来自信息检索领域,其实思想很朴素,包括了两点:在一篇文字中反复出现的词会更重要,在所有文本中都出现的词更不重要。

TF,就是词频,在要提取关键词的文本中出现的次数;

IDF,是提前统计好的,在已有的所有文本中,统计每一个词出现在了多少文本中,记为 n,也就是文档频率,一共有多少文本,记为 N。

IDF 就是这样计算:         

IDF 的计算公式有这么几个特点:

1. 所有词的 N 都是一样的,因此出现文本数越少 (n) 的词,它的 IDF 值越大;

2. 如果一个词的文档频率为 0,为防止计算出无穷大的 IDF,所以分母中有一个 1;

3. 对于新词,本身应该 n 是 0,但也可以默认赋值为所有词的平均文档频率。

计算出 TF 和 IDF 后,将两个值相乘,就得到每一个词的权重。根据该权重筛选关键词的方式有:

1. 给定一个 K,取 Top K 个词,这样做简单直接,但也有一点,如果总共得到的词个数少于 K,那么所有词都是关键词了,显然这样做不合理;

2. 计算所有词权重的平均值,取在权重在平均值之上的词作为关键词;

另外,在某些场景下,还会加入以下其他的过滤措施,如:只提取动词和名词作为关键词。

2.6.2 TextRank(无监督关键词提取算法

TextRank 算法的思想也与之类似,可以概括为:

1. 文本中,设定一个窗口宽度,比如 K 个词,统计窗口内的词和词的共现关系,将其看成无向图。图就是网络,由存在连接关系的节点构成,所谓无向图,就是节点之间的连接关系不考虑从谁出发,有关系就对了;

2. 所有词初始化的重要性都是 1;

3. 每个节点把自己的权重平均分配给“和自己有连接“的其他节点;

4. 每个节点将所有其他节点分给自己的权重求和,作为自己的新权重;

5. 如此反复迭代第 3、4 两步,直到所有的节点权重收敛为止。

通过 TextRank 计算后的词语权重,呈现出这样的特点:那些有共现关系的会互相支持对方成为关键词。


 

V1 = 1/2+1/4+1/3
V2 = 1/3+1/3
V3 = 1/3+1/3+1/3+1/3
V4 = 1/3+1/4+1/3
V5 = 1/2+1/4+1/3
V6 = 1/3+1/4+1/3

3 内容分类

在门户网站时代,每个门户网站都有自己的频道体系,这个频道体系就是一个非常大的内容分类体系,这一做法也延伸到了移动互联网 UGC 时代,图文信息流 App 的资讯内容也需要被自动分类到不同的频道中,从而能够得到最粗粒度的结构化信息,也被很多推荐系统用来在用户冷启动时探索用户兴趣。

在门户时代的内容分类,相对来说更容易,因为那时候的内容都是长文本,长文本的内容分类可以提取很多信息,而如今 UGC 当道的时代,短文本的内容分类则更困难一些。短文本分类方面经典的算法是 SVM (支持向量机),在工具上现在最常用的是 Facebook 开源的 FastText。

4 实体识别(NER,Named-Entity Recognition

在 NLP 技术中常常被认为是序列标注问题,和分词、词性标注属于同一类问题。

所谓序列标注问题,就是给你一个字符序列,从左往右遍历每个字符,一边遍历 一边对每一个字符分类,分类的体系因序列标注问题不同而不同:

1. 分词问题:对每一个字符分类为“词开始”“词中间”“词结束”三类之一;

2. 词性标注:对每一个分好的词,分类为定义的词性集合的之一;

3. 实体识别:对每一个分好的词,识别为定义的命名实体集合之一。

对于序列标注问题,通常的算法就是隐马尔科夫模型(HMM)或者条件随机场(CRF)。实体识别还有比较实用化的非模型做法:词典法。提前准备好各种实体的词典,使用 trie-tree 数据结构存储,拿着分好的词去词典里找,找到了某个词就认为是提前定义好的实体了。以实体识别为代表的序列标注问题上,工业级别的工具上 spaCy 比 NLTK 在效率上优秀一些。

5 聚类

传统聚类方法在文本中的应用,今天逐渐被主题模型取代,同样是无监督模型,以 LDA 为代表的主题模型能够更准确地抓住主题,并且能够得到软聚类的效果,也就是说可以让一条文本属于多个类簇。

LDA 模型需要设定主题个数,如果你有时间,那么这个 K 可以通过一些实验来对比挑选,方法是:每次计算 K 个主题两两之间的平均相似度,选择一个较低的 K 值;如果你赶时间,在推荐系统领域,只要计算资源够用,主题数可以尽量多一些。

另外,需要注意的是,得到文本在各个主题上的分布,可以保留概率最大的前几个主题作为文本的主题。LDA 工程上较难的是并行化,如果文本数量没到海量程度,提高单机配置也是可以的,开源的 LDA 训练工具有 Gensim,PLDA 等可供选择。

6 词嵌入(Word Embedding)

前面讲到的结构化方案,除了 LDA,其他都是得到一些标签,而这些标签无一例外都是稀疏的,而词嵌入则能够为每一个词学习得到一个稠密的向量。

这样说可能很抽象,换个说法,一个词可能隐藏很多语义信息,比如北京,可能包含“首都、中国、北方、直辖市、大城市”等等,这些语义在所有文本上是有限的,比如 128 个,于是每个词就用一个 128 维的向量表达,向量中各个维度上的值大小代表了词包含各个语义的多少。拿着这些向量可以做以下的事情:

1. 计算词和词之间的相似度,扩充结构化标签;

2. 累加得到一个文本的稠密向量;

3.用于聚类,会得到比使用词向量聚类更好的语义聚类效果。

这方面当然就属大名鼎鼎的 Word2Vec 了。Word2Vec 是用浅层神经网络学习得到每个词的向量表达,Word2Vec 最大的贡献在于一些工程技巧上的优化,使得百万词的规模在单机上可以几分钟轻松跑出来,得到这些词向量后可以聚类或者进一步合成句子向量再使用。

2.7 标签选择

物品端的文本如何结构化,得到了诸如标签(关键词、分类等)、主题、词嵌入向量。接下来就是第二步:如何把物品的结构化信息给用户呢?

最常用的是两个方法:卡方检验(CHI)和信息增益(IG)。基本思想是:

1. 把物品的结构化内容看成文档;

2. 把用户对物品的行为看成是类别;

3. 每个用户看见过的物品就是一个文本集合;

4. 在这个文本集合上使用特征选择算法选出每个用户关心的东西。

2.7.1 卡方检验

CHI 就是卡方检验,本身是一种特征选择方法。是有监督的,需要提供分类标注信息。在文本分类任务中,挑选关键词就得为了分类任务服务,而不仅仅是挑选出一种直观上看着重要的词。

卡方检验本质上在检验“词和某个类别 C 相互独立”这个假设是否成立,和这个假设偏离越大,就越说明这个词和类别 C 暗中有一腿,那当然这个词就是关键词了。

计算一个词 Wi 和一个类别 Cj 的卡方值,需要统计四个值:

类别为 Cj 的文本中出现词 Wi 的文本数 A;

词 Wi 在非 Cj 的文本中出现的文本数 B ;

类别为 Cj 的文本中没有出现 Wi 的文本数 C ;

词 Wi 在非 Cj 的文本中没有出现的文本数 D 。

然后按照如下公式计算每一个词和每一个类别的卡方值:

关于这个卡方值计算,需要说明几点:

1. 每个词和每个类别都要计算,只要对其中一个类别有帮助的词都应该留下;

2. 由于是比较卡方值的大小,所以公式中的 N 可以不参与计算,因为它对每个词都一样,就是总的文本数;

3. 卡方值越大,意味着偏离“词和类别相互独立”的假设越远,靠“词和类别互相不独立”这个备择假设越近。

2.7.2 信息增益(IG 即 Information Gain)

信息增益,也是一种有监督的关键词选择方法,也需要有标注信息。要理解信息增益,理解了信息熵就差不多了。

信息熵,一批文本被标注了类别,那么任意挑出一条文本问你,“猜猜这是什么类别?”如果原来每个类别的文本数量都一样,那你肯定最不好猜,如果其中一个类别的文本 C 数远远多于其他类别,那么你猜这条文本属于类别 C 就很可能猜对。这两个情况区别就在于信息熵不同:

1. 各个类别的文本数量差不多时,信息熵就比较大。

2. 其中少数类别的文本数量明显较多时,信息熵就较小。

进一步再想一件事,如果从这一堆文本中再挑出包含有词 W 的文本数,再来猜任意一条文本的类别时,仍然会有上面两种情况。这时候考虑一个情况:如果在整个文本上的情况是 1,但挑出包含词 W 后的情况变成 2 了,那么你想,这个词 W 是不是非常有用?因为有了它,我们就能以较高的成功率猜对任意一条文本的类别了。

上面这个思考过程就是信息增益的思想,信息增益计算也是分成三步:

统计全局文本的信息熵;

统计每个词的条件熵,就是知道了一个词后再统计文本的信息熵,只不过这里要分别计算包含词和不包含词两部分的信息熵,再按照各自文本比例加权平均;

两者相减就是每个词的信息增益。

信息增益应用最广就是数据挖掘中的决策树分类算法,经典的决策树分类算法挑选分裂节点时就是计算各个属性的信息增益,始终挑选信息增益最大的节点作为分裂节点。

卡方检验和信息增益不同之处在于:前者是针对每一个行为单独筛选一套标签出来,后者是全局统一筛选。

这些方法都是在离线阶段批量完成的,把用户的画像生成配置成离线任务,每天更新一遍,次日就可以使用新的用户画像。

那么对于一个新用户,能不能在他刚刚进入产品时就能够快速生成一个简单的画像呢?答案是:当然可以。这在后面的专栏中会讲到的 MAB 问题。

2.8 超越标签的内容推荐系统

2.8.1 为什么要做好内容推荐

所谓的基于内容推荐,通俗一点来讲,就是一个包装成推荐系统的信息检索系统。这听上去有点残酷,但通常一个复杂的推荐系统很可能是从基于内容推荐成长起来的。

可以说,基于内容的推荐系统是一个推荐系统的孩童时代,所以,我们不能让自己的推荐系统输在起跑线上,得富养才行。那么,首先我就来讲一讲如何养成一个基于内容的推荐系统。

为什么基于内容的推荐系统这么重要呢?因为内容数据非常易得,哪怕是在一个产品刚刚上线,用心找的话总能找到一些可以使用的内容,不需要有用户行为数据就能够做出推荐系统的第一版。

基于内容的推荐能把这些新物品找机会推荐出去,从而获得一些展示机会,积累用户反馈、走上巅峰、占据热门排行榜。

要把基于内容的推荐做好,需要做好“抓、洗、挖、算”四门功课。它们分别是对应了下面的内容:

1. 抓:抓取数据补充内容源,增加分析的维度,两者必不可少。

2. 洗:冗余的内容、垃圾内容、政治色情等敏感内容等等都需要被洗出去。

3. 挖:不管是抓来的数据,还是自家的数据,如果不深入挖掘,那就和捧着金饭碗去要饭一样,浪费了大好资源。可以说,很多推荐系统提升效果并不是用了更复杂的推荐算法,而是对内容的挖掘做得更加深入。

4. 算:匹配用户的兴趣和物品的属性,计算出更合理的相关性,这是推荐系统本身的使命,不仅仅是基于内容的推荐才要做的。

内容这一端:内容源经过内容分析,得到结构化的内容库和内容模型,也就是物品画像。

用户这一端:用户看过推荐列表后,会产生用户行为数据,结合物品画像,经过用户分析得到用户画像。

以后对于那些没有给用户推荐过的新内容,经过相同的内容分析过程后就可以经过推荐算法匹配,计算得到新的推荐列表给用户。如此周而复始,永不停息。

2.8.2 内容源

爬取数据。

2.8.3 内容分析和用户分析

基于内容的推荐,最重要的不是推荐算法,而是内容挖掘和分析。内容挖掘越深入,哪怕早期推荐算法仅仅是非常硬的规则,也能取得不俗的效果。举个例子,如果推荐物品是短视频,我们分几种情况看:

1. 如果短视频本身没有任何结构化信息,如果不挖掘内容,那么除了强推或者随机小流量,没有别的合理曝光逻辑了;

2. 如果对视频的文本描述,比如标题等能够有内容分类,比如是娱乐类,那么对于喜欢娱乐的用户来说就很合理;

3. 如果能够进一步分析文本的主题,那么对于类似主题感兴趣的用户就可能得到展示;

4. 如果还能识别出内容中主角是吴亦凡,那就更精准锁定一部分用户了;

5. 如果再对内容本身做到嵌入分析,那么潜藏的语义信息也全部抓住,更能表达内容了。

举这个例子是为了说明:随着内容分析的深入,能抓住的用户群体就越细致,推荐的转化率就越高,用户对产品的好感度也就增加了。上一篇中我列举了文本数据——这也是内容数据最常见形式的分析方法。

内容分析的产出有两个:结构化内容库;内容分析模型。

结构化的内容库,最重要的用途是结合用户反馈行为去学习用户画像,具体的方法在上一篇中已经介绍了。容易被忽略的是第二个用途,在内容分析过程中得到的模型,比如说:分类器模型;主题模型;实体识别模型;嵌入模型。

这些模型主要用在:当新的物品刚刚进入时,需要实时地被推荐出去,这时候对内容的实时分析,提取结构化内容,再于用户画像匹配。

2.8.4 内容推荐算法

对于基于内容的推荐系统,最简单的推荐算法当然是计算相似性即可,用户的画像内容就表示为稀疏的向量,同时内容端也有对应的稀疏向量,两者之间计算余弦相似度,根据相似度对推荐物品排序。

你别嫌糙,如果你内容分析做得深入的话,通常效果还不错,而且基于内容的推荐天然有一个优点:可解释性非常强。

如果再进一步,要更好地利用内容中的结构化信息,因为一个直观的认识是:不同字段的重要性不同。

比如说,一篇新闻,正文和标题中分析出一个人物名,评论中也分析出其他用户讨论提及的一些人物名,都可以用于推荐。直观上新闻的正文和标题中更重要。

那么,我们可以借鉴信息检索中的相关性计算方法来做推荐匹配计算:BM25F 算法。常用的开源搜索引擎如 Lucene 中已经实现了经典的 BM25F 算法,直接拿来使用即可。

前面提到的两种办法虽然可以做到快速实现、快速上线,但实际上都不属于机器学习方法,因为没有考虑推荐的目标,而我们在之前的专栏中就专门强调了目标思维,那么,按照机器学习思路该怎么做呢?

一种最典型的场景:提高某种行为的转化率,如点击、收藏、转发等。那么标准的做法是:收集这类行为的日志数据,转换成训练样本,训练预估模型。

每一条样本由两部分构成:一部分是特征,包含用户端的画像内容,物品端的结构化内容,可选的还有日志记录时一些上下文场景信息,如时间、地理位置、设备等等,另一部分就是用户行为,作为标注信息,包含“有反馈”和“无反馈”两类。

用这样的样本训练一个二分类器,常用模型是逻辑回归(Logistic Regression)和梯度提升树(GBDT)或者两者的结合。在推荐匹配时,预估用户行为发生的概率,按照概率排序。这样更合理更科学,而且这一条路可以一直迭代优化下去。

发布了366 篇原创文章 · 获赞 100 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_34732729/article/details/103240475