基于语义的NLP任务去重:大语言模型应用与实践

引言

在自然语言处理(NLP)任务中,数据质量是模型性能的关键因素之一。重复或冗余的数据会导致模型过度拟合或浪费计算资源,特别是在大语言模型(如 BERT、GPT 系列等)训练和推理阶段。传统的基于字符匹配的去重方法(如字符串哈希或编辑距离)在面对语义相似的文本时表现有限,而语义相似度算法则能更好地捕获文本之间的深层语义关系。

本文将介绍一种基于语义表示的去重方法,通过大语言模型生成的嵌入向量结合高效的相似度计算工具(如 FAISS),对大规模文本数据进行去重。此方法不仅适用于数据清洗,还可以应用在搜索引擎、推荐系统等需要衡量语义相似度的场景。

原理与方法

1. 传统去重方法的局限性

在 NLP 任务中,传统的去重方法包括:

  • 字符串哈希:
    基于文本的哈希值进行判重,适合完全重复的文本,但无法处理语义相似但表达不同的情况,例如:
    • 文本 A:我喜欢吃苹果。
    • 文本 B:苹果是我最喜欢的水果。

虽然两者语义相近,但哈希值完全不同。

  • 编辑距离(Levenshtein Distance):
    衡量两个字符串的编辑代价,适合处理少量字符差异的文本,但无法捕捉深层语义关系。

上述方法对文本的语义相似性缺乏鲁棒性,特别是在短文本或同义表达常见的场景下。例如,问答生成、文档去重、语料清洗等任务中,语义相似的重复数据可能会严重影响模型性能。

2. 基于语义嵌入的去重

语义嵌入(Semantic Embedding)是一种将文本映射到高维向量空间的技术,向量的物理距离或角度可以反映文本语义的相似程度。常见的嵌入生成模型包括:

  • BERT、RoBERTa、GPT 等大语言模型:能够生成上下文相关的语义表示。
  • Sentence-BERT(SBERT):专为语义相似度任务设计,提升了嵌入的语义表达能力。

基本流程:

    1. 文本嵌入生成:
      使用大语言模型将文本转化为固定维度的向量表示(如 768 维)。
    1. 相似度计算:
      通过数学距离(如余弦相似度或内积)衡量文本向量之间的相似性。
    1. 去重判断:
      基于相似度阈值判断文本是否为重复内容。

3. 相似度计算方法对比

在语义嵌入的基础上,常用的相似度计算方法包括:

3.1. 余弦相似度(Cosine Similarity)

余弦相似度衡量两个向量的夹角余弦值,范围为 [ − 1 , 1 ] [-1, 1] [1,1],归一化后范围为 [ 0 , 1 ] [0, 1] [0,1]。公式如下:
Cosine Similarity ( A , B ) = A ⋅ B ∥ A ∥ ∥ B ∥ \text{Cosine Similarity}(A, B) = \frac{A \cdot B}{\|A\| \|B\|} Cosine Similarity(A,B)=A∥∥BAB

  • 优点:消除向量模长的影响,只关注向量方向。
  • 缺点:计算开销稍高。
3.2. 内积相似度(Inner Product Similarity)

内积相似度直接计算两向量的点积值:
Inner Product ( A , B ) = A ⋅ B \text{Inner Product}(A, B) = A \cdot B Inner Product(A,B)=AB

  • 优点:计算简单,速度快。
  • 缺点:受向量模长影响,需要确保输入向量已归一化(模长为 1),否则结果不等价于余弦相似度。
欧几里得距离(Euclidean Distance)

衡量两个向量在高维空间中的直线距离:
Euclidean Distance ( A , B ) = ∑ i = 1 n ( A i − B i ) 2 \text{Euclidean Distance}(A, B) = \sqrt{\sum_{i=1}^n (A_i - B_i)^2} Euclidean Distance(A,B)=i=1n(AiBi)2

  • 优点:适合绝对位置相关的任务。
  • 缺点:不适合捕获方向性的语义相似度。

4. 高效的大规模相似度计算

直接比较所有嵌入向量的相似度在大规模数据中效率低下(复杂度为 O ( n 2 ) O(n^2) O(n2))。为此,我们借助 FAISS(Facebook AI Similarity Search)工具,能够在百万级甚至亿级数据中高效实现近似最近邻搜索。

4.1. FAISS 简介

