推荐引擎算法学习导论

       本文做为对推荐引擎的初步介绍的一篇导论性的文章,将略去大部分的具体细节,侧重用最简单的语言简要介绍推荐引擎的工做原理以及其相关算法思想,且为了着重浅显易懂有些援引自本人1月7日在微博上发表的文字(特意整理下,方便往后随时翻阅),尽可能保证本文的短小。不过,事与愿违的是,文章后续补充完善,越写越长了html

    同时,本文全部相关的算法都会在往后的文章一一陆续具体阐述。本文但求微言导论,往后但求具体而论。如有任何问题,欢迎随时不吝赐教或批评指正。谢谢。python


一、推荐引擎原理

    推荐引擎尽最大努力的收集尽量多的用户信息及行为,所谓广撒网,勤捕鱼,而后“特别的爱给特别的你”,最后基于类似性的基础之上持续“给力”,原理以下图所示(图引自本文的参考资料之一:探索推荐引擎内部的秘密):web


二、推荐引擎的分类

     推荐引擎根据不一样依据以下分类:面试

  1. 根据其是否是为不一样的用户推荐不一样的数据,分为基于大众行为(网站管理员自行推荐,或者基于系统全部用户的反馈统计计算出的当下比较流行的物品)、及个性化推荐引擎(帮你找志同道合,趣味相投的朋友,而后在此基础上实行推荐);
  2. 根据其数据源,分为基于人口统计学的(用户年龄或性别相同断定为类似用户)、基于内容的(物品具备相同关键词和Tag,没有考虑人为因素),以及基于协同过滤的推荐(发现物品,内容或用户的相关性推荐,分为三个子类,下文阐述);
  3. 根据其创建方式,分为基于物品和用户自己的(用户-物品二维矩阵描述用户喜爱,聚类算法)、基于关联规则的(The Apriori algorithm算法是一种最有影响的挖掘布尔关联规则频繁项集的算法)、以及基于模型的推荐(机器学习,所谓机器学习,即让计算机像人脑同样持续学习,是人工智能领域内的一个子领域)。
     关于上述第二个分类(二、根据其数据源)中的基于协同过滤的推荐:随着 Web2.0 的发展,Web 站点更加提倡用户参与和用户贡献,所以基于协同过滤的推荐机制因运而生。它的原理很简单,就是根据用户对物品或者信息的偏好,发现物品或者内容自己的相关性,或者是发现用户的相关性,而后再基于这些关联性进行推荐。
    而 基于协同过滤的推荐,又分三个子类
  1. 基于用户的推荐(经过共同口味与偏好找类似邻居用户,K-邻居算法,你朋友喜欢,你也可能喜欢),
  2. 基于项目的推荐(发现物品之间的类似度,推荐相似的物品,你喜欢物品A,C与A类似,可能也喜欢C),
  3. 基于模型的推荐(基于样本的用户喜爱信息构造一个推荐模型,而后根据实时的用户喜爱信息预测推荐)。
    咱们看到,此协同过滤算法最大限度的利用用户之间,或物品之间的类似相关性,然后基于这些信息的基础上实行推荐。下文还会具体介绍此协同过滤。
    不过通常实践中,咱们一般仍是把推荐引擎分两类:
  • 第一类称为协同过滤,即基于类似用户的协同过滤推荐(用户与系统或互联网交互留下的一切信息、蛛丝马迹,或用户与用户之间千丝万缕的联系),以及基于类似项目的协同过滤推荐(尽最大可能发现物品间的类似度);
  • 第二类即是基于内容分析的推荐(调查问卷,电子邮件,或者推荐引擎对本blog内容的分析)。

