CSDN个性化推荐系统-负反馈测试

文章目录

  • 前言
  • 一、uc不感兴趣标签过滤测试
    • 1.uc不感兴趣标签获取(uc_unlike_tag_list)
      • 1.1个人中心界面
      • 1.2从标签中可以发现什么?
      • 1.3与研发确认点
      • 1.4设计开发
      • 1.5接口获取结果
    • 2.推荐流文章标签获取(tag_list)
      • 2.1部分代码
      • 2.2基本标签校验
      • 2.3基本标签校验结果
    • 3.推荐流uc不感兴趣标签过滤验证
      • 3.1校验方法
      • 3.2部分代码
      • 3.3校验结果
      • 3.4结果分析
    • 4.用户场景回归
  • 二、用户推荐流负反馈过滤测试
    • 1.内容负反馈
      • 1.1提交API校验
      • 1.2获取API校验
      • 1.3过滤验证
        • 1.3.1获取内容负反馈资源列表(negative_item_list)
        • 1.3.2获取推荐流资源列表(item_list)
        • 1.3.3求item_list和negative_item_list交集
        • 1.3.4交集结果
        • 1.3.5结果分析
    • 2.标签负反馈
      • 2.1提交API校验
      • 2.2获取API校验
      • 2.3过滤验证
        • 2.3.1获取标签负反馈标签列表(negative_tag_list)
        • 2.3.2获取推荐流标签列表(tag_list)
        • 2.3.3求tag_list和negative_tag_list交集
        • 2.3.4交集结果
        • 2.3.5结果分析
    • 3.作者负反馈
      • 3.1提交API校验
      • 3.2获取API校验
      • 3.3过滤验证
        • 3.3.1获取作者负反馈作者列表(negative_user_list)
        • 3.3.2获取推荐流作者列表(user_list)
        • 3.3.3求user_list和negative_user_list交集
        • 3.3.4交集结果
        • 3.3.5结果分析
  • 三、未登录用户负反馈过滤测试
    • 1.提交API校验
    • 2.获取API校验
    • 3.过滤验证
  • 四、整体回归
  • 五、新老负反馈写入hbase对比

前言

大家好,我是空空star,本篇给大家分享一下《CSDN个性化推荐系统-负反馈测试》

一、uc不感兴趣标签过滤测试

用户:weixin_38093452

1.uc不感兴趣标签获取(uc_unlike_tag_list)

1.1个人中心界面

1.2从标签中可以发现什么?

  • 标签有一级标签、二级标签
  • 标签并不都是全小写,也有一些字母大写
  • 同一个标签在感兴趣和不感兴趣里都出现

1.3与研发确认点

  • 一级标签和二级标签在过滤侧会拆开用到还是只用了二级标签?
  • 获取到的uc标签与推荐流文章标签匹配时有无统一转小写或大写后才去匹配?
  • 当同一个标签在感兴趣和不感兴趣里都出现时,屏蔽的优先级是不是高于增强的优先级?
  • uc标签维护好后,在推荐流的生效时间?

1.4设计开发

def get_uc_tag_list(username, interest_type):
    uc_tag_list = []
    # 获取uc不感兴趣标签
    url = f'http://xxx.csdn.net/user_csdn_tag/get_tag_list?username={username}&type={interest_type}'
    response = requests.get(url)
    res = response.json()
    for i in res['data']:
        name = i['name']
        for tag in i['tags']:
            if tag['select']:
                # 添加小写后的一级标签
                uc_tag_list.append(name.lower())
                # 添加小写后的二级标签
                uc_tag_list.append(tag['name'].lower())
    return uc_tag_list

1.5接口获取结果

unlike_uc_tag_list = get_uc_tag_list('weixin_38093452', 1)
print(unlike_uc_tag_list)

[‘python’, ‘pillow’, ‘java’, ‘java’, ‘编程语言’, ‘php’, ‘大数据’, ‘odps’, ‘大数据’, ‘大数据’, ‘人工智能’, ‘人工智能’, ‘aigc’, ‘chatgpt’]

