搭建一个根据语义相似度进行文本去重服务

embedded/2024/10/21 18:01:32/

背景

1、在做大模型训练的时候,我们需要进行数据集的处理,而很多情况下我们收集到的数据集会存在重复数据,针对去重,有两种,一种是完全重复,也就是数据集里面有一个A,还有存在了着另外一个A;还有一种重复是语义上面非常相似,比如“天龙八部”当前热度1800W,“天龙八部”当前热度1810W,其实这两个数据对训练/测试来说并没有什么特别的地方,所以作为这样的数据的处理,需要进行语义级别的去重

解决方案

利用SentenceTransformer框架来搭建一个语义搜索服务,也就是将待去重的文本内容,利用sentence embedding,然后根据向量计算余弦值,得出句子的相似度,然后利用util的semantic_search方法进行搜索

代码

import torch
from sentence_transformers import SentenceTransformer, utildef semanticTextualDeduplication_loop(lines, threshold):embedder = SentenceTransformer("/data/dh/model/LaBSE")corpus = []corpus.append(lines[0])corpus_embeddings = embedder.encode(corpus, convert_to_tensor=True)lines.pop(0)for line in lines:queries = [line]print('line: {0} and corpus.size: {1}'.format(line, len(corpus)))query_embedding = embedder.encode(queries, convert_to_tensor=True)if not semantic_search_exist(query_embedding, corpus_embeddings, threshold, line):corpus.append(line)print('before corpus_embeddings size: {0}'.format(len(corpus_embeddings)))# 沿着指定维度拼接张量corpus_embeddings = torch.cat((query_embedding, corpus_embeddings), dim=0)print('end corpus_embeddings size: {0}'.format(len(corpus_embeddings)))return corpusdef semantic_search_exist(query_embedding, corpus_embeddings, threshold, query):hits = util.semantic_search(query_embedding, corpus_embeddings, top_k=1)hits = hits[0]hits = hits[0]score = hits['score']print('input: {0} and output: {1}'.format(query, hits['score']))if score > threshold:return Truereturn Falsecorpus = ["A man is riding a horse.","A woman is playing violin.","Two men pushed carts through the woods.","A man is riding a white horse on an enclosed ground.","A monkey is playing drums.","A cheetah is running behind its prey.",
]result = semanticTextualDeduplication_loop(corpus, 0.9)print("result:", result)


http://www.ppmy.cn/embedded/41028.html

相关文章

Flink面试整理-Flink集群的部署方式有哪些?

Apache Flink 支持多种集群部署方式,以适应不同的运行环境和应用需求。主要的部署方式包括: 1. 独立部署(Standalone) 特点:Flink 自带的简单集群模式,不依赖于外部的集群管理系统。适用场景:适用于小规模集群、测试或者学习环境。配置:需要手动配置 JobManager 和 Tas…

[疑难杂症2024-004] 通过docker inspect解决celery多进程记录日志莫名报错的记录

本文由Markdown语法编辑器编辑完成. 写作时长: 2024.05.07 ~ 文章字数: 1868 1. 前言 最近我负责的一个服务,在医院的服务器上线一段时间后,利用docker logs查看容器的运行日志时,发现会有一个"莫名其妙"的报错&…

【循环程序设计-谭浩强适配】(适合专升本、考研)

无偿分享学习资料,需要的小伙伴评论区或私信dd。。。 无偿分享学习资料,需要的小伙伴评论区或私信dd。。。 无偿分享学习资料,需要的小伙伴评论区或私信dd。。。 完整资料如下:纯干货、纯干货、纯干货!!…

【class5】建立人工智能系统(2)

【昨日内容复习】 进行监督学习时,第一个步骤是提取数据集的文本特征和对应的标签。 提取文本特征的具体步骤如下: STEP1. 构造词袋模型,提取数据集中的文本特征 STEP2. 使用toarray()函数,将X转换为一个NumPy数组,方…

设置nohup java -jar命令将日志写入test.log文件

命令: nohup java -jar YourApp.jar > test.log 2>&1 &这个命令执行以下操作: nohup: 让命令在后台运行,不受终端关闭的影响。java -jar YourApp.jar: 启动 Java 应用程序。“> test.log”: 将标准输出重定向到 test.log …

HTML批量文件上传3—Servlet批量文件处理FileUpLoad

作者:私语茶馆 1.开源的文件上传组件介绍 本文使用的是Apache Commons下面的一个子项目FileUpload,另外一个常见组件是SmartUpload。FileUpload遵循RFC 1897,即“Form-based File Upload in HTML”,对于请求需要满足:HTTP协议,Post请求,content Type=“multipart/form-d…

PHP 匿名函数和闭包在数据结构中的应用

匿名函数和闭包在数据结构处理中的应用php 中的匿名函数和闭包可用于处理数组、链表和队列等数据结构。针对数组,匿名函数可用于过滤元素;针对链表,闭包可用于创建节点;针对队列,匿名函数和闭包可实现 fifo 队列操作。…

springmvc核心流程

核心流程及配置 核心流程 执行流程 用户发送请求到DispatcherServlet前端控制器,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制 DispatcherServlet调用HandlerMapping映…