三、新浪微博推荐机制
    在新浪微博推荐好友的机制中:一、我与A非好友,但个人好友中有很多人与A是好友,即我和A有很多共同的好友,那么系统便会把A也推荐给我(新浪 称之为共同好友)二、我关注的人中有很多人关注了B,那么系统推测我也可能会喜欢B,从而亦会把B也推荐给我(新浪 称之为间接关注人)
    但新浪实际操做起来,这两种方式会搅在一块儿,如我关注的人中,有很多人关注了B,但事实上这关注B的很多人中有些也是个人好友。以上推荐方式,统称为 基于类似用户的协同过滤推荐(无非就是找到:用户与用户之间千丝万缕的联系,或是从你的好友入手,或是从你关注的人入手)。
    固然,还有一类好比人气用户推荐,即是上文所述的 基于大众行为的推荐,即人云亦云、跟风。系统推测你们都喜欢的,可能你也会喜欢。如你们都知道姚晨新浪微博粉丝数量排第一,则争相关注,最终粉丝量越推越高。两种推荐方式以下图所示:
    不过,上述不管是基于用户的推荐方式,仍是基于大众行为的推荐都并无真正寻找到用户与用户之间共同的兴趣,偏好和口味,由于不少的时候,朋友的朋友不必定能成为你本身的朋友,且有的人清高于世,大家都追求的,我偏不屑。因此,从分析用户发表的微博的内容相关入手,找到各自共同的关注点、兴趣点才是王道。固然新浪微博最近让用户选择给本身发表的微博内容打上标签,以利于往后寻找微博内容中相关用户共同的标签tag,关键词,此种推荐方式正是 基于微博内容分析的推荐。以下图:

    只是问题是,谁会竭尽全力发完微博后,还去给它添加什么标签呢?因此,新浪微博还得努力,寻找另外一种更好地分析微博内容的方式。否则系统全盘扫描海里用户的海量微博内容,则恐怕吃不消也负担不起。算法

    然我的以为却是能够从微博关键词(标签tag云)和每一个用户为本身打的标签(打着越多的共同标签可定义为类似用户)入手,以下图左右部分所示:数据库

    也就是说,经过共同的好友和经过间接关注的人来定义类似用户是不靠谱的,只有经过基于微博内容的分析寻找类似用户才是可行之道,同时,更进一步,经过微博内容分析获得标签tag云后,再从中找到相同或相近的标签tag云寻找类似的用户无疑比已有推荐好友方式(经过共同的好友和经过间接关注的人来定义类似用户)更靠谱。编程

3.一、多种推荐方式结合网络

    在现行的 Web 站点上的推荐每每都不是单纯只采用了某一种推荐的机制和策略,他们每每是将多个方法混合在一块儿,从而达到更好的推荐效果。数据结构

    举个例子如Amazon中除此基于用户的推荐以外,还会用到基于内容的推荐(物品具备相同关键词和Tag):如新产品的推荐;基于项目的协同过滤推荐(喜欢ACA相似,可能也喜欢C):如捆绑销售and别人购买/浏览的商品。app

    总之,多种推荐方式结合,加权(用线性公式(linear formula)将几种不一样的推荐按照必定权重组合起来,具体权重的值须要在测试数据集上反复实验,从而达到最好的推荐效果。)、切换、分区、分层等混合。但不管是哪一种推荐方式,通常也就涵盖在上文所述的推荐方式中。


四、协同过滤推荐

    协同过滤是利用集体智慧的一个典型方法。要理解什么是协同过滤 (Collaborative Filtering, 简称 CF),首先想一个简单的问题,若是你如今想看个电影,但你不知道具体看哪部,你会怎么作?大部分的人会问问周围的朋友或者称之为广义上的邻居(neighborhood),看看最近有什么好看的电影推荐,而咱们通常更倾向于从口味比较相似的朋友那里获得推荐。这就是协同过滤的核心思想。以下图,你能从图中看到多少信息?


4.一、协同过滤推荐步骤

    作协同过滤推荐,通常要作好如下几个步骤:

1)若要作协同过滤,那么收集用户偏好则成了关键。能够经过用户的行为诸如评分(如不一样的用户对不一样的做品有不一样的评分,而评分接近则意味着喜爱口味相近,即可断定为类似用户),投票,转发,保存,书签,标记,评论,点击流,页面停留时间,是否购买等得到。以下面第2点所述:全部这些信息均可以数字化,如一个二维矩阵表示出来。