2.推荐流文章标签获取(tag_list)

用户:weixin_38093452
请求推荐接口50次

2.1部分代码

    items = result['data']['items']
    for data in items:
        # 过滤掉nps
        if 'username' in data:
            tags = data["tags"]
            temp_tag = []
            for tag in tags:
                # 用来判断一个item中返回的标签是否重复(ml和title合并,只保留ml)
                temp_tag.append(tag['name'])
                # 多次请求后,用来跟uc的不感兴趣标签/负反馈标签做对比
                tag_list.append(tag['name'])
                # 多次请求后,用来判断ml标签和title标签是否有返回
                tag_type_list.append(tag['type'])
                if tag['name'] == '':
                    print(f"存在空标签,博客:{data['product_id']},标签类型:{tag['type']},标签名称:{tag['name']}")
            if len(temp_tag) != len(set(temp_tag)):
                print(f"同一篇博客{data['product_id']}存在重复标签:{temp_tag}")
if len(set(tag_type_list)) == 2:
    print(f'返回文章标签类型:{set(tag_type_list)}')

2.2基本标签校验

  • ml标签和title标签是否都有返回;
  • 是否有空标签结构返回;
  • 同一篇博客是否返回重复标签;

2.3基本标签校验结果

返回文章标签类型:{‘ml’, ‘title’}

3.推荐流uc不感兴趣标签过滤验证

3.1校验方法

  1. 获取用户的uc不感兴趣标签列表(uc_unlike_tag_list);
  2. 获取用户50次请求推荐流返回文章的标签列表(tag_list);
  3. 求uc_unlike_tag_list和tag_list的交集。

3.2部分代码

    print(f'【推荐返回的标签】:{set(tag_list)}')
    unlike_uc_tag_list = get_uc_tag_list(username, '1')
    print(f'【uc-不感兴趣标签】:{set(unlike_uc_tag_list)}')
    intersection_tag = list(set(tag_list).intersection(set(unlike_uc_tag_list)))
    print(f'【uc-不感兴趣标签过滤】验证结果,标签交集:{intersection_tag}')

3.3校验结果

3.4结果分析

标签交集为空,说明没有badcase;
将【推荐返回的标签】中的高频标签维护到uc不感兴趣标签中,再次执行我们的脚本观察校验结果,结合服务端uc不感兴趣过滤日志,多次执行标签交集仍为空,说明uc不感兴趣标签在推荐流过滤生效。

4.用户场景回归

确保推荐接口有返回数据和返回数据正常。

  • 登录用户(未维护uc不感兴趣标签)
  • 未登录用户

二、用户推荐流负反馈过滤测试

1.内容负反馈

1.1提交API校验

负反馈项(directive):

  • duplicate:内容重复推荐
  • content poor quality:内容质量较低
  • advertising:内容夸张、涉及广告等

资源类型(type):

  • blog
  • ask
  • blink
  • live

1.2获取API校验

  • last_unlike_time:负反馈操作时间戳记录是否正确;
  • num:负反馈提交次数记录是否正确;
  • directive:负反馈项记录是否正确;
  • 是否以type和item_id两个字段作为唯一键。

1.3过滤验证

1.3.1获取内容负反馈资源列表(negative_item_list)

def get_negative_item_list(username):
    negative_item_list = []
    url = f'http://xxx.csdn.net/api/v2/recommend/insight/negative/items/by/{username}'
    response = requests.get(url)
    res = response.json()
    pprint.pprint(res)
    for i in res['result']['duplicate']:
        if 'object_id' in i.keys():
            negative_item_list.append(i['type']+':'+i['object_id'])
    for j in res['result']['content poor quality']:
        if 'object_id' in j.keys():
            negative_item_list.append(j['type']+':'+j['object_id'])
    for k in res['result']['advertising']:
        if 'object_id' in k.keys():
            negative_item_list.append(k['type']+':'+k['object_id'])
    return negative_item_list

1.3.2获取推荐流资源列表(item_list)

