基于火山引擎云搜索服务的排序学习实战

news2024/11/18 0:25:13

排序学习(LTR: Learning to Rank)作为一种机器学习技术,其应用场景非常广泛。例如,在电商推荐领域,可以帮助电商平台对用户的购买历史、搜索记录、浏览行为等数据进行分析和建模;可以帮助搜索引擎对用户的搜索关键词进行分析建模;可以为广告主提供最精准和最有效的广告投放方案;在金融风控领域,排序学习可以帮助金融机构分析客户的信用评级和欺诈风险,提高风控能力和业务效率。

原理介绍

一般的搜索引擎服务,其搜索过程包含了两个阶段,即召回+排序。如火山引擎云搜索服务,通过用户输入的文本段作为关键词,使用 BM25 打分算法,遍历数据库并挑选出分数最高的文档排好序后再返回展示给用户。由于 BM25 算法模型考虑的因素主要是文本的词频、逆文档频率等。因此搜索结果的排序仅仅取决于它所检索的文本的相关性,这在大部分场景下都是够用的,但是有些应用场景用户则想要实现相关性更优的个性化推荐效果。

为了达到这个目的,需要在已有召回+排序的基础上,额外引入重排阶段。相比较于前两个阶段,第三阶段考虑的因素则偏向于用户行为,通过用户点击、收藏、购买等反馈特征,引入机器学习算法,针对特征与反馈自动学习并调整参数,预估用户对于返回结果的偏好,最终实现个性化搜推结合的效果。整个训练排序过程,也被称为排序学习(LTR: Learning to Rank)。

以火山引擎云搜索服务为例,为了实现完整的三阶段流程,存在内置和外挂两种方式:

  • 内置方式,是将重排阶段以插件的形式安装到火山引擎云搜索服务中,用户输入查询,得到搜推结果。整个流程对业务保持透明,业务只需与搜索引擎完成交互。相关实现为:elasticsearch-learning-to-rank 插件等。

  • 外挂方式,是指在业务侧,先通过火山引擎云搜索服务查询得到召回+排序前两阶段结果,然后将中间结果作为输入,再与 LTR 模型工具进行交互,最后返回搜推结果。整个流程需要业务侧自行处理中间结果,完成与搜索服务和 LTR 模型工具的交互,灵活性更高,对应的开源工具有:metarank 等。

本文的后续内容将利用火山引擎云搜索服务结合 Metarank 项目来演示如何实现用户的个性化搜推实践方案。


环境准备

1.登录火山引擎云搜索服务,创建实例集群,集群版本选择 7.10。

2.Python Client 关键依赖准备

pip install -U elasticsearch7==7.10.1 # ES数据库相关 pip install -U pandas #分析splash的csv

数据集准备

选择 Metarank 文档中推荐的 RankLens 数据集,其中原始的数据集在 dataset 路径下,将其解压后即可得到约 2500 条数据,每条数据包含电影海报、演员、评分等信息。

{ ... "description": "When a rare phenomenon gives police officer John Sullivan the chance to speak to his father, 30 years in the past, he takes the opportunity to prevent his dad's tragic death. After his actions inadvertently give rise to a series of brutal murders he and his father must find a way to fix the consequences of altering time.", "director": { "gender": 2, "id": 17812, "name": "Gregory Hoblit", "popularity": 1.62 }, "id": 3510, "overview": "When a rare phenomenon gives police officer John Sullivan the chance to speak to his father, 30 years in the past, he takes the opportunity to prevent his dad's tragic death. After his actions inadvertently give rise to a series of brutal murders he and his father must find a way to fix the consequences of altering time.", "poster": "https://image.tmdb.org/t/p/original/eu3Hrjj271dnBdNAF0HqfmwWASt.jpg", "releaseDate": "2000-04-28", "tags": [ "time travel", "father-son relationship", "alternate reality", "father son relationship", "supernatural" ], "title": "Frequency", "tmdbId": 10559, "tmdbPopularity": 10.95, "tmdbVoteAverage": 7.2, "tmdbVoteCount": 1254, "topActors": [ { "gender": 1, "id": 31167, "name": "Elizabeth Mitchell", "popularity": 8.646 }, ... ] }

搜推结合实践操作

连接

  • 火山引擎云搜索服务

登录火山引擎云搜索服务,选择刚刚创建好的实例,选择复制公网访问地址(由于Metarank运行在本地机器上,为了连接云搜索服务,需要打开公网访问,如果Metarank运行在用户VPC里则不需要):

# 连接火山引擎云搜索服务实例 cloudSearch = CloudSearch("https://{user}:{password}@{ES_URL}", verify_certs=False, ssl_show_warn=False)

  • Metarank 服务

本地启动 Metarank 服务,数据集参数(--data)指定转化后的数据集,包括数据的元信息及用户点击率信息;配置文件参数(--config)指定模型配置等,参数及文件下载可参考 https://docs.metarank.ai/introduction/quickstart