2)收集了用户行为数据以后,咱们接下来便要对数据进行减噪与归一化操做(获得一个用户偏好的二维矩阵,一维是用户列表,另外一维是物品列表,值是用户对物品的偏好,通常是 [0,1] 或者 [-1, 1] 的浮点数值)。下面再简单介绍下减噪和归一化操做:

  • 所谓减噪:用户行为数据是用户在使用应用过程当中产生的,它可能存在大量的噪音和用户的误操做,咱们能够经过经典的数据挖掘算法过滤掉行为数据中的噪音,这样能够是咱们的分析更加精确(相似于网页的去噪处理)。
  • 所谓归一化:将各个行为的数据统一在一个相同的取值范围中,从而使得加权求和获得的整体喜爱更加精确。最简单的归一化处理,即是将各种数据除以此类中的最大值,以保证归一化后的数据取值在 [0,1] 范围中。至于所谓的加权,很好理解,由于每一个人占的权值不一样,相似于一场唱歌比赛中对某几个选手进行投票决定其是否晋级,观众的投票抵1分,专家评委的投票抵5分,最后得分最多的选手直接晋级。

3)找到类似的用户和物品,经过什么途径找到呢?即是计算类似用户或类似物品的类似度。

4)类似度的计算有多种方法,不过都是基于向量Vector的,其实也就是计算两个向量的距离,距离越近类似度越大。在推荐中,用户-物品偏好的二维矩阵下,咱们将某个或某几个用户对莫两个物品的偏好做为一个向量来计算两个物品之间的类似度,或者将两个用户对某个或某几个物品的偏好做为一个向量来计算两个用户之间的类似度。

        类似度计算算法能够用于计算用户或者项目类似度。以项目类似度计算(Item Similarity Computation)为列,通性在于都是从评分矩阵中,为两个项目i,j挑选出共同的评分用户,然对这个共同用户的评分向量,进行计算类似度si,j以下图所示,行表明用户,列表明项目(注意到是从i,j向量中抽出共有的评论,组成的一对向量,进行类似度计算):

    因此说,很简单,找物品间的类似度,用户不变,找多个用户对物品的评分;找用户间的类似度,物品不变,找用户对某些个物品的评分。

5)而计算出来的这两个类似度则将做为基于用户、项目的两项协同过滤的推荐。

    常见的计算类似度的方法有:欧几里德距离,皮尔逊相关系数(如两个用户对多个电影的评分,采起皮尔逊相关系数等相关计算方法,能够抉择出他们的口味和偏好是否一致),Cosine类似度,Tanimoto系数。下面,简单介绍其中的欧几里得距离与皮尔逊相关系数:

  •     欧几里德距离(Euclidean Distance)是最初用于计算欧几里德空间中两个点的距离,假设 x,y 是 n 维空间的两个点,它们之间的欧几里德距离是:

    能够看出,当 n=2 时,欧几里德距离就是平面上两个点的距离。当用欧几里德距离表示类似度,通常采用如下公式进行转换:距离越小,类似度越大(同时,避免除数为0):

  • 余弦类似度 Cosine-based Similarity
    两个项目 i ,j 视做为两个m维用户空间向量,类似度计算经过计算两个向量的余弦夹角,那么,对于m*n的评分矩阵,i ,j 的类似度 sim ) 计算公式:
    (其中 " · "记作两个向量的内积)
  • 皮尔逊相关系数通常用于计算两个定距变量间联系的紧密程度,为了使计算结果精确,须要找出共同评分的用户。记用户集U为既评论了 i 又评论了 j 的用户集,那么对应的皮尔森相关系数计算公式为

    其中Ru,i 为用户u 对项目 i 的评分,对应带横杠的为这个用户集U对项目i的评分评分

6)类似邻居计算。邻居分为两类:一、固定数量的邻居K-neighborhoods (或Fix-size neighborhoods),不论邻居的远近,只取最近的 个,做为其邻居,以下图A部分所示;二、基于类似度门槛的邻居,落在以当前点为中心,距离为 的区域中的全部点都做为当前点的邻居,以下图B部分所示。

    再介绍一下K最近邻(k-Nearest Neighbor,KNN)分类算法:这是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:若是一个样本在特征空间中的k个最类似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

7)通过4)计算出来的基于用户的CF(基于用户推荐之用:经过共同口味与偏好找类似邻居用户,K-邻居算法,你朋友喜欢,你也可能喜欢),基于物品的CF(基于项目推荐之用:发现物品之间的类似度,推荐相似的物品,你喜欢物品A,C与A类似,那么你可能也喜欢C)

