陈旋
一个普通视频网站经过数年的运营,会保存有十几万个视频,但网站的首页一般显示的是最新的视频,对一些存放时间久的节目,往往不能呈现在首页上,但对于某些用户来说,这样的视频也许有些是他们很感兴趣的。一些网站使用网友评分的方法,这样可以改善视频资源浪费的缺点。通过提供网友评分平均值,让用户根据分值的高低判断一个节目的受欢迎程度,从而考虑是否观看。但是用户兴趣爱好是千差万别的,平均分值仅仅反映的是大众对节目的受欢迎程度,不能满足不同背景下兴趣不同用户的信息需要。而且用户观看完视频后,往往由于忘记或不积极评分等原因没有对其评分,所以需要一种自动获取评分的机制。
数据挖掘(Data Mining,DM)又称数据库中的知识 发 现(Knowledge Discover in Database,KDD),是目前人工智能和数据库相结合,从大量的、不完全的、有噪声的、模糊的、随机的真实数据中发现用户感兴趣知识的一种技术。个性推荐系统属于数据挖掘领域的一种。推荐系统引擎会仔细审查一个用户以前所做出的选择,然后识别出用户对某个还没接触过的条目的喜好程度。推荐系统依据的是用户对节目评分产生的大量历史数据,计算出用户间相似度,相似程度高的另一个用户所观看的视频,可能也是这个用户比较感兴趣的,进而向用户推荐系统,达到充分利用网站资源的目的。
系统主要包含视频网站、节目评分、推荐引擎三大模块。
1.视频网站实现一般视频网站功能,提供视频播放的基本功能,并具有用户管理功能,完成用户身份识别。
2.节目评分模块是采集用户对节目的评分并检验数据是否有效的模块。包含有自动和手动两种。手动是用户在界面上点击分值图标完成评分,这种方式能够比较真实获得用户的评价。对不是很活跃的用户,观看节目后没有对视频做评分,需要一种自动评分的方法。自动评分方法根据用户对一个视频节目的观看时长占节目总时长的比值,自动完成节目的评分。本文用0到5的整数表示喜欢的程度,5表示很喜欢,0表示一点都不喜欢。观看时长与节目总时长的比为1时评分是5,比值为0时评分是0,其他分值可以通过等比计算获得。为了比较准确地获取观看时长,还需要提供校正机制,防止重复观看的时长被重复计算。
3.推荐引擎是推荐系统的主体,引擎通过对采集到的用户、节目、评分数据计算出用户的相似度,并通过视频网站呈现推荐信息。
播放器采用Flash 开发,Flash 的AS(ActionScript,动作脚本)脚本语言能够对JS(JavaScript,语言脚本)很好地支持,通过ExternalInterface.call函数调用网页上的JS基本语法是 ExternalInterface.call(function Name:String, ... arguments)。在使用前,需要添加引用flash.external.*。
使用js开发一个名为Collection类,用于采集数据。其属性和方法以及相应的作用如表1、表2。
播放器开始播放的时向Collection类ReceiveMSG方法发送消息,通知Collection对象播放器开始播放视频,把视频的总时长赋值给curVideoDuration,并初始化其他参数。
表1
表2
播放器已经开始播放视频后,播放器每播放一秒的视频,需要调用一次Collection类的Watch方法对CountSencond属性的计数。为避免回放、跳播等原因导致重复计数,需要一种检验机制。Fragment以30秒作为一个小区间,记录已经观看的片段。以150分钟的电影为例子,视频总时长就是9000秒,将划分成(9000/30)=300个区间。如果用户从头一直观看到16.2分钟,也就是972秒,972整除30得32,那么Fragment[0]到Fragment[31]都将标记为1(表示已观看),其他(300-32=268)的区间都标记为0(表示未观看)。注意到,第32个区间表示的是32×30=960秒,也就是说虽然用户已经观看到了第33个区间,但是还没有看完这个区间,这个未看完的区间也标记为0。虽然这会带来一些误差,但是对节目的评分影响不大。在对CountSencond属性的计数时,用Flash播放器的NetStream对象的time属性获得正在播放的时间点,并检查Fragment所记录的片段标记,如果用户已经观看过(也就是被标记为1),就不给予计数。
当用户暂停时候,播放器也停止调用Collection类的Watch方法。不继续计数。
当用户播放下一个节目,或触发关闭、刷新播放页面事件时,Collection类通过SendCollection方法,采用Ajax(Asynchronous JavaScript and XML,异步JavaScript和XML)异步调用的方式,把计算出来的Score值以及相关的节目、用户信息发送给服务器。
节目评分除采用自动方式外,还提供手动方式,用户可以直接对节目评分,评分之后Collection类停止工作。
推荐系统目前有协同过滤(collaborative filter)与基于内容(content-based)两种类型。基于内容能够根据数据的内容之间的相似度来产生推荐,这种推荐引擎比较适合文档类型的推荐。视频文件在没有经过处理的情况下,是不能够像文档那样通过分词的方式来分析相似度的,而协同过滤方法是用户给对象(如视频、文档、商品等)相当程度的反馈(如评分),这些反馈被记录下来,通过合作的机制分析数据,帮助用户筛选感兴趣的对象。协同过滤推荐引擎在视频网站中通过对节目、用户与评分的历史数据做整理,计算出相似度来完成针对不同的用户提供不同的节目推荐。
1.距离与相似度算法
相似度是一个用于比较两个事物的近似度的度量,类似于生活中描述两个城市相近程度的地理距离。在度量两个城市之间的距离时候,一般会使用经纬度坐标,而在节目或用户虚拟的空间里,则使用“评分”作为这个空间的坐标来度量任意两个节点的距离。假设有两名用户给他们打4或5分(喜欢这些视频节目),同时有第三名用户给它们的评分为0~3分。这样一来,会认为前两个用户彼此是相似的,而与第三个是不相似的。
由此可以看出,相似度是基于距离进行计算的,但与距离却有所不同。距离是大于等于0的数,而相似度具有取值区间,一般的取值范围在[0,1]。距离等于0的时候,说明两点重合。但这时候相似度取最大值。距离具有对称性,A与B的距离等于B与A的距离,相似度也是如此。距离具有三角不等式性质,也就是“两点之间直线最短”。对相似度而言,这个性质是得不到保持的。通过相似度与距离的性质比较,可以看出相似度与距离有着天然的互反性。
2.用户相似度计算
假设有用户User1与User2,节目集合P,User1评分过的节目集合为 P1,P1⊂P。User2评分过的节目为P2, P2⊂P。而且P1,P2≠ Φ (Φ 表示空集) P ′= P1∩P2。 p'∈ P′,User1对节目 p'的评分值是,User2对节目 p'的评分值是。根据欧氏距离的定义,遍历每个元素可以得到由于相似度与距离从某种程度上说是互反的,可对L做些简单的计算,满足这样的特性,比如欧式距离加1再取其倒数,即加常数1是为了避免分母为0。但这样做法是存在缺陷的。如果两个用户对同一个视频打过分,其中一个打1分,另外一个打4分,他们评分的差值的平方为9,按以上公式得到的相似度为0.25。当有另一种情况,两个用户共同对三首歌曲评分,一个用户评分为2、3、4,另一个用户评分是3、4、5。计算出来的相似度也是0.25。第二种情况两个用户有3个节目而第一种情况只有一首,直观地,第二种情况两个用户应更相似。因此可以把定义为朴素相似度公式。在此基础做一些改进,把'p里的个数考虑进来。设,利用双曲正切函数性质,可定义相似度为 sim =1- tanh(L)。
3.向用户推荐节目
遍历网站的视频节目,计算出用户未评论的节目估计评分值,并按预测评分值高到低向用户推荐。
4.用户视频推荐模块设计
设计所需的类,功能如表3。
推荐模块启动时,先初始化BaseDataset,建立User、VideoItem、VideoRating实 例。RecommendSys实例在初始化过程中要完成相似矩阵的计算,保存的是两两用户之间的相似度。当用户登录时候,启动一个线程调用RecommendSys的recommend方法。把用户没有看过,但可能感兴趣的视频推荐出来。图1是用1万个视频节目和300个用户来计算,向一个名为“Bob”的用户推荐视频的结果。
初次运行后,把预测的评分记录下来,下次运行就不需要重复计算,可以节省很多时间。
图1
当用户由于某种原因离开屏幕,但视频还在播放时,这样获得的观看时长并不是用户真实的观看时长,得到用户喜欢数据也不是真实的,因此在播放页面时,提示用户处于自动获取评分状态,并提供手动评分功能,补充自动获取方式的缺点。
表3
如果用户数量很庞大,相似矩阵的计算将是一个很耗时的工作,需分阶段计算。每个阶段的计算结果保存在数据库中下次可直接读取。遍历用户没看过的视频节目,当节目数庞大的时候,也是耗时的工作,同样也采用分批的策略。
基于欧式距离的相似度算法能够获得很好的结果,但计算步骤比较多,可以考虑其他一些计算简单的相似度算法,如狭义Jacquard相似度。
1.(美)玛若曼尼斯等著, 阿稳、陈钢译:《智能Web算法 》,电子工业出版社,2011年版。
2.(美)西格兰著,莫映、王开福译:《集体智慧编程》,电子工业出版社,2009年版。