推荐系统-内容推荐

内容推荐

基于内容的推荐系统

用户画像

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

  1. 认识每一个用户
  2. 给他推荐他感兴趣的东西
  3. 坐等各项指标上升

用户画像对应的英文有:Personas和User Profile, 前者属于交互设计领域的概念。后者原本用于营销领域。

用户画像应该是给机器看,而不是给人看

推荐系统的目标就是在用户和物品之间建立连接。一般方式是先将用户和物品向量化,然后对用户和物品之间的匹配评分,即预测用户的评分和偏好。

用户信息向量化之后的结果, 俗称“用户画像”。用户画像不是推荐系统的目的,而是在构建推荐系统的过程中产生的一个关键环节的副产品

大型推荐系统一般都分为召回和排序两个阶段。因为全部物品数量太大,无法对一个用户逐一计算每一个物品的评分,因此需要一个召回阶段,即预先筛选一部分的物品,从而降低计算量,用户画像除了用于最终匹配评分,还要用在召回。

用户画像的两个关键元素:维度和量化

用户画像构建的方法

按照对用户向量化的手段来分,用户画像构建的方法分层三类:

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

  2. 堆数据。 堆积历史数据,做统计工作,常见的兴趣标签就是这一类,就是从历史行为数据中去挖掘出标签,然后再标签维度上做数据统计,用统计结果作为量化结果。

  3. 黑盒子。 用机器学习方法,学习出人类无法直观理解的稠密向量

从文本到用户画像

用物品和用户的文本信息构建出一个基础版本的用户画像,需要:

  1. 把所有非结构化的文本结构化,去粗取精,保留关键信息
  2. 根据用户行为数据把物品的结构化结果传递给用户,与用户自己的结构化信息合并

从物品端的文本信息,可以利用NLP算法分析得到的信息有:

  1. 关键词提取:常用TF-IDF和TextRank
  2. 实体识别:常用基于词典的方法结合CRF模型
  3. 内容分类:将文本按照分类体系分类,用分类来表达较粗粒度的结构化信息
  4. 文本:在无人制定分类体系的前提下,无监督聚类文本获得类簇编号
  5. 主题模型:聚类思想,从大量已有文本中学习主题向量,然后再预测新的文本在各个主题上的概率分布情况
  6. 嵌入:嵌入表达是为了挖掘出字面意思下的语义信息,并且用有限的维度表达出来

常用文本结构化算法

TF-IDF

  • TF全称是Term Frequency,指词频,在要提取关键词的文本中出现的次数
  • IDF是Inverse Document Frequency指逆文档频率,是提前统计好的,在已有的所有文本中,统计每一个词出现在了多少文本中,记为文档频率n,一共有多少文本,记为N。 IDF的计算公式 $$ IDF = \log \frac{N}{n+1} $$ 计算过程为:词出现的文档数加1, 再除总文档数,最后结果再取对数。 IDF的特点:
  1. 为了防止一个词的文档概率为0,计算出无穷大的IDF,分母加1。
  2. 所有词的N都是一样的,因此出现文本次数越少(n)的词,它的IDF值越大 关键思想:在一篇文章中反复出现的词会更重要,在所有文本中都出现的词更不重要。

TF与IDF相乘,就得到每一个词的权重,根据该权重可以筛选一篇文章的关键词:

  1. 取Top K个词,但是如果得到的词总数少于K,代表所有词都是关键词,不合理
  2. 计算所有词权重的平均值,取权重在平均值之上的词作为关键词
  3. 加入其它过滤措施,只提取动词和名词作为关键词

TextRank

通过TextRank计算后的词语权重的特点:具有共现关系的会互相支持对方成为关键词。

实体识别

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

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

  1. 分词问题:对每一个字符分类为“词开始”, “词中间”,“词结束”三类之一
  2. 词性标注:对每一个很好的词,分类为定义的词性集合中的一个
  3. 实体识别:对每一个很好的词,识别为定义的命名实体集合中的一个

