曝光去重设计与实践

发布于:2024-10-24 编辑:匿名 来源:网络

简介:个性化推荐是推荐系统中最复杂的。个性化推荐涉及到很多基础技术:用户画像、用户曝光记录、推荐算法策略等,其中用户画像和用户曝光记录设计的好坏直接影响推荐系统的性能和效率。

布隆过滤器应用于用户曝光记录,在存储和判断方面具有非常明显的优势。本文结合自己的实践经验,简单介绍一下如何设计一个优雅的用户曝光记录功能。

为了过滤掉用户已经看过的内容,需要存储已经推荐给用户的内容的ID。当再次推荐时,会优先推荐已经推荐过的内容,这样从用户的角度来看,每次都是一样的。

是新内容。在我们的实践中,我们使用了两种实现方案:明文ID列表和布隆过滤器方案。

下面我们就来简单介绍一下。 1、纯文本ID列表解决方案 最容易想到的解决方案就是为每个用户存储一个纯文本内容曝光ID列表,然后结合缓存进行存储。

这里我们选择redis作为存储,存储结构为list,单个用户的暴露列表如下: 这样设计用户暴露列表的优点:纯文本内容id存储,对用户问题追溯非常友好,并且可以非常直观的看到某个用户的推荐内容。方便限制长度和更新淘汰。

我们可以限制单个用户的曝光列表的长度,在一侧添加新记录,如果太长则从另一侧淘汰旧记录。这样可以最大程度保证用户在一段时间内看到的新闻不重复。

,结合新闻的时效性要求,基本可以保证用户永远看到的内容不重复。易于实现,最基本的redis操作即可完成设计。

缺点也很明显:存储空间大,一篇文章ID一般为14字节。如果限制记录数的话,每个用户大约需要70k的存储空间,G大概可以存储几万条用户记录。

从比较效率上来说,首先需要将列表转换为MAP结构,达到O(1)的时间复杂度来判断一篇文章是否被曝光。记录越大,转换效率越低。

2、布隆过滤器方案理论:布隆过滤器(英文:Bloom Filter)是Bloom在2006年提出的,它实际上是一个长的二进制向量和一系列随机映射函数。布隆过滤器可用于检索元素是否在集合中。

它的优点是空间效率和查询时间比一般算法高很多,但缺点是有一定的误识别率和删除困难。布隆过滤器实现原理图 一个简单的布隆过滤器原理如上图所示:假设用户第一次接触到的文章ID是x、y、z,那么首先分配一个位数组并初始化,然后将每个位设置为0。

假设映射函数的数量为3,则每个文章ID依次通过3个映射函数进行映射。每次映射都会产生一个值,该值对应于位数组上的一个点,然后将该位数组中对应的位置标记为1。

当有新的文章w需要判断是否已经曝光时,只需要使用相同的映射函数映射到位数组上的三个点。如果有一点不为1,则该元素一定没有暴露过,否则可能会暴露。

经过。注:判断时存在一定的误判率。

比如文章z映射后,bit数组的三个下标3、4、5都为1,但确实还没有暴露出来。设计与实践:我不打算在这里自己实现布隆过滤器,因为有很多开源实现。