item_list.append(data['product_type']+':'+data['product_id'])

1.3.3求item_list和negative_item_list交集

    print(f'【推荐返回的item】:{set(item_list)}')
    negative_item_list = get_negative_item_list(username)
    print(f'【内容负反馈】:{set(negative_item_list)}')
    negative_intersection_item = list(set(item_list).intersection(set(negative_item_list)))
    print(f'【内容负反馈过滤】验证结果,item交集:{negative_intersection_item}')

1.3.4交集结果

1.3.5结果分析

交集为空,说明没有badcase;
将推荐结果返回的部分资源列表通过提交API写入内容负反馈,再求交集,多次执行交集为空,说明内容负反馈在推荐流过滤生效。

2.标签负反馈

2.1提交API校验

directive:

  • reduce:减少
  • block:屏蔽

2.2获取API校验

  • tag:标签是否统一转小写;
  • last_unlike_time:负反馈操作时间戳记录是否正确;
  • num:负反馈提交次数记录是否正确。

2.3过滤验证

2.3.1获取标签负反馈标签列表(negative_tag_list)

def get_negative_tag_list(username):
    negative_tag_list = []
    url = f'http://xxx.csdn.net/api/v2/recommend/insight/negative/tags/by/{username}'
    response = requests.get(url)
    res = response.json()
    for i in res['result']:
        negative_tag_list.append(i['tag'].lower())
    return negative_tag_list

2.3.2获取推荐流标签列表(tag_list)

tag_list.append(tag['name'])

2.3.3求tag_list和negative_tag_list交集

    negative_tag_list = get_negative_tag_list(username)
    print(f'【减少xx相似内容推荐】:{set(negative_tag_list)}')
    negative_intersection_tag = list(set(tag_list).intersection(set(negative_tag_list)))
    print(f'【减少xx相似内容推荐过滤】验证结果,标签交集:{negative_intersection_tag}')

2.3.4交集结果

2.3.5结果分析

交集为空,说明没有badcase;
将推荐结果返回的标签列表通过提交API写入标签负反馈,再求交集,多次执行交集为空,说明标签负反馈在推荐流过滤生效。

3.作者负反馈

3.1提交API校验

  • unlike_user_id大小写场景

3.2获取API校验

  • 作者是否转小写处理;
  • last_unlike_time:负反馈操作时间戳记录是否正确;
  • num:负反馈提交次数记录是否正确。

3.3过滤验证

3.3.1获取作者负反馈作者列表(negative_user_list)

def get_negative_user_list(username):
    negative_user_list = []
    url = f'http://xxx.csdn.net/api/v2/recommend/insight/negative/users/by/{username}'
    response = requests.get(url)
    res = response.json()
    for i in res['result']:
        negative_user_list.append(i.lower())
    return negative_user_list

3.3.2获取推荐流作者列表(user_list)

user_list.append(data['username'])

3.3.3求user_list和negative_user_list交集

    print(f'【推荐返回的作者】:{set(user_list)}')
    negative_user_list = get_negative_user_list(username)
    print(f'【不看此作者】:{set(negative_user_list)}')
    negative_intersection_user = list(set(user_list).intersection(set(negative_user_list)))
    print(f'【不看此作者过滤】验证结果,作者交集:{negative_intersection_user}')

3.3.4交集结果

3.3.5结果分析

交集为空,说明没有badcase;
将推荐结果返回的作者列表通过提交API写入作者负反馈,再求交集,多次执行交集为空,说明作者负反馈在推荐流过滤生效。

三、未登录用户负反馈过滤测试

1.提交API校验

pc传uuid,app传device_id

2.获取API校验

  • imei字段值不做大小写处理;
  • 根据imei字段值可以正确获取到负反馈的数据。

3.过滤验证

类似登录用户的校验流程,只是请求推荐接口的入参有调整。