4.二、基于项目类似度与基于用户类似度的差别

    上述3.1节中三个类似度公式是基于项目类似度场景下的,而实际上,基于用户类似度与基于项目类似度计算的一个基本的区别是,基于用户类似度是基于评分矩阵中的行向量类似度求解,基于项目类似度计算式基于评分矩阵中列向量类似度求解,而后三个公式分别均可以适用,以下图:

(其中,为0的表示未评分)

  • 基于项目类似度计算式计算如Item3,Item4两列向量类似度;
  • 基于用户类似度计算式计算如User3,User4量行向量类似度。
此外,何时用item-base,何时用user-base呢http://weibo.com/1580904460/zhZ9AiIkZ?mod=weibotime通常说来,若是item数目很少,好比不超过十万,并且不显著增加的话,就用item-based 好了。为什么?如@wuzh670所说,若是item数目很少+不显著增加,说明item之间的关系在一段时间内相对稳定(对比user之间关系),对于实时更新item-similarity需求就下降不少,推荐系统效率提升不少,故用item-based会明智些。反之,当item数目不少,建议用user-base。固然,实践中具体状况具体分析。


五、聚类算法

    聚类聚类,通俗的讲,即所谓物以类聚,人以群分。聚类 (Clustering) 是一个数据挖掘的经典问题,它的目的是将数据分为多个簇 (Cluster),在同一个簇中的对象之间有较高的类似度,而不一样簇的对象差异较大。

5.一、K 均值聚类算法

    K-均值(K-Means)聚类算法与处理混合正态分布的最大指望算法很类似,由于他们都试图找到数据中天然聚类的中心。此算法假设对象属性来自于空间向量,目标是使各个群组内部的均方偏差总和最小。

  K均值聚类算法首先会随机肯定K个中心位置(位于空间中表明聚类中心的点),而后将各个数据项分配给最临近的中心点。待分配完成以后,聚类中心就会移到分配给该聚类的全部节点的平均位置处,而后整个分配过程从新开始。这一过程会一直重复下去,直到分配过程再也不产生变化为止。下图是包含两个聚类的K-均值聚类过程:

    如下代码所示便是此K-均值聚类算法的python实现:

  1. //K-均值聚类算法    
  2. import random    
  3.     
  4. def kcluster(rows,distance=pearson,k=4):    
  5.   # 肯定每一个点的最小值和最大值    
  6.   ranges=[(min([row[i] for row in rows]),max([row[i] for row in rows]))     
  7.   for i in range(len(rows[0]))]    
  8.     
  9.   # 随机建立k个中心点    
  10.   clusters=[[random.random()*(ranges[i][1]-ranges[i][0])+ranges[i][0]     
  11.   for i in range(len(rows[0]))] for j in range(k)]    
  12.       
  13.   lastmatches=None    
  14.   for t in range(100):    
  15.     print 'Iteration %d' % t    
  16.     bestmatches=[[] for i in range(k)]    
  17.         
  18.     # 在每一行中寻找距离最近的中心点    
  19.     for j in range(len(rows)):    
  20.       row=rows[j]    
  21.       bestmatch=0    
  22.       for i in range(k):    
  23.         d=distance(clusters[i],row)    
  24.         if d<distance(clusters[bestmatch],row): bestmatch=i    
  25.       bestmatches[bestmatch].append(j)    
  26.     
  27.     # 若是结果与上一次相同,则整个过程结束    
  28.     if bestmatches==lastmatches: break    
  29.     lastmatches=bestmatches    
  30.         
  31.     # 把中心点移到其全部成员的平均位置    
  32.     for i in range(k):    
  33.       avgs=[0.0]*len(rows[0])    
  34.       if len(bestmatches[i])>0:    
  35.         for rowid in bestmatches[i]:    
  36.           for m in range(len(rows[rowid])):    
  37.             avgs[m]+=rows[rowid][m]    
  38.         for j in range(len(avgs)):    
  39.           avgs[j]/=len(bestmatches[i])    
  40.         clusters[i]=avgs    
  41.       
  42.   # 返回k组序列,其中每一个序列表明一个聚类        
  43.   return bestmatches    

    k-Means是一种机器学习领域中的一种非监督学习。下面,简要介绍下监督学习与无监督学习:

  • 监管学习的任务是学习带标签的训练数据的功能,以便预测任何有效输入的值。监管学习的常见例子包括将电子邮件消息分类为垃圾邮件,根据类别标记网页,以及识别手写输入。建立监管学习程序须要使用许多算法,最多见的包括神经网络、Support Vector Machines (SVMs) 和 Naive Bayes 分类程序。
  • 无监管学习的任务是发挥数据的意义,而无论数据的正确与否。它最常应用于将相似的输入集成到逻辑分组中。它还能够用于减小数据集中的维度数据,以便只专一于最有用的属性,或者用于探明趋势。无监管学习的常见方法包括K-Means,分层集群和自组织地图。

