DashText-进阶使用

前置知识

BM25简介

BM25算法(Best Matching 25)是一种广泛用于信息检索领域的排名函数,用于在给定查询(Query)时对一组文档(Document)进行评分和排序。BM25在计算Query和Document之间的相似度时,本质上是依次计算Query中每个单词和Document的相关性,然后对每个单词的相关性进行加权求和。BM25算法一般可以表示为如下形式:

上式中,和 分别表示用来计算相似度的Query和Document, q表示 的第 个单词,R(qi, d) 表示单词 q和文档 的相关性,W表示单词 q的权重,计算得到的 score(q, d) 表示 和 的相关性得分,得分越高表示 和 越相似。W和 R(qi, d) 一般可以表示为如下形式:

其中,表示总文档数,N(qi表示包含单词 q的文档数,tf(qi, d) 表示q在文档 中的词频,L表示文档 的长度,Lavg 表示平均文档长度,k和 是分别用来控制 tf(qi, d) 和 L对得分影响的超参数。

稀疏向量生成

在检索场景中,为了让BM25算法的Score方便进行计算,通常分别对Document和Query进行编码,然后通过点积的方式计算出两者的相似度。得益于BM25原理的特性,其原生支持将Score拆分为两部分Sparse Vector,DashText提供了encode_document以及encode_query两个接口来分别实现这两部分向量的生成,其生成链路如下图所示:

image.png

最终生成的稀疏向量可表示为:

Score/距离计算

生成dq的稀疏向量后,就可以通过简单的点积进行距离计算,即将相同单词上的值对应相乘再求和,通过稀疏向量计算距离的方式如下所示:

上述计算方式本质上是通过点积来计算的,score 越大表示越相似,如果需要结合Dense Vector一起进行距离度量时,需要对齐距离度量方式。也就是说,在结合Dense Vector+Sparse Vector的场景中,距离计算只支持点积度量方式。

如何自训练模型

考虑到内置的BM25 Model是基于通用语料(中文Wiki语料)训练得到,在特定领域下通常不能表现出最佳的效果。因此,在一些特定场景下,通常建议训练自定义BM25模型。使用DashText来训练自定义模型时一般需要遵循以下步骤:

Step1:确认使用场景

当准备使用SparseVector来进行信息检索时,应提前考虑当前场景下的Query以及Document来源,通常需要提前准备好一定数量Document来入库,这些Document通常需要和特定的业务场景直接相关。

Step2:准备语料

根据BM25原理,语料直接决定了BM25模型的参数。通常应按照以下几个原则来准备语料:

  • 语料来源应尽可能反映对应场景的特性,尽可能让 N(qi能够反映对应真实场景的词频信息。

  • 调节合理的语料切片长度和切片数量,避免出现语料当中只有少量长文本的情况。

一般情况下,如无特殊要求或限制,可以直接将Step1准备的一系列Document组织为语料即可。

Step3:准备Tokenizer

Tokenizer决定了分词的结果,分词的结果则直接影响Sparse Vector的生成,在特定领域下使用自定义Tokenizer会达到更好的效果。DashText提供了两种扩展Tokenizer的方式:

  • 使用自定义词表:DashText内置的Jieba Tokenizer支持传入自定义词表。(Java SDK暂不支持该功能)

Python示例:

from dashtext import TextTokenizer, SparseVectorEncodermy_tokenizer = TextTokenizer.from_pretrained(model_name='Jieba', dict='dict.txt')
my_encoder = SparseVectorEncoder(tokenize_function=my_tokenizer.tokenize)
  • 使用自定义Tokenizer:DashText支持任务自定义的Tokenizer,只需提供一个符合Callable[[str], List[str]]签名的Tokenize函数即可。

Python示例:

from dashtext import SparseVectorEncoder
from transformers import BertTokenizermy_tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
my_encoder = SparseVectorEncoder(tokenize_function=my_tokenizer.tokenize)

Step4:训练模型

实际上,这里的“训练”本质上是一个“统计”参数的过程。由于训练自定义模型的过程中包含着大量Tokenizing/Hashing过程,所以可能会耗费一定的时间。DashText提供了SparseVectorEncoder.train接口可以用来训练模型。

Step5:调参优化(可选)

模型训练完成后,可以准备部分验证数据集以及通过微调 k和 来达到最佳的召回效果。调节k1和b一般需要遵循以下原则:

  • 调节k(1.2 < k< 2)可控制Document词频对Score的影响,k越大Document的词频对Score的贡献越小。

  • 调节(0 < b < 1)可控制文档长度对Score的影响,越大表示文档长度对权重的影响越大

一般情况下,如无特殊要求或限制,不需要调整 k和 b

Step6:Finetune模型(可选)

实际场景下,可能会存在需要补充训练语料来增量式地更新BM25模型参数的情况。DashText的SparseVectorEncoder.train接口原生支持模型的增量更新。需要注意的是,模型更改之后,使用旧模型进行编码并已入库的向量就失去了时效性,一般需要重新入库。

示例代码

以下是一个简单完整的自训练模型示例。

Python示例:

from dashtext import SparseVectorEncoder
from pydantic import BaseModel
from typing import Dict, Listclass Result(BaseModel):doc: strscore: floatdef calculate_score(query_vector: Dict[int, float], document_vector: Dict[int, float]) -> float:score = 0.0for key, value in query_vector.items():if key in document_vector:score += value * document_vector[key]return score# 创建空SparseVectorEncoder(可以设置自定义Tokenizer)
encoder = SparseVectorEncoder()# step1: 准备语料以及Documents
corpus_document: List[str] = ["The quick brown fox rapidly and agilely leaps over the lazy dog that lies idly by the roadside.","Never jump over the lazy dog quickly","A fox is quick and jumps over dogs","The quick brown fox","Dogs are domestic animals","Some dog breeds are quick and jump high","Foxes are wild animals and often have a brown coat",
]# step2: 训练BM25 Model
encoder.train(corpus_document)# step3: 调参优化BM25 Model
query: str = "quick brown fox"
print(f"query: {query}")
k1s = [1.0, 1.5]
bs = [0.5, 0.75]
for k1, b in zip(k1s, bs):print(f"current k1: {k1}, b: {b}")encoder.b = bencoder.k1 = k1query_vector = encoder.encode_queries(query)results: List[Result] = []for idx, doc in enumerate(corpus_document):doc_vector = encoder.encode_documents(doc)score = calculate_score(query_vector, doc_vector)results.append(Result(doc=doc, score=score))results.sort(key=lambda r: r.score, reverse=True)for result in results:print(result)# step4: 选择最优参数并保存模型
encoder.b = 0.75
encoder.k1 = 1.5
encoder.dump("./model.json")# step5: 后续使用时可以加载模型
new_encoder = SparseVectorEncoder()
bm25_model_path = "./model.json"
new_encoder.load(bm25_model_path)# step6: 对模型进行finetune并保存
extra_corpus: List[str] = ["The fast fox jumps over the lazy, chubby dog","A swift fox hops over a napping old dog","The quick fox leaps over the sleepy, plump dog","The agile fox jumps over the dozing, heavy-set dog","A speedy fox vaults over a lazy, old dog lying in the sun"
]new_encoder.train(extra_corpus)
new_bm25_model_path = "new_model.json"
new_encoder.dump(new_bm25_model_path)

API参考

DashText API详情可参考:dashtext · PyPI

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

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

相关文章

四川赤橙宏海商务信息咨询有限公司正规吗?

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。作为这一潮流的佼佼者&#xff0c;抖音电商以其独特的短视频直播模式&#xff0c;吸引了大量消费者和商家的目光。在这一背景下&#xff0c;四川赤橙宏海商务信息咨询有限公司应运而生&#xff0c;…

2Y0A21 GP2Y0A21YK0F 红外测距传感器 arduino使用教程

三根线 正极负极信号线 确认自己的三根线分别代表什么&#xff0c;我们的颜色可能不一样 附一张我买的传感器他们的说明图 正极 接 开发板5V 负极 接开发板GND 信号线 接A0 代码arduino ide上面写 // Infračerven senzor vzdlenosti Sharp 2Y0A21// připojen potře…

2024最新AI大模型-LLm八股合集(三)

常见的大模型 1.ChatGLM 1.1 背景 主流的预训练框架主要有三种&#xff1a; autoregressive自回归模型&#xff08;AR模型&#xff09; &#xff1a;代表作GPT。本质上是一个left-to-right的语言模型。 通常用于生成式任务 &#xff0c;在长文本生成方面取得了巨大的成功…

【x264】整体框架汇总

【x264】整体框架汇总 1. x264整体框架图2. 思考 参考&#xff1a; x264源代码简单分析&#xff1a;概述 参数分析&#xff1a; 【x264】x264编码器参数配置 流程分析&#xff1a; 【x264】x264编码主流程简单分析 【x264】编码核心函数&#xff08;x264_encoder_encode&…

空气流量和空气压力参数解耦系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 空气流量和空气压力参数解耦系统simulink建模与仿真&#xff0c;在许多系统中&#xff0c;空气流量&#xff08;Q&#xff09;和压力&#xff08;P&#xff09;之间存在耦合关…

SpringBoot + thymeleaf 修改文件,刷新页面不能实时展示修改后的内容问题解决

修改页面后文件后&#xff0c;刷新页面&#xff0c;内容不变&#xff0c;是因为项目没有编译&#xff0c;没有将新的页面文件编译&#xff0c;以下方法可以完美解决次问题 具体内容请查看&#xff1a;http://www.haozgx.top/blog/article/2

vue element-ui 车牌号选择组件

实现效果 carnumber.vue <template><div class"car_no_popover"><div class"row_div"><div class"every_div" v-for"item in area"><button click"selectCarNo(item)">{{ item }}</butto…

绿色免费离线版JS加密混淆工具 - 支持全景VR加密, 小程序js加密, H5网站加密

自从我们推出在线版的免费JS加密混淆工具以来&#xff0c;受到了广大用户的热烈欢迎。特别是全景开发人员&#xff0c;他们使用该工具加密VR插件的JS代码, 添加域名锁等&#xff0c;都非常有效地保护了插件的代码资源。 最近&#xff0c;我们收到了许多用户的反馈&#xff0c;…

Cloneable接口和对象的克隆——浅拷贝和深拷贝

用Clonable接口实现对象的克隆——浅拷贝和深拷贝 1. 浅拷贝2. 深拷贝 在Object类中提供了clone方法&#xff0c;用来是实现对象的克隆&#xff01; 1. 浅拷贝 我们首先来尝试用clone方法去克隆一个Person对象 public class Person {public String name;public int age;publi…

Perforce静态代码分析专家解读MISRA C++:2023®新标准:如何安全、高效地使用基于范围的for循环,防范未定义行为

MISRA C&#xff1a;2023——MISRA C 标准的下一个版本来了&#xff01;为了帮助您了解 MISRA C&#xff1a;2023相比于之前版本的变化&#xff0c;我们将继续为您带来Perforce首席技术支持工程师Frank van den Beuken博士的博客系列&#xff0c;本期为第三篇。 在前两篇系列文…

企业为何需要搭建线上虚拟品牌展厅?

在数字化时代&#xff0c;线上虚拟品牌展厅已成为企业不可或缺的一部分。以下是构建线上虚拟品牌展厅的4大关键理由&#xff1a; 1、迎合在线购物趋势 随着移动互联网的飞速发展和普及&#xff0c;消费者越来越倾向于在线购物。一个线上虚拟品牌展厅能够完美地满足这一需求&am…

数据分析必备:一步步教你如何用matplotlib做数据可视化(5)

1、Matplotlib Multiplots 在本章中&#xff0c;我们将学习如何在同一画布上创建多个子图。 subplot()函数返回给定网格位置的axes对象。此函数的签名是 plt.subplot(subplot(nrows, ncols, index)在当前图中&#xff0c;该函数创建并返回一个Axes对象&#xff0c;在ncolsaxe…

VScode如何调试

调试 1.打断点 1.点击调试按钮 3.点击下拉选择环境node&#xff0c;点击绿三角选择输入调试的命令&#xff08;具体命令查看package.json中scripts中的哪一个命令和运行的文件&#xff09;&#xff0c;点击右边的设置&#xff08;可以直接跳下面第八步&#xff01;&#xff…

EOS Black灵魂回响黑色账号注册 EOS Black怎么注册账号教程

又一款新的MMORPG游戏即将上线&#xff0c;游戏名称叫做《灵魂回响&#xff1a;黑色》&#xff0c;游戏继承了《灵魂回响》系列的基本世界观和背景故事&#xff0c;从危险中救出来的阿尔卡纳们沉醉于权力开始堕落, 少数阿尔卡纳还没有忘记自己的本分,为净化世界而努力&#xff…

[大模型]MiniCPM-2B-chat WebDemo部署

MiniCPM-2B-chat 介绍 MiniCPM 是面壁智能与清华大学自然语言处理实验室共同开源的系列端侧大模型&#xff0c;主体语言模型 MiniCPM-2B 仅有 24亿&#xff08;2.4B&#xff09;的非词嵌入参数量。 经过 SFT 后&#xff0c;MiniCPM 在公开综合性评测集上&#xff0c;MiniCPM …

124M中国十大城市群规划范围数据

城市群是由若干个都市圈构成的广域城镇化形态&#xff0c;其内部应该包含若干个中心城市。 都市圈是指围绕某一个中心城市&#xff0c;即超大或特大城市的城镇化形态。 无论在体量还是在层级上&#xff0c;都市圈要低于城市群的概念。 现在&#xff0c;我们就来为你分享一下…

不入耳的蓝牙耳机平价推荐,五大爆款分析测评

开放式耳机在如今社会中已经迅速成为大家购买耳机的新趋势。它作为骨传导耳机&#xff0c;深受用户的喜爱&#xff0c;不仅可以随时感知周围环境&#xff0c;还提供了高质量的音效体验&#xff0c;对于热爱运动的人士而言&#xff0c;高品质的骨传导耳机无疑是首选。同时&#…

Spring是如何设计IOC容器的?BeanFactory ApplicationContext

BeanFactory是Spring框架中最底层的接口&#xff0c;用于实例化、配置和管理bean。它使用控制反转&#xff08;IOC&#xff09;模式&#xff0c;将对象的创建、管理和装配的职责从应用程序代码中转移给Spring容器。这样&#xff0c;应用程序代码就无需关心对象如何创建和装配&a…

卡本医疗VENUS登陆香港国际医疗展,探索全球医疗发展新机遇

由香港贸易发展局主办的第15届香港国际医疗及保健展、以及联合香港特别行政区政府举办的第四届亚洲医疗健康高峰论坛在中国香港圆满落幕。 香港国际医疗及保健展是亚太地区最具影响力的B2B医疗贸易展览会之一&#xff0c;辐射海内外市场&#xff0c;本次邀请了超过8500家买家以…

模型部署onnx入门

一、定义 1.定义 2. 环境安装 3. 案例 4. 可视化界面 5. 参考网址 6. 推理引擎 onnx Runtime 进行单张图片推理&#xff0c;本地部署 7. 推理引擎onnx Runtime 进行单张图片推理&#xff0c;调用摄像头获取画面 8. 推理引擎onnx Runtime 进行图片推理&#xff0c;调用摄像头获…