simbertmilvus实现相似句检索

news/2024/11/23 10:02:21/

       朋友们,simbert模型是一个较好的相似句检索模型,但是在大规模检索中,需要实现快速检索,这个时候离不开milvus等向量检索库,下面用实际代码来讲一下simbert之milvus应用。 

import numpy as np
from bert4keras.backend import keras, K
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer
import tensorflow as tf
from openapi_server.models.sentence_schema import SentenceSchema
from openapi_server.models.QaVecSchema import QaVecSchema
import connexion
from mysql_tool.connection import DBHelper
from config.loadconfig import get_logger
from milvus import Milvus, IndexType, MetricType, Status
import random
from bert4keras.snippets import sequence_padding
from apscheduler.schedulers.background import BackgroundScheduler
import datetime
import os

 

logger = get_logger(__name__)
global graph
graph = tf.get_default_graph()
sess = keras.backend.get_session()
# 获取绝对目录上上级目录
upper2path = os.path.abspath(os.path.join(os.getcwd()))
# bert配置
config_path =   "/Users/Downloads/data/model/chinese_simbert_L-6_H-384_A-12/bert_config.json"
checkpoint_path =  "/Users/Downloads/data/model/chinese_simbert_L-6_H-384_A-12/bert_model.ckpt"
dict_path =  "/Users/Downloads/data/model/chinese_simbert_L-6_H-384_A-12/vocab.txt"
# 建立分词器
tokenizer = Tokenizer(dict_path, do_lower_case=True)

 

# 建立加载模型
bert = build_transformer_model(config_path,checkpoint_path,with_pool='linear',application='unilm',return_keras_model=False,
)# 加载编码器
encoder = keras.models.Model(bert.model.inputs, bert.model.outputs[0])

 

向量入库:

def qa2vecs():collection_reconstruct()data = qa_query()milvus, collection_name = MilvusHelper().connection()param = {'collection_name': collection_name,'dimension': 384,'index_file_size': 256,  # optional'metric_type': MetricType.IP  # optional}milvus.create_collection(param)vecs = []ids = []progress_idx = 0with sess.as_default():with graph.as_default():for record in data:progress_idx += 1token_ids, segment_ids = tokenizer.encode(record["text"])vec = encoder.predict([[token_ids], [segment_ids]])[0]vecs.append(vec)ids.append(record["id"])if (len(ids) % 5000 == 0 or progress_idx == len(data)) and len(ids) > 0:logger.info("data sync :{:.2f}%".format(progress_idx * 100.0 / len(data)))milvus.insert(collection_name=collection_name, records=vecs_normalize(vecs), ids=ids, params=param)vecs = []ids = []milvus.close()return progress_idx

 上面的向量入库的时候,文本的id和text都存了,milvus里面有id->text的向量,所以最终检索的时候,能够同时拿到vector和id,然后id去mysql里面找即可。


http://www.ppmy.cn/news/102599.html

相关文章

软件设计师总结-含括学习方法和学习过程,可参考

目录 考前备战宏观    心路历程-感受    学习阶段-计划的安排 微观一、课本和视频的学习    本阶段的目的:    侧重点    涉及的学习方法(最后有如何使用这些方法)    学习结果 二、32小时通关辅助前面的知识点    本阶段的…

Python3数据分析与挖掘建模(4)集中趋势与离中趋势、数据分布与抽样

分析理论是统计学和数据分析中的重要概念,它们用于描述和理解数据的集中趋势、离中趋势、数据分布以及抽样理论。下面是对这些概念的简要说明: 集中趋势: 均值、中位数与分位数、众数离中趋势:标准差、方差数据分布:偏…

财务共享服务中心建设流程是什么样的?

财务共享是当今众多企业在数智化转型道路上的首选模式,财务共享服务中心由于具备“标准化、流程化、资源共享、信息化”的特点,一改传统财务分散的运作模式,将资源集中共享,大大提升了财务管理效率,也为企业管理打下良…

机器学习算法

机器学习擅长的任务: ● 回归(regression) ● 分类(classification) ● 聚类(clustering) 1.回归(regression) 回归是处理连续数据时使用的方法,如时间序列数据。 …

如何创建新一代Web3企业

日前,我们对话了Sui基金会的增长负责人Koh Kim,对如何成功构建持续发展的企业等话题展开讨论。 您在Sui基金会的工作重点帮助开发者,让他们从产品开发的早期阶段成长为强大且具有潜力的企业领导者。可以简单分享一下您为此目标创建的计划吗&…

微信小程序基础功能及技术栈实现介绍

微信小程序基础功能及技术栈实现介绍 番茄钟功能: 前端(Vant Weapp):使用Vant Weapp提供的倒计时组件或者自己开发一个正计时的组件来实现计时功能,同时可以用它的列表、排行榜组件等来展示各科目的学习时间和学习时长…

Java中的设计模式有哪些

1. 你所知道的设计模式有哪些 Java 中一般认为有 23 种设计模式,我们不需要所有的都会,但是其中常用的几种设计模式应该去掌握。下面列出了所有的设计模式。需要掌握的设计模式我单独列出来了,当然能掌握的越多越好。 总体来说设计模式分为…

新手配iis

开始,服务器管理器 添加角色和功能 这一步直接跳过吧,别问我为啥,我也不知道 这一步默认的选项就可以,别问为啥,不知道 这一步也就默认的这个就行,这里的ip就是我本机的ip(我是虚拟机&#xff0…