java -jar metarank-0.7.1.jar standalone --data events.jsonl.gz --config events-config.yml

写入

将 RankLens 数据集写入火山引擎云搜索服务

import json path = '${下载的数据集所在路径}' with open(path, 'r') as f: bulk_docs = [] n = 0 for line in f.readlines(): doc = json.loads(line.rstrip()) if 'title' in doc: n += 1 bulk_docs.append({"index": {"_id": doc['id']}}) bulk_docs.append(doc) ## 每次批量写入50条数据 if n % 50 == 0: resp = cloudSearch.bulk(bulk_docs, index='events2') bulk_docs = []

查询

1.文本查询 + Metarank 重排

@app.route('/search', methods=['GET']) def search(): return innerSearch() def innerSearch(): # 获取参数 query = request.args.get('query') method = request.args.get('retrieval') n = int(request.args.get('size')) rank = request.args.get('rank') start = time.time() # 文本查询 docs = retrieve(method, query, n) done1 = time.time() if len(docs['hits']['hits']) == 0: return render_template('search.html', help=False, query=query, method=method, rank=rank, size=n, took={"search": 1000*(done1-start), "rank": 0, "total": 1000*(done1-start)}) # Metarank重排 sorted = rerank(rank, query, docs['hits']['hits']) done2 = time.time() return render_template('search.html', help=False, query=query, docs=sorted, method=method, rank=rank, size=n, took={"search": 1000*(done1-start), "rank": 1000*(done2-done1), "total": 1000*(done2-start)})

2.点击反馈

将用户的偏好反馈写入 metarank

@app.route('/feedback', methods=['GET']) def feedback(): item = request.args.get('item') # 点击反馈 interaction = metarank.feedbackInteraction(item) return innerSearch()

结果展示

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

警惕Mallox勒索病毒的最新变种mallab,您需要知道的预防和恢复方法。

导言: 在我们数字化的世界中,.mallab勒索病毒如同一只潜伏的恶龙,威胁着我们的数据安全。本文将深入探讨.mallab勒索病毒的攻击方式,同时提供生动的对策,助您从这场数据恶梦中苏醒。如果受感染的数据确实有恢复的价值…

面试经典 150 题 4 —(数组 / 字符串)— 80. 删除有序数组中的重复项 II