常用算法有隐马尔可夫模型(HMM)和条件随机场(CRF),比较实用的非模型的方法是词典法。提前准给好各种实体的词典,实用Trie-Tree数据结构存储,拿着分好的词去词典里找,找到即认为是提前定义好的实体。

工业级别的工具spaCy比NLTK在效率上更优秀一些。

内容分类

在门户网站时代,内容是长文本,内容分类可以提取很多信息;在UGC时代,短文本的内容分类更加困难,经典算法是SVM,在工具上最常用的是Facebook开源的FastText.

聚类

传统聚类方法在文本中的应用逐渐被主题模型取代,LDA为代表的主题模型能更准确地抓住主题,并且能够得到软聚类的效果,即让一条文本属于多个类簇。

LDA需要设定主题个数,得到文本在各个主题上的分布,可以保留概率最大的前几个主题作为文本的主题。工程上较难并行化,开源常用的LDA训练工具有Gensim, PLDA等

词嵌入

可以为每一个词学习得到一个稠密的向量,常用Word2Vec是使用浅神经网络学习得到每个词的向量表达,这些向量可以作为后续聚类或者进一步合成句子向量再使用。

标签选择

把用户对物品的行为,消费或者没有消费看成是一个分内问题,用户用实际行动帮我们标注了若干数据,从中挑选出他实际感兴趣的特性就变成了特征选择问题。

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

  1. 把物品结构化看成文档
  2. 把用户对物品的行为看成是类别
  3. 每个用户看见过的物品就是一个文本集合
  4. 在这个文本集合上使用特征选择算法挑选出每个用户关心的属性
卡方检验

特征提取算法,有监督的,需要提供分类标注信息。卡方检验本质上在检验“词和某个类别C相互独立”这个假设是否成立,CHI值越大,意味着和这个假设偏离越大,即越不独立越相关,越说明该词和类别C有很大的相关性,即为该类别的关键词。

信息增益

IG,即Information Gain,有监督关键词选择方法,也需要标注信息。

信息熵:

  1. 各个类别的文本数量差不多时,信息熵就比较大
  2. 其中少数类别的文本数量明显较多时,信息熵就比较小

信息增益的计算步骤:

  1. 统计全局文本的信息熵
  2. 统计每个词的条件熵,就是知道了一个词后再统计文本的信息熵,只不过要分别计算包含该词和不包含改词两部分的信息熵,再按照各自文本比例加权平均
  3. 两者相减就是每个词的信息增益

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

超越标签的内容推荐系统

基于内容的推荐需要做好:

  1. 抓:持续抓取数据丰富自己的内容
  2. 洗:清晰冗余的内容、垃圾内容、政治色情等迷你缸内容等等都需要被清洗出去
  3. 挖:对内容的挖掘
  4. 算:匹配用户的兴趣和物品的属性

基于内容的推荐系统

内容分析

内容分析的产出有两个:

  1. 结构化内容库
  2. 内容分析模型
    1. 分类器模型
    2. 主题模型
    3. 实体识别模型
    4. 嵌入模型

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

内容推荐算法

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

基于内容的推荐天然的优点:可解释性非常强

文本中不同字段的重要性不同,可以借鉴信息检索中的相关性算法来做推荐匹配计算:BM25F算法。常用开源搜索引擎如Lucene中有其实现,可以直接拿来使用。

机器学习的思路:

  • 收集某类行为的日志数据,如点击、收藏、转发等行为,转换成训练样本,训练预估模型

  • 每条样本由两部分组成:

    1. 特征,包含用户端的画像内容和物品端的结构化内容,可选的还有日志记录时的一些上下文信息,如时间、地理位置等。
    2. 用户行为作为标注信息,包含“有反馈”和“无反馈”两类。

使用这些样本训练一个二分类器,常用模型为逻辑回归和梯度提升树,在推荐匹配时,预估用户行为发生的概率,按照概率排序,这样更加合理并且可以一直迭代优化下去。

本文是《推荐系统三十六式》的读书笔记,仅限个人学习,请勿用作商业用途,谢谢。

Note: Cover Picture