我们的主要实现语言是golang。经过研究和比较,这个开源实现比较简单优雅:(bloomfilterNum = 5 //每人允许的布隆过滤器最大数量 maxKeyNum = //单个布隆可以存储的最大元素数量 FalsePositives = 0. //误识别率) //设置曝光记录 func SetExpose(uid string, ids []string) (error) { if len(uid) < 2 || len(ids) == 0 { returnErrors.New("params error") } //预估Bloom数据块大小和映射函数个数 numBits, numHashFunc:=bloomfilter.EstimateParameters(maxKeyNum, FalsePositives) //用户曝光记录key key := uid //当前设置的文章id数量 num := 0 //判断是否需要新增 isNew := true //初始化一个布隆过滤器 bf :=bloomfilter.New(numBits, numHashFunc) rds := redis.New("local") ExposureData, err := redis.String(rds.Do(nil, "LINDEX", key, 0)) //如果已有记录的话,先加载 if err == nil && exposeData != ""{ arr := strings.Split(exposeData, "::") if len(arr) == 2 { num,err = strconv.Atoi(arr[ 0]) if err == nil && num +len(ids) < 最大值KeyNum{decoded, err := base64.StdEncoding.DecodeString(arr[1]) if err == nil{ //加载现有曝光记录 bf =bloomfilter.NewFromBytes(decoded, numHashFunc) } isNew = false }else{ num = 0 } } } //添加新的曝光记录 for _,id := range ids{ if !bf.Test([]byte(id)){ bf.Add([]byte(id)) num++ } } // 开头表示该块已使用的容量,格式:数量::bloomfilter的字符串编码:= fmt.Sprintf("%d::%s", num, base64.StdEncoding.EncodeToString(bf.ToBytes())) 如果编码!=暴露数据{ if isNew == true{ rds.Do(nil, "LPUSH", key, 编码) }else{ rds.Do(nil, "LSET", key, 0, 编码) } rds.Do(nil, "LTRIM ", key, 0,bloomfilterNum-1) rds.Do(nil, "EXPIRE", key, *24*bloomfilterNum) } return err}//获取曝光记录并返回bloomfilter列表 func GetExposed(uid string ) ( bfs []*bloomfilter.BloomFilter, err 错误) { if len(uid) <2 { return nil,errors.New("params error") } _, numHashFunc :=bloomfilter.EstimateParameters(maxKeyNum, FalsePositives) //用户曝光记录密钥 key := uid rds := redis.New("local")exposeData , err := redis.Strings(rds.Do(nil, "LRANGE", key, 0,bloomfilterNum-1)) if err == nil{ bfs = make([]*bloomfilter.BloomFilter, 0) for _,item := 范围暴露数据 { arr := strings.Split(item, "::") if len(arr) == 2 && arr[1] != ""{ 解码, err := base64.StdEncoding.DecodeString(arr[ 1]) if err == nil { bf :=bloomfilter.NewFromBytes(decoded, numHashFunc) bfs =append(bfs, bf) } } } return bfs, err } return nil, err}//判断key是否已存在暴露 func Exists(bfs []*bloomfilter.BloomFilter, key string) bool {for _, bf := range bfs {if bf.Test([]byte(key)) {return true}}return false} 3、最终效果数据 比较文章 ID 纯文本ID列表方案 布隆过滤器方案 单用户最大存储空间 70k10k 文章判断时间 0.57ms 0.18ms 可以看出,布隆过滤器在存储空间和判断速度上都远远优越。

后记对布隆过滤器不好 要直接查看用户的暴露列表,我们可以设计一套明文ID上报功能。平时不开启举报功能。

当我们需要跟踪用户的暴露记录时,我们可以为该用户添加一组单独的明文报告功能。 ,实现起来并不复杂。

由于本人水平有限,在设计和实现上难免存在不足之处。如果您发现任何问题,请纠正我。

曝光去重设计与实践

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 飞腾公司:基于飞腾芯片的服务器首次入围中国移动、中国电信集中采购

    飞腾公司:基于飞腾芯片的服务器首次入围中国移动、中国电信集中采购

    科创板日报《科创板日报》 记者从飞腾公司获悉,其腾云S双插槽服务器近日通过运营商测试,基于飞腾“腾云S”芯片的服务器入围中国移动、中国电信近期服务器集中采购项目。 据公司相关人士透露,这是飞腾首次进军运营商服务器领域,但最终实施规模还要看实际需求。 “飞腾的下

    06-06

  • 这家公司聘请了人类历史上第一位AI CEO

    这家公司聘请了人类历史上第一位AI CEO

    很多人都思考过一个问题——现在AI技术爆发式增长,哪个职业会首先被AI取代。 继这个问题之后,X用户陈思琪在X平台发起了题为“AI将首先取代谁?”的民意调查。 选项包括:工程师、设计师、产品经理和首席执行官。 最终,CEO一职以31.4%的得票率拔得头筹。 这个结果并非没有根

    06-21

  • 淘宝与哔哩哔哩携手,淘宝成为二次元商业化第一平台

    淘宝与哔哩哔哩携手,淘宝成为二次元商业化第一平台

    据投资界12月20日消息,淘宝与哔哩哔哩共同宣布达成战略合作。 双方将依托各自的资源优势,在哔哩哔哩自身的IP商业运营、UP主内容电商等方面开展了广泛的合作。 根据协议,双方将在哔哩哔哩自有IP的商业化方面打通从前端业务场景到产品开发的商业化链路。 同时支持B站签约UP

    06-18

  • 美畅股份敲钟,成陕西省第57家上市公司

    美畅股份敲钟,成陕西省第57家上市公司

    美昌股份敲响钟声,成为陕西省第57家上市公司。 2019年8月24日,杨凌美昌新材料股份有限公司(以下简称美昌股份)在深圳证券交易所创业板正式挂牌上市,成为陕西省首家上市公司。 上市公司57家。 当日,美畅股份开盘60元,收盘70.06元,总市值2500万元。 美昌有限公司于今年7

    06-17

  • 我不会和你讨论这个问题! Linus Torvalds 删除了 AWS 工程师提交的补丁,称这是一种愚蠢的行为,网友:我的幸福回来了

    我不会和你讨论这个问题! Linus Torvalds 删除了 AWS 工程师提交的补丁,称这是一种愚蠢的行为,网友:我的幸福回来了

    “大神”Linus Torvalds又来骂人了。 据开源中国报道,近日,Linux 内核项目负责人 Linus Torvalds 删除了 AWS 工程师提交的一个补丁,他认为该补丁会导致所有使用该补丁的 Linux 用户(无论是否使用 Intel CPU)的 CPU 性能下降。 在回复这封电子邮件时,他说:在我看来,这

    06-17

  • 《半导体芯科技》杂志主编刘胜教授当选中国科学院院士

    《半导体芯科技》杂志主编刘胜教授当选中国科学院院士

    11月22日消息,据中国科学院之声《关于公布年中国科学院院士增选当选院士名单的公告》,中国科学院2018年,中国科学院选出了59名中国科学院院士,其中,武汉大学机械与动力学院院长、《半导体芯科技》杂志主编刘胜教授当选。 研究方向为微纳制造与芯片封装与集成。 据武汉大学

    06-06

  • 2020年将启动大规模投资自主5G网络

    2020年将启动大规模投资自主5G网络

    央视新闻工信部部长苗圩表示将大规模投资自主5G网络2020年,对于5G应用来说,80%的真实应用场景应该是用于物对物通信,比如工业互联网、车联网、远程医疗等领域。 关于车联网,工信部、交通运输部、公安部已达成共识,推动车联网发展,不仅要关注汽车,还要关注道路、依托5G实

    06-06

  • 黄炎详解鼎晖创投新格局

    黄炎详解鼎晖创投新格局

    今年5月广为人知的王功权“私奔”事件终于落下帷幕,鼎晖创投的工作重回正轨。 尽管王功权本人以及卷入这起事件的鼎晖创投已经成为圈内外的热门话题,但对于鼎晖创投来说,此事已经尘埃落定,也标志着一个新时代的开始。 近日,在鼎晖投资办公室,鼎晖投资合伙人黄炎接受了清

    06-17

  • 中菱科技近2亿B轮融资完成首笔交割,深圳创投制造业转型升级新材料基金领投

    中菱科技近2亿B轮融资完成首笔交割,深圳创投制造业转型升级新材料基金领投

    投资界(ID:pedaily)1月4日消息,浙江中菱科技股份有限公司中岭科技股份有限公司(简称“中岭科技”)宣布完成首笔B轮融资,首笔交割金额近2亿元。 本轮融资由深创投制造业转型升级新材料基金领投、新恒利达资本参与投资,多维资本担任独家财务顾问 深创投制造业转型升级新

    06-18

  • 实地考察宁波创业:宁波助力人工智能? 100亿投资先进制造业,投资人称“土”

    实地考察宁波创业:宁波助力人工智能? 100亿投资先进制造业,投资人称“土”

    在人工智能创业如火如荼之际,如果说软件系统层面的应用创新在北上广深,那么智慧运营商硬件水平升级必须重点关注浙江宁波。 宁波是长三角南翼著名的制造业基地。 作为全国首个“中国制造”试点示范城市,宁波选择聚焦新材料、新技术、新装备产业,引导市场回归实体经济,年年

    06-17

  • 高顿教育完成8亿元C轮融资,高瓴资本、摩根士丹利联合领投

    高顿教育完成8亿元C轮融资,高瓴资本、摩根士丹利联合领投

    据投资界11月21日消息,高顿教育集团近日完成8亿元C轮融资,由高瓴资本领投与摩根士丹利联合领投,永华投资、嘉裕基金跟投。 高顿表示,本轮融资将主要用于继续打造终身金融教育生态系统,并加强对人工智能、大数据、云计算等科技领域的投入,深化其在商业场景中的应用,从而

    06-17

  • 微米医疗完成数千万元Pre-A轮融资,辰德资本独家投资

    微米医疗完成数千万元Pre-A轮融资,辰德资本独家投资

    投资界3月6日消息,据动脉网消息,上海微米医疗科技有限公司(以下简称微米医疗)简称“微米医疗”)完成数千万元Pre-A轮融资,由辰德资本独家投资。 据悉,本轮融资将用于推动公司动脉瘤介入治疗产品MeshCoil致密网状封堵器进入临床研究。 公开资料显示,微米医疗成立于200

    06-18