5.二、Canopy 聚类算法 

    Canopy 聚类算法的基本原则是:首先应用成本低的近似的距离计算方法高效的将数据分为多个组,这里称为一个 Canopy,咱们姑且将它翻译为华盖Canopy 之间能够有重叠的部分;而后采用严格的距离计算方式准确的计算在同一 Canopy 中的点,将他们分配与最合适的簇中。Canopy 聚类算法常常用于 均值聚类算法的预处理,用来找合适的 值和簇中心。

5.三、模糊 K 均值聚类算法 

        模糊 K 均值聚类算法是 均值聚类的扩展,它的基本原理和 均值同样,只是它的聚类结果容许存在对象属于多个簇,也就是说:它属于咱们前面介绍过的可重叠聚类算法。为了深刻理解模糊 K 均值和 K 均值的区别,这里咱们得花些时间了解一个概念:模糊参数(Fuzziness Factor)。

    与 K 均值聚类原理相似,模糊 K 均值也是在待聚类对象向量集合上循环,可是它并非将向量分配给距离最近的簇,而是计算向量与各个簇的相关性(Association)。假设有一个向量 v,有 k 个簇,v 到 k 个簇中心的距离分别是 d1,d2⋯ dk,那么 V 到第一个簇的相关性 u1能够经过下面的算式计算:

    计算 v 到其余簇的相关性只需将 d1替换为对应的距离。从上面的算式,咱们看出,当 m 近似 2 时,相关性近似 1;当 m 近似 1 时,相关性近似于到该簇的距离,因此 m 的取值在(1,2)区间内,当 m 越大,模糊程度越大,m 就是咱们刚刚提到的模糊参数。

    其他聚类算法本文再也不介绍。关于冷启动、数据稀疏、可扩展性、可移植性、可解释性、多样性、推荐信息的价值等问题则待后续阐述。


六、分类算法

    接下来,分类算法有不少,本文介绍决策树学习,与贝叶斯定理。

6.一、决策树学习

    我们直接切入正题。所谓决策树,顾名思义,是一种树,一种依托于策略抉择而创建起来的树。

    机器学习中,决策树是一个预测模型;他表明的是对象属性与对象值之间的一种映射关系。树中每一个节点表示某个对象,而每一个分叉路径则表明的某个可能的属性值,而每一个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,能够创建独立的决策树以处理不一样输出。
    从数据产生决策树的机器学习技术叫作决策树学习, 通俗说就是决策树。

    来理论的太过抽象,下面举两个浅显易懂的例子:

    第一个例子:通俗来讲,决策树分类的思想相似于找对象。现想象一个女孩的母亲要给这个女孩介绍男友,因而有了下面的对话:

      女儿:多大年纪了?
      母亲:26。
      女儿:长的帅不帅?
      母亲:挺帅的。
      女儿:收入高不?
      母亲:不算很高,中等状况。
      女儿:是公务员不?
      母亲:是,在税务局上班呢。
      女儿:那好,我去见见。

      这个女孩的决策过程就是典型的分类树决策。至关于经过年龄、长相、收入和是否公务员对将男人分为两个类别:见和不见。假设这个女孩对男人的要求是:30岁如下、长相中等以上而且是高收入者或中等以上收入的公务员,那么这个能够用下图表示女孩的决策逻辑:

    也就是说,决策树的简单策略就是,比如公司招聘面试过程当中筛选一我的的简历,若是你的条件至关比如如说清华博士毕业,那么二话不说,直接叫过来面试,若是非重点大学毕业,但实际项目经验丰富,那么也要考虑叫过来面试一下,即所谓具体状况具体分析、决策。

    第二个例子来自Tom M.Mitchell著的机器学习一书:

    小王的目的是经过下周天气预报寻找何时人们会打高尔夫,他了解人们决定是否打球的缘由最主要取决于天气状况。而天气情况有晴,云和雨;气温用华氏温度表示;相对湿度用百分比;还有有无风。如此,咱们即可以构造一棵决策树,以下(根据天气这个分类决策这天是否合适打网球):

    上述决策树对应于如下表达式:(Outlook=Sunny ^Humidity<=70)V (Outlook = Overcast)V (Outlook=Rain ^ Wind=Weak)。获得的最佳分类属性以下图所示:


     在上图中,计算了两个不一样属性:湿度(humidity)和风力(wind)的信息增益,最终humidity这种分类的信息增益0.151>wind增益的0.048。说白了,就是在星期六上午是否适合打网球的问题诀策中,采起humidity较wind做为分类属性更佳,决策树由此而来。