四、整体回归

  • 召回策略验证;
  • 召回资源类型验证;
  • 未登录用户/登录用户(是否维护uc兴趣标签/是否维护身份标签)场景验证;
  • 单次请求结果中资源类型分布情况验证;
  • 单次请求结果中出现重复作者占比验证;
  • 单次请求结果中出现重复资源验证;
  • 单次请求结果中连续出现同作者资源验证;
  • 其他渠道数据验证(关注流、同城流、blink热门流、推荐用户列表等)
  • 多端验证(app/wap/pc/小程序等)

五、新老负反馈写入hbase对比

旧负反馈新负反馈
流程用户提交负反馈->上报到sls->flink消费sls->udf处理写入hbase用户提交负反馈->通过API直接写入hbase
响应flink任务时常延迟/迁移华为云等因素,需要重构实时
文案文案不统一,如wap端【内容重复推荐】叫【旧闻,重复】,【内容质量较低】叫【内容质量差】,【不看此作者】叫【不喜欢该作者】各端文案已统一
数据非blog资源的负反馈数据未正常解析,导致没有正确写入hbase已兼容不同资源类型

引用
[1] 《如何支持研发对CSDN个性化推荐系统重构》
[2] 《CSDN 个性化推荐系统的设计和演进》
[3] 《CSDN 个性化推荐的数据治理》


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32919.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为云专家出品《深入理解边缘计算》电子书上线

华为开发者大会PaaS生态电子书推荐,助你成为了不起的开发者! 什么是边缘计算?边缘计算的应用场景有哪些? 华为云出品《深入理解边缘计算》电子书上线 带你系统理解云、边、端协同的相关原理 了解开源项目的源码分析流程 学成能…

Linux--在当前路径下创建目录/文件夹指令:mkdir

语法: mkdir [选项] 文件名 功能: 在当前目录下创建一个名为 “文件名”的目录 常用选项: -p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些不存在的目录,即一次可以建立…

基于Ant DesignPro Vue + SpringBoot 前后端分离 - 后端微服化 + 接口网关 + Nacos + Sentinel

基于Ant DesignPro Vue SpringBoot 前后端分离 - 后端微服化 接口网关 Nacos Sentinel 通过Ant DesignPro Vue SpringBoot 搭建的后台管理系统后,实现了前后端分离,并实现了登录认证,认证成功后返回该用户相应权限范围内可见的菜单。 后…

Linux基础:Vim编辑器实用指南

前言 Linux基础是学习云原生的重中之重,如果你还不知道学习路线可以参考: 耗时3个月,线下访谈30 csdn大佬,规划出了我的云原生学习路线 文章目录 前言vim的介绍vim的四种模式1. 插入模式1.1 进入插入模式:1.2 退出插入…

[Pytorch]Broadcasting广播机制

文章目录 Broadcasting广播机制BroadcastableBroadcasting Broadcasting广播机制 Broadcasting机制用于在不同维度的张量进行运算时进行维度的自动增加与扩展,Broadcasting机制使用的前提是两个参与运算的张量是可broadcastable的。 Broadcastable 怎样的两个向量…

【数据分析之道-Matplotlib(七)】Matplotlib直方图

文章目录 专栏导读1、hist()基本语法2、使用 hist() 函数绘制多个数据组的直方图3、修改直方图的颜色及边框颜色4、六一儿童节为主题,使用直方图进行可视化 专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享pyth…

web入门——springboot、HTTP协议