FAISS 是一个高效的相似度搜索库,专为高维向量的最近邻搜索设计,支持以下特性:

  • 多种索引结构:
    • Flat:暴力搜索,适合中小规模数据。
    • IVF(倒排文件索引):适合大规模数据。
    • PQ(分组量化):进一步压缩内存占用。
  • GPU 加速:支持 GPU 版本,在大规模数据上极大提升搜索速度。
  • 灵活的距离度量:支持内积、余弦、欧几里得距离等。
4.2. 使用 FAISS 的语义去重流程
  1. 初始化 FAISS 索引:选择适合任务的数据结构(如 IndexFlatIP)。
  2. 添加向量:将嵌入向量添加到索引。
  3. 查询相似度:对每个新向量,查找与索引中最近的向量,判断是否重复。

代码实现

import json
from transformers import BertTokenizer, BertModel
import torch
from tqdm import tqdm
import faiss
from typing import List, Dict, Unionclass TextDeduplicatorWithFAISS:"""使用 FAISS 索引实现的文本去重类(基于余弦相似度)。"""def __init__(self, model_name: str = 'bert-base-chinese', device: str = None) -> None:"""初始化文本去重类。参数:- model_name: 使用的预训练模型名称,默认为 'bert-base-chinese'。- device: 指定运行设备('cpu' 或 'cuda'),默认为自动检测。"""self.tokenizer = BertTokenizer.from_pretrained(model_name)self.model = BertModel.from_pretrained(model_name)self.device = device if device else ('cuda' if torch.cuda.is_available() else 'cpu')self.model = self.model.to(self.device)# 初始化 FAISS 索引self.embedding_dim = 768  # BERT 输出嵌入维度self.index = faiss.IndexFlatIP(self.embedding_dim)  # 使用内积(IP)作为相似度度量self.index_ids = []  # 存储对应嵌入的 ID,方便后续处理def get_embeddings(self, texts: List[str]) -> torch.Tensor:"""计算文本的嵌入表示,并进行归一化。参数:- texts: 要计算嵌入的一组文本列表。返回:- 归一化后的文本嵌入张量,形状为 (batch_size, hidden_size)。"""inputs = self.tokenizer(texts, return_tensors="pt", padding=True, truncation=True, max_length=512)inputs = inputs.to(self.device)  # 将输入张量移动到指定设备with torch.no_grad():  # 禁用梯度计算以节省内存outputs = self.model(**inputs)embeddings = outputs.last_hidden_state[:, 0, :].cpu()  # 获取 [CLS] 的嵌入并移动到 CPU# 对嵌入进行归一化处理(实现余弦相似度)embeddings = embeddings / torch.norm(embeddings, dim=1, keepdim=True)return embeddingsdef is_duplicate(self, embedding: torch.Tensor, threshold: float = 0.9) -> bool:"""检查一个嵌入是否与 FAISS 索引中的嵌入重复。参数:- embedding: 待检查的嵌入向量,形状为 (1, hidden_size)。- threshold: 相似度的阈值,默认为 0.9。返回:- 是否为重复项(True / False)。"""if self.index.ntotal == 0:  # 如果索引为空,肯定不是重复return False# 通过 FAISS 查找最近的向量及其相似度embedding_np = embedding.numpy()  # 转为 NumPy 格式distances, _ = self.index.search(embedding_np, k=1)  # 查找最近的 1 个向量# 检查最近向量的相似度是否高于阈值max_similarity = distances[0][0]  # FAISS 返回的是归一化向量的内积(等价于余弦相似度)return max_similarity >= thresholddef add_to_index(self, embedding: torch.Tensor, doc_id: int) -> None:"""将新的嵌入添加到 FAISS 索引中。参数:- embedding: 要添加的嵌入向量,形状为 (1, hidden_size)。- doc_id: 该嵌入对应的文档 ID。"""embedding_np = embedding.numpy()  # 转为 NumPy 格式self.index.add(embedding_np)  # 添加到索引中self.index_ids.append(doc_id)  # 保存对应的文档 IDdef process_and_save(self, input_path: str, output_path: str, threshold: float = 0.9) -> None:"""处理输入文件,去除相似文本并保存到输出文件。参数:- input_path: 输入 JSONL 文件路径。- output_path: 输出 JSONL 文件路径。- threshold: 去重的相似度阈值,默认值为 0.9。"""doc_id = 0  # 用于标记每条文档的唯一 IDwith open(input_path, 'r', encoding='utf-8') as infile, open(output_path, 'w', encoding='utf-8') as outfile:for line in tqdm(infile, desc="Processing lines"):item: Dict[str, Union[str, int, float]] = json.loads(line)  # 从 JSONL 文件中读取一条数据output_text: str = item['output']  # 获取文本内容# 获取当前文本的嵌入current_embedding = self.get_embeddings([output_text])# 检查是否为重复if not self.is_duplicate(current_embedding, threshold):# 如果不重复,保存文本,并将嵌入添加到索引outfile.write(json.dumps(item, ensure_ascii=False) + '\n')self.add_to_index(current_embedding, doc_id)doc_id += 1# 使用示例
if __name__ == "__main__":# 初始化去重器deduplicator = TextDeduplicatorWithFAISS(model_name='bert-base-chinese')# 去重并保存结果deduplicator.process_and_save(input_path='=./processed_unique_data-5.jsonl',output_path='=./processed_unique_data-6.jsonl',threshold=0.95)