80. 删除有序数组中的重复项 II 方法一 class Solution { public:int removeDuplicates(vector<int>& nums) {int len 0;for(auto num : nums)if(len < 2 || nums[len-2] ! num)nums[len] num;return len;} };方法二 class Solution { public:int removeDupli…

仅个人记录:复现dotspatialdemo、打包、

复现dotspatialdemo 原始文件 一、新建项目、工具箱设置&#xff0c;项目引用等看上一篇 二、根据Form1.Designer.cs设计界面Form1.cs[设计] SplitContainer控件&#xff1a;将容器的显示区域分成两个大小可调的、可以向其中添加控件的面板。 legend控件&#xff1a;图例 map控…

anaconda安装及配置+pytorch安装与配置(自用笔记)

anaconda安装及配置 1、anaconda官网下载安装包 下载好后进行安装 2、anaconda安装地址(记住安装路径)&#xff1a; 3、配置环境变量 打开anaconda prompt: 输入命令conda list: 可以看到安装好的很多包&#xff01; 至此anaconda配置完成。 PyTorch的安装与配置 使用con…

Windows系统搭建VisualSVN服务结合内网穿透实现公网访问

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

STM32 CubeMX PWM两种模式(HAL库)

STM32 CubeMX PWM两种模式&#xff08;HAL库&#xff09; STM32 CubeMX STM32 CubeMX PWM两种模式&#xff08;HAL库&#xff09;一、互补对称输出STM32 CubeMX设置代码部分 二、普通模式STM32 CubeMX设置![在这里插入图片描述](https://img-blog.csdnimg.cn/647ba7dcefb545bb8…

dubbo3+zookeeper+dubbo-admin

工程结构&#xff1a; 版本信息&#xff1a; jdk版本&#xff1a;1.8 springboot-parent版本&#xff1a;2.6.6 springboot版本&#xff1a;2.6.6 dubbo版本&#xff1a;3.0.7 curator版本&#xff1a;4.2.0注意事项&#xff1a;正确的版本很重要&#xff0c;否则会报莫名其妙…

智慧楼宇3D数据可视化大屏交互展示实现了楼宇能源的高效、智能、精细化管控

智慧园区是指将物联网、大数据、人工智能等技术应用于传统建筑和基础设施&#xff0c;以实现对园区的全面监控、管理和服务的一种建筑形态。通过将园区内设备、设施和系统联网&#xff0c;实现数据的传输、共享和响应&#xff0c;提高园区的管理效率和运营效益&#xff0c;为居…

[开源]MIT协议,开源论坛程序,拥有友好的用户界面和操作体验

一、开源项目简介 尤得一物是一个开源论坛程序&#xff0c;提供丰富的功能&#xff0c;可以作为管理或分享文章的论坛博客&#xff0c;也可以在此基础上进行自定义开发。 二、开源协议 使用MIT开源协议 三、界面展示 四、功能概述 尤得一物是一个开源论坛程序&#xff0c;…

什么是轴电流?轴电流对轴承有什么危害?

根据同步发电机结构及工作原理&#xff0c;由于定子铁芯组合缝、定子硅钢片接缝&#xff0c;定子与转子空气间隙不均匀&#xff0c;轴中心与磁场中心不一致等&#xff0c;机组的主轴不可避免地要在一个不完全对称的磁场中旋转。这样&#xff0c;在轴两端就会产生一个交流电压。…

电动机监控系统在企业降碳过程中的作用-安科瑞黄安南

1.前言 据《2017-2022年中国电力工业产业专项调查及十三五市场商机分析报告》显示&#xff0c;从我国目前全社会用电结构来看&#xff0c;工商业用户耗电量约占 80%&#xff0c;其中电机耗电约占工业用电的 75%&#xff0c;全国总耗电的 60%&#xff0c;是用户终端耗电占比较大…

阿里云/腾讯云国际站代理:阿里云实名账号和亚马逊云,挑战依然巨大

阿里云国际代理商开户去哪里&#xff0c;认准小狐狸云&#xff0c;是阿里云国际站生态合作伙伴。与阿里云、华为云、aws长期战略合作计划&#xff01;阿里云国际站代理商专业云服务商&#xff01;支持 usdt充值美金&#xff0c;支持阿里云服务器不限制地区购买&#xff0c;云数…

arcgis地形分析全流程

主要内容&#xff1a;DEM的获取与处理、高程分析、坡度分析、坡向分析、地形起伏度分析、地表粗糙度分析、地表曲率分析&#xff1b; 主要工具&#xff1a;镶嵌至新栅格、按掩膜提取、投影栅格、坡度、坡向、焦点统计 一 DEM的获取与处理 1.1 DEM是什么&#xff1f; DEM(D…

「滚雪球学Java」教程导航帖(更新中)

作者&#xff1a;bug菌 博客&#xff1a;CSDN | 掘金 | infoQ | 51CTO 等 简介&#xff1a;CSDN/阿里云/华为云/腾讯云/51CTO博客专家&#xff0c;博客之星Top30&#xff0c;掘金年度人气作者Top40&#xff0c;51CTO年度>博主Top12&#xff0c;掘金/InfoQ/51CTO等社区优质创…

01.ChatGPT原理剖析

目录 ChatGPT初体验对ChatGPT的误解ChatGPT的本质模型的训练 ChatGPT的关键技术监督学习预训练&#xff08;Pre-train&#xff09;GPT系列的历史预训练的好处 强化学习 ChatGPT带来的研究问题 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》&#xff0c;B站自行搜索 Ch…

虹科方案 | 汽车CAN/LIN总线数据采集解决方案

全文导读&#xff1a;现代汽车配备了复杂的电子系统&#xff0c;CAN和LIN总线已成为这些系统之间实现通信的标准协议&#xff0c;为了开发和优化汽车的电子功能&#xff0c;汽车制造商和工程师需要可靠的数据采集解决方案。基于PCAN和PLIN设备&#xff0c;虹科提供了一种高效、…

day30

今日内容概要 继承(面向对象中得核心) 单继承 多继承 单继承下的属性查找 多继承下的属性查找 super和mro的使用 多态和鸭子类型 继承&#xff08;核心&#xff09; 面向对象的三大特征&#xff1a;封装、继承、多态 1.什么是继承 继承就是一种新建类的方式&#xff0…

Bootstrap的宽度和高度的设置(相对于父元素的宽度和高度、相对于视口的宽度和高度)

在Bootstrap中&#xff0c;宽度和高度的设置分为两种情况&#xff0c;一种是相对于父元素的宽度和高度设置&#xff0c;以百分比来表示&#xff1b;另一种是相对于视口的宽度和高度设置&#xff0c;单位为vw(视口宽度)和vh(视口高度)。 01-相对于父元素的宽度和高度设置 示例…

Ubuntu磁盘满了,导致黑屏

前言 &#xff08;1&#xff09;最近要玩Milk-V Duo&#xff0c;配置环境过程中&#xff0c;发现磁盘小了。于是退出虚拟机&#xff0c;扩大Ubuntu大小&#xff0c;重新开机&#xff0c;发现无法进入Ubuntu界面。 &#xff08;2&#xff09;查了很久&#xff0c;后面发现是磁盘…

软件测试之压力测试详解

压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&#xff0c;并确保软件在危急情况下不会崩溃。它甚至可以测试超出正常工作点的测试&#xff0c;并评估软件在极端…