ID3算法决策树的造成

    OK,下图为ID3算法第一步后造成的部分决策树。这样综合起来看,就容易理解多了。一、overcast样例必为正,因此为叶子结点,总为yes;二、ID3无回溯,局部最优,而非全局最优,还有另外一种树后修剪决策树。下图是ID3算法第一步后造成的部分决策树:

6.二、贝叶斯分类的基础:贝叶斯定理

   贝叶斯定理:已知某条件几率,如何获得两个事件交换后的几率,也就是在已知P(A|B)的状况下如何求得P(B|A)。这里先解释什么是条件几率:

      表示事件B已经发生的前提下,事件A发生的几率,叫作事件B发生下事件A的条件几率。其基本求解公式为:

      贝叶斯定理之因此有用,是由于咱们在生活中常常遇到这种状况:咱们能够很容易直接得出P(A|B),P(B|A)则很难直接得出,但咱们更关心P(B|A),贝叶斯定理就为咱们打通从P(A|B)得到P(B|A)的道路。

      下面不加证实地直接给出贝叶斯定理(公式被网友指出有问题,待后续验证改正):

      


七、推荐实例扩展

7.一、阅读推荐

    先来看一段文字(摘自36kr):

”北京十分科技也很是看好阅读推荐类的应用,他们花了很是大的精力(一年60人团队),才在今天推出了iPhone 版“酷云阅读”。

为何要投入这么多人去作这个阅读应用?CEO 李鹏告诉我,这个团队超过一半的人都在作后台相关的东西,包括语义分析、机器学习等算法。他们的目的是将互联网“语义化”之后,把人的兴趣明确,最后把每一个人感兴趣的内容推荐给相关的人。在iPhone 上,酷云的大体作法和Zite iPad 版相似,用户的行为也是有“喜欢”、“不喜欢”,以及点击相应的媒体来源或者相关的标签来告诉酷云你但愿之后看到更多这些内容。

