今天下午参加了一个视频类的推荐系统技术分享,此处仅整理我觉的有用的地方,和个人一些想法。php
不少时候咱们须要用到过滤。例如对于一个用户的检索/推荐来讲,召回结果里首先不能含有他之前点击(观看)过的,也不能出现垃圾信息(广告、色情),同时对用户曾经拉黑、不喜欢的帐号或内容也要作过滤。html
考虑这样一个场景:有一个很相关的视频没有被推荐给用户,通过查询发现被过滤了,如今咱们想知道是在以上(看过、垃圾、用户拉黑)哪一步被过滤的?
(咱们还没作)dom
答案是:他们的手段是,针对不一样的过滤信息作编码。例如如今有3个过滤手段:看过、垃圾、用户拉黑。咱们分别为其编码:函数
1 看过 2 垃圾 4 用户拉黑
如今有5个视频,其初始默认均为
$$[0, 0, 0, 0, 0]$$
通过步骤1:
$$[1, 0, 0, 1, 0]$$
说明视频1和4被看过。
接下来通过步骤2
$$[2, 2, 0, 0, 0]$$
同理通过步骤3
$$[4, 4, 0, 0, 0]$$
最后咱们把这些进行累加,获得:
$$[7, 6, 0, 1, 0]$$
过滤非0的便可。实际追查起来,咱们很容易根据"7"知道视频1过滤的缘由是同时被看过、垃圾、用户拉黑,其余同理。编码
考虑要将每一个用户近3个月看过的全部视频均存起来,很是耗存储量。咱们能够考虑使用布隆过滤器。
(考虑将这个后续用在“过滤hr已查看人才”的存储)
一个bloom filter是一个有m bits的bit array,每个bit位都初始化为0。而后使用k个hash函数,每一个都以uniform random distribution将元素hash到m个不一样位置中的一个(此处存在一个问题:当k很大时,怎么保证这k个hash函数的映射位置不重叠?)。设计
此处有提到:code
当k很大时,设计k个独立的hash function是不现实而且困难的。对于一个输出范围很大的hash function(例如MD5产生的128 bits数),若是不一样bit位的相关性很小,则可把此输出分割为k份。或者可将k个不一样的初始值(例如0,1,2, … ,k-1)结合元素,feed给一个hash function从而产生k个不一样的数。orm
add元素:使用这k个hash函数计算,映射在k个位置上,将m bit的这k位置1便可。视频
查询:用k个hash function将它hash获得k个bit位。若这k bits全为1,则存在。若任意元素不为1,则不存在。htm
由此咱们知道,布隆过滤器永远不可能将“看过的判为没看过(毕竟已经存储过了啊)”,但可能将没看过的判为看过(这须要k个hash函数同时巧合地映射在对应位置)
首先用tf-idf过滤获得关键词,而后使用余弦类似度过滤距离较远的词。
这样两步,前一步的做用是提取核心词,后一步是过滤核心词中的“不正常”的词,例如在詹姆斯视频中提到“冰与火之歌”。
用户原本对动漫感兴趣,离线计算的结果也是,但此时他就是想看游戏视频怎么办?推荐应该给出实时的响应。
(个人引伸思考)
目前咱们的人才推荐,针对hr天天只推荐1次,将来考虑能够针对hr的每次搜索作推荐的动态更新:例如hr此时搜索了3次“php”相关职位,点击了几个“PHP后台”的简历,咱们能够当即生成对“PHP后台”相关的推荐。假如hr平均天天搜10次,则咱们可使目前的人才推荐曝光量增长10倍。
当hr不搜索时(或30分钟后),人才推荐又恢复正常。