数据示例:

{"id": 1, "output": "什么是人工智能?人工智能是指让机器具备人类智能的技术。"}
{"id": 2, "output": "人工智能的定义是什么?人工智能是赋予机器类似人类智能的能力。"}

总结

本文介绍了一种基于语义嵌入的大规模文本去重方法,通过结合大语言模型(如 BERT)和高效相似度搜索工具(FAISS),实现了对语料库的语义级去重。该方法具有以下优点:

  • 高精度:捕捉语义相似性,避免遗漏同义表达的重复数据。
  • 高扩展性:支持大规模数据处理,适用于百万级文本的去重任务。
  • 通用性强:不仅适用于去重,还可扩展至相似文本检索、推荐系统等任务。

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

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

相关文章

【5G】5G 无线协议 Radio Protocols(一)

长期演进(LTE)无线电协议主要设计用于通过扁平架构提供PS服务,相比之前的代际,这代表了一个重大改进,它消除了支持电路交换(CS)服务和复杂架构中固有的复杂性。许多原始的LTE原则自第8版以来一直…

VMware ubuntu虚拟机网络配置

首先分清2个情况: 1、在使用笔记本时,WiFi联网使用时,使用的是无线网卡设备上网的。 2、无论是笔记本还是台式机,当接插网线上网时,使用的是以太网卡设备上网的。 以Windows11为例: (1&#x…

springboot 与 oauth2 版本对应关系

以 springboot 稳定版本举例 jdkspringbootspring-authorization-server82.7.180.4.5173.0.131.0.5173.1.12开始支持 starter pom 依赖 <!-- 当前 boot 版本不支持 starter 时引入固定版本 --> <dependency><groupId>org.springframework.security</…

Y3编辑器教程7:界面编辑器

文章目录 一、简介1.1 导航栏1.2 画板1.3 场景界面1.4 控件1.4.1 空节点1.4.2 按钮1.4.3 图片1.4.4 模型1.4.5 文本1.4.6 输入框1.4.7 进度条1.4.8 列表 1.5 元件1.5.1 简介1.5.2 差异说明1.5.3 元件实例的覆盖、还原与禁止操作1.5.4 迷雾控件 1.6 属性1.7 事件&#xff08;动画…

分享一个把表格类型的数据转换成字符串,以表格样式输出,方便控制台和日志记录时更直观

调用实例&#xff1a; Console.WriteLine("Hello, World!");List<string[]> tabLog new List<string[]>(); tabLog.Add(new string[] { "编号", "姓名", "性别", "年龄","备注" }); tabLog.Add(new…

如何有效修复ffmpeg.dll错误:一站式解决方案指南

当您遇到提示“ffmpeg.dll文件丢失”的错误时&#xff0c;这可能导致相关的应用程序无法启动或运行异常。本文将详细介绍如何有效地解决ffmpeg.dll文件丢失的问题&#xff0c;确保您的应用程序能够恢复正常运行。 ffmpeg.dll是什么&#xff1f;有哪些功能&#xff1f; ffmpeg.…

精通Redis(一)

目录 1.NoSQL 非关系型数据库 2.Redis 3.Redis的java客户端 4.Jedis 4.1Jedis快速入门 4.2Jedis连接池及使用 5.SpringDataRedis和RedisTemplate 1.NoSQL 非关系型数据库 基础篇-02.初始Redis-认识NoSQL_哔哩哔哩_bilibili NoSQL与SQL的区别就在于SQL是结构化的、关联…

Arm Cortex-M处理器对比表

Arm Cortex-M处理器对比表 当前MCU处理器上主要流行RISC-V和ARM处理器&#xff0c;其他的内核相对比较少&#xff1b;在这两种内核中&#xff0c;又以Arm Cortex-M生态环境相对健全&#xff0c;大部分的厂家都在使用ARM的处理器。本文主要介绍Arm Cortex-M各个不同系列的参数对…

前端TypeScript学习day03-TS高级类型

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 TypeScript 高级类型 class 类 class继承? extends implements? 类成员可见性? public? protect…

pyQt5基本需求v1.0

TOC(需求界面) 1.主界面介绍 首先展示项目名称&#xff0c;几个文件上传按钮&#xff0c;滑动条&#xff0c;页面切换按钮&#xff0c;系统时间展示。 2.具体页面demo 2.下期预告 视频页面的各种逻辑展示&#xff0c;大家可以先思考一下

2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程

2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程 产品介绍 仿东郊到家约玩系统是一种新兴的线上预约&#xff0c;线下社交、陪伴、助娱、助攻、分享、解答、指导等服务模式&#xff0c;范围涉及电竞、运动、音乐…

Android Stduio 2024版本设置前进和后退按钮显示在主界面

Android Studio 2024&#xff08;Ladybug&#xff09;安装后发现前进和后退按钮不显示在主界面的工具栏&#xff0c;且以前在View中设置的办法无效&#xff1a; Android Studio 2024&#xff08;Ladybug&#xff09;的设置方式&#xff1a; File->Settings->Appearance&…

4、交换机IP接口功能

这一篇是讲端口的功能的&#xff0c;应该放在路由前面的&#xff0c;不过关联不大&#xff0c;就这个顺序也行 1、DHCP功能 作用&#xff1a;交换机端口的DHCP功能可以使网络中的设备&#xff08;计算机、打印机等等&#xff09;能够自动的获取IP地址或其它网络参数&#xff0…

Chapter 02 Python基础-1

1.Python语法 1.变量 从实例看Python代码&#xff1a; 输入圆的半径&#xff0c;计算圆面积&#xff0c;若面积大于等于10&#xff0c;则输出具体数值&#xff0c;若面积小于10&#xff0c;则只输出整数值。 分析&#xff1a; 1.圆面积计算需要用到PI&#xff0c;取什么样的…

Go web 开发框架 Iris

背景 掌握了 Go 语言的基础后就该开始实践了&#xff0c;编写Web应用首先需要一个 web 开发框架。做框架选型时&#xff0c;处理web请求是基本功能&#xff0c;至于MVC是更进一步需要。现在比较流行的web架构是前后端分离&#xff0c;后端响应RESTful的请求&#xff0c;Iris 能…

Python 助力 DBA:高效批量管理数据库服务器的多线程解决方案-多库查询汇总工具实现

批量数据库服务器连接测试与数据汇总&#xff1a;Python实现方案 作为数据库服务器运维人员&#xff0c;我们经常需要面对大量服务器的连接测试和数据汇总工作。本文将介绍一个使用Python实现的高效解决方案&#xff0c;可以帮助我们快速完成这些任务。 需求概述 从配置文件…

vue预览和下载 pdf、ppt、word、excel文档,文件类型为链接或者base64格式或者文件流,

** 方法1&#xff1a;word、xls、ppt、pdf 这些文件&#xff0c; 如果预览的文件是链接可以直接打开&#xff0c;可用微软官方的预览地址 ** <iframe width"100%" :src"textVisibleURl " id"myFramePPT" style"border: none;backgroun…

python elasticsearch_dsl PIT Point in time API 查询

默认情况下&#xff0c;搜索请求针对目标索引的最新可见数据&#xff08;称为时间点&#xff09;执行。elasticsearchpit&#xff08;时间点&#xff09;是一种轻量级视图&#xff0c;可以查看数据在启动时的状态。在某些情况下&#xff0c;最好使用同一时间点执行多个搜索请求…

OB删除1.5亿数据耗费2小时

目录 回顾&#xff1a;mysql是怎么删除数据的&#xff1f; 删除方案 代码实现 执行结果 结论 本篇是实际操作 批量处理数据以及线程池线程数设置 记录学习 背景&#xff1a;有一张用户标签表&#xff0c;存储数据量达4个亿&#xff0c;使用OceanBase存储&#xff0c;由于…

【2025最新计算机毕业设计】基于SSM框架的宠物领养系统【提供源码+答辩PPT+文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…