这里写目录标题 springboot入门 http协议概念以及特点请求协议格式请求头的一些含义解释 响应协议格式具体的状态码以及响应头的一些含义解释 协议解析 springboot 入门 http协议 概念以及特点 请求协议 格式 包括请求行、请求头、请求体三部分(请求体是pos请求方…

想要让视频素材格式快速调整转换的方法分享

有时候有些视频播放软件不支持播放某些格式的视频文件?那要怎么解决呢?换一个播放软件?不妨试试批量转换视频格式,简单的几步操作就能快速解决烦恼,跟着小编一起来看看具体的操作环节吧。 首先先进入“固乔科技”的官网…

MapReduce分布式计算(二)

MapReduce工作流程 原始数据File 1T数据被切分成块存放在HDFS上,每一个块有128M大小 数据块Block hdfs上数据存储的一个单元,同一个文件中块的大小都是相同的 因为数据存储到HDFS上不可变,所以有可能块的数量和集群的计算能力不匹配 我们需要一个动态…

MySQL中的DDL操作,MySQL中DML操作,MySQL查询数据,SQL函数,MySQL中的索引,MySQL事务,MySQL的用户管理,MySQL分页查询

目录 MySQL中的DDL操作 一、创建表与删除表 1,创建表 2,查看已创建的表。 3,删除表 二、修改表 1,修改表名 2,修改列名 3,修改列类型 4,添加新列 5,删除指定列 三、MySQ…

ML算法——Support Vector Machine随笔【机器学习】

文章目录 4、Support Vector Machine (SVM)4.1、理论部分4.1.1、更优的决策边界4.1.2、解决低维不可分问题 4.2、sklearn 实现4.2.1、SVM 分类(SVC)4.2.2、SVM回归(SVR)4.2.3、网格调参 4.3、案例 4、Support Vector Machine (SVM…

UE5 Stride Warping Orientation Warping功能学习

在UE5的 Lyra Demo中,运用到了各类动画Warping(动画扭曲)技术,通过各类Warping节点在动画蓝图中的合理组织,可以有效的解决运动滑步问题,并为动画增添更多细节。 本文主要基于Animation Warping插件讲一下…

python 加速(1)

文章目录 简单步骤像Python一样做torch 的一切安装Cmake安装 Torch (GPU)CMakeLists.txt试用小样设置 CLion 环境 Cuda配置VS C 环境建上手的文件step1: interpolation.cppstep2: interpolation_kernel.custep3: include/ utils.hstep4: setup.pystep5: …

【系统架构】第五章-软件工程基础知识(软件测试、净室软件工程、基于构件的软件工程、 软件项目管理)

软考-系统架构设计师知识点提炼-系统架构设计师教程(第2版) 软件测试 一、测试方法 以测试过程中程序执行状态为依据可分为静态测试(ST)和动态测试(DT) 以具体实现算法细节和系统内部结构的相关情况为根据…

【强化学习】常用算法之一 “A3C”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

VUE3-组件问题

VUE3-组件问题 文章目录 VUE3-组件问题一、S-Table1.问题描述2.问题展示3.问题解决 二、form表单无法显示1.问题描述2.问题展示3.问题解决 三、input 框为不可编辑状态四、Echarts组件未渲染五、图片正常引用,但是部署服务器部署不上去,看不到图片1.图片…

element封装 table表格 ,插槽的使用,修改el-table-column的值

举例 vue2这种不封装的 直接写的很罗嗦麻烦 下面圈起来的可以封装一个对象 进行循环 弊端: 循环后 无法进行获取更改某一列的值 比如data日期我需要转换年月日 不循环我直接在这个el-table-column的这一列进行写&#xff08;如下&#xff09; <el-table-column label&quo…

Vue3解决:[Vue warn]: Failed to resolve component: el-table(或el-button) 的三种解决方案

1、问题描述&#xff1a; 其一、报错为&#xff1a; [Vue warn]: Failed to resolve component: el-table If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement. at <App> 或者&#xff1a; …

实验 4:排序与查找

东莞理工的学生可以借鉴&#xff0c;请勿抄袭 1.实验目的 通过实验达到&#xff1a; 理解典型排序的基本思想&#xff0c;掌握典型排序方法的思想和相应实现算法&#xff1b; 理解和掌握用二叉排序树(BST)实现动态查找的基本思想和相应的实现 算法。 理解和掌握哈希(HASH)存…

【Django】图形验证码显示及验证

图形验证码显示及验证 开发项目时&#xff0c;在登陆或者注册功能中为防止脚本恶意破坏系统&#xff0c;故而添加图形验证码。 文章目录 图形验证码显示及验证1 安装配置2 验证码显示及正确性验证3 效果显示 1 安装配置 安装第三方库 pip install django-simple-captcha配置s…