这个目的是大部分阅读推荐应用都有的,可是酷云的作法彷佛更加变态。他们除了天天要抓取来自互联网的超过10万篇文章以外,还对全国200个的电视台播出的视频内容进行了索引,以便用户也能够经过文字搜索出视频、以及对视频内容进行同样的推荐。大体作法是先把这些节目都录制下来,而后把声音转文字,最后创建摘要和索引。“

    通常的推荐系统应用的算法是有上文所述的什么协同过滤那般复杂呢?如下是援引自本人1月21日所发在微博上的文字:
     一、大多数推荐阅读应用通常会给文章根据内容打上标签:算法,iphone(点击至关于为此标签加分加权重),并邀请对文章做出评价:喜欢,或不喜欢。每一次点击都被推荐系统记录了下来,最终渐渐造成用户的标签tag云(与此同时,还可基于相同或类似的标签tag寻找类似用户,从而基于用户推荐),然后系统每检索一篇新的文章,提取出文章的关键字,匹配用户的标签取向,进行推送。
     二、目前手机上的新闻阅读作到了分类,如科技,教育,但通常不会采起如网页那般评分表态,因此也就没法记录用户的行为特征,也就不会有新的文章出来后后续的推荐阅读服务,因而造就了一批手机推荐阅读的问世,如 @酷云阅读 ,指阅等。
     三、但通常用户的习惯是看完一段新闻便完事了,择日要看则择日看。例若有几个用户愿意为了评价一篇文章而特意去注册一个账号呢?如何尽可能让用户付出额外代价去使用这类阅读器,改变用户习惯,我的认为,是关键。
    而后我还对上面的那句: 先把这些视频节目都录制下来,而后把声音转文字有点疑问。咱们已经知道若是是音乐的话像豆瓣FM多是以下的作法:

  1. 你喜欢一些歌曲,而我也喜欢一些歌曲,若是你我喜欢的歌曲中有不少是重复相似的,则系统会把你我定义为好友,即类似用户,基于用户的协同过滤推荐:朋友喜欢,你也可能喜欢 ;
  2. 还有一个就是针对歌曲的推荐,你喜欢一首歌曲A,而另外一首歌曲B与歌曲A相似(如都是有关爱情、感伤一类的),因此系统猜想你也可能喜欢B,而把B推荐给你。这就是基于项目(物品)的协同过滤推荐。
    根据所听歌曲的重复相似断定为好友从而基于用户的协同过滤进行推荐,经过某些歌曲是差很少相似的来基于项目的协同过滤进行推荐,但问题出来了,重复的好说,同一首歌曲同一个歌手嘛,可那些类似音乐歌曲又如何定义断定呢?经过系统去分析歌曲的频谱?区别各个歌曲节奏的快慢,音频?此举虽然看起来有效,但实际实行起来不太现实。
    我以为应该是为那些音乐打上标签tag(估计视频也是这么作的,便于往后查找索引。全视频的实录目前以为仍是不靠谱),如打上“爱情”“感伤”一类的tag,然后tag相同的则可断定为类似歌曲。但关键是怎么打?语音识别?

7.二、标签tag怎么打
    初期能够人肉,爬虫,买数据库,等流量上来了,能够考虑ugc。所谓ugc,用户产生内容。可是用户通常不太可能本身给音乐打标签,太繁琐了(如最近的新浪微博的每条微博内容下多了一个“加标签”的提示,但有多少用户愿去理它呢?),固然有的系统也会为你自动产生一些标签tag(固然,你也能够自行加上一些标签),如新浪博客:
    如何作到的呢? 个人想法是,
  1. 应该是系统在背后扫描你的文章一遍,而后提取一些关键词做为tag,供你选择。取哪些关键词呢?固然是取高频词。扫描整篇文章,统计每一个单词出现的频率。
  2. 而后取其前TOP K,如上面截图中的“算法”在那篇文章中出现了4次,“博客”出现了3次,因此系统为你自动匹配这些标签。
  3. 至于采起何种数据结构或方法来统计这些关键词的频率呢。通常的应用hash+堆(11、从头至尾完全解析Hash表算法),或trie树(从Trie树谈到后缀树)都可。但当trie树面对的是汉字中文的时候,就比较麻烦了。因此hash+堆是比较理想的选择。
    一样,针对视频的话,应该也是相似的:一、 经过系统或机器读取视频内容,把视频转换为文字,而后提取其中频率出现高的关键词( 如何提取关键词呢,这就涉及到一个关键问题了:分词。本blog往后阐述 ), 把提取出来的这些关键词做为此视频的标签tag;二、而后针对这些tag创建索引摘要( 什么样的索引?倒排索引。至于什么是倒排索引,参考编程艺术第二十四章:第二十3、四章:杨氏矩阵查找,倒排索引关键词Hash不重复编码实践 ),最终方便于往后用户或系统的查找(此节系与编程艺术内的朋友讨论整理总结而出)。
    具体细节后续阐述。

八、参考文献

  1. 本人17日,1月21日的发表的微博(挂在本blog左侧边栏);
  2. 探索推荐引擎内部的秘密,做者:赵晨婷,马春娥;
  3. 集体智慧编程,TobySeganra著。
  4. 推荐系统之协同过滤概述
  5. http://www.cnblogs.com/leoo2sk/
  6. Mitchell, Tom M. Machine Learning. McGraw-Hill, 1997(机器学习领域的开山之做).
  7. http://zh.wikipedia.org/wiki/%E5%86%B3%E7%AD%96%E6%A0%91。
  8. http://www.36kr.com/p/75415.html
  9. 智能web算法,第三章推荐系统(实现了用户及项目的类似度的计算,值得一看)。
相关文章
相关标签/搜索