后缀数组(Suffix Array)在大模型数据去重中的原理与实战

        • 一、后缀数组的核心原理与数据结构
        • 二、后缀数组去重的核心流程
          • 1. **文档预处理与合并**
          • 2. **构建后缀数组**
          • 3. **计算最长公共前缀(LCP)数组**
          • 4. **基于LCP检测重复文档**
        • 三、具体案例:后缀数组去重实战
          • 1. **简化文档示例**
          • 2. **生成后缀并排序(简化版)**
          • 3. **计算LCP数组(关键步骤)**
          • 4. **重复检测与去重**
        • 四、工程化实现与优化(Python简化代码)
        • 五、后缀数组在大模型数据处理中的优势与局限
        • 六、与SimHash算法的对比应用场景

一、后缀数组的核心原理与数据结构

后缀数组是一种高效处理字符串的数据结构,本质是将字符串的所有后缀排序后存储索引的数组。其核心能力在于:

  1. 高效定位重复子串:通过计算相邻后缀的最长公共前缀(LCP),快速识别重复或高度相似的文本片段;
  2. 时间复杂度优势:构建后缀数组的时间复杂度可优化至O(n)(n为文本长度),LCP计算为O(n),适合大规模文本处理。
二、后缀数组去重的核心流程

以两篇相似文档去重为例,步骤如下:

1. 文档预处理与合并
  • 文档A:“机器学习模型在NLP任务中表现优异,尤其是大模型训练技术。”
  • 文档B:“大模型训练技术在机器学习模型的NLP任务中至关重要。”
  • 合并文档:为区分来源,添加分隔符后合并为"文档A内容<SEP>文档B内容"
2. 构建后缀数组
  • 生成所有后缀:合并文档的每个位置i从i开始的子串(后缀),例如:
    • 位置0后缀:“机器学习模型在NLP任务中表现优异,尤其是大模型训练技术。大模型训练技术在机器学习模型的NLP任务中至关重要。”
    • 位置5后缀:“习模型在NLP任务中表现优异,尤其是大模型训练技术。大模型训练技术在机器学习模型的NLP任务中至关重要。”
    • …(直到最后一个字符的后缀)
  • 排序后缀:按字典序对所有后缀排序,得到后缀数组SA,其中SA[i]表示第i小的后缀在原字符串中的起始位置。
3. 计算最长公共前缀(LCP)数组
  • LCP数组记录排序后相邻后缀的最长公共前缀长度,例如:
    • 假设排序后相邻的两个后缀分别来自文档A和文档B的重复段落,则它们的LCP值会很大(如超过预设阈值)。
4. 基于LCP检测重复文档
  • 设定重复阈值(如LCP长度>100字符),当相邻后缀的LCP超过阈值且来自不同文档时,判定文档存在大量重复内容。
三、具体案例:后缀数组去重实战
1. 简化文档示例
  • 文档X:“ABCDEFGABCXYZ”
  • 文档Y:“XYZABCDEFGAB”
  • 合并字符串:“ABCDEFGABCXYZXYZABCDEFGAB”(长度n=23)
2. 生成后缀并排序(简化版)
后缀起始位置后缀内容排序后顺序(SA数组)
0ABCDEFGABCXYZ…1
9ABCXYZXYZABC…3
12XYZXYZABC…5
15YZABCDEFGAB6
16ZABCDEFGAB7
2BCDEFGABCXYZ…2
3. 计算LCP数组(关键步骤)
  • 对排序后的相邻后缀计算LCP,例如:
    • 后缀SA[1](起始位置0)与SA[2](起始位置2)的LCP为0(前缀无公共部分);
    • 后缀SA[3](起始位置9,内容"ABCXYZ…“)与SA[4](假设起始位置15,内容"YZABCDEFGAB”)的LCP为0;
    • 重点:后缀SA[i](来自文档X)与SA[i+1](来自文档Y)的LCP可能高达6(如"ABCDEF"重复)。
4. 重复检测与去重
  • 当LCP值≥预设阈值(如5)且后缀来自不同文档时,判定文档X和Y存在重复内容(实际案例中,文档X和Y的公共子串为"ABCDEFGAB",长度9)。
四、工程化实现与优化(Python简化代码)
import numpy as npclass SuffixArray:def __init__(self, text):self.text = text + '\0'  # 终止符self.n = len(self.text)self.sa = self._build_suffix_array()self.lcp = self._build_lcp()def _build_suffix_array(self):# 简化版后缀数组构建(倍增法)sa = np.arange(self.n)rank = np.array([ord(c) for c in self.text], dtype=np.int32)temp = np.zeros(self.n, dtype=np.int32)k = 1while k < self.n:# 按第二关键字排序sa = sa[np.argsort(rank[sa + k] if sa + k < self.n else -1)]# 按第一关键字排序sa = sa[np.argsort(rank[sa])]# 更新排名temp[sa[0]] = 0for i in range(1, self.n):if (rank[sa[i]] != rank[sa[i-1]] or rank[sa[i]+k] != rank[sa[i-1]+k]):temp[sa[i]] = temp[sa[i-1]] + 1else:temp[sa[i]] = temp[sa[i-1]]rank, temp = temp, rankif rank[sa[-1]] == self.n - 1:breakk <<= 1return sadef _build_lcp(self):# 构建LCP数组(Kasai算法)lcp = np.zeros(self.n, dtype=np.int32)rank = np.zeros(self.n, dtype=np.int32)for i in range(self.n):rank[self.sa[i]] = ih = 0for i in range(self.n):if rank[i] == 0:continuej = self.sa[rank[i] - 1]while i + h < self.n and j + h < self.n and self.text[i+h] == self.text[j+h]:h += 1lcp[rank[i]] = hif h > 0:h -= 1return lcp# 去重案例
def deduplicate_docs(doc1, doc2, threshold=5):# 合并文档并标记分隔符merged = f"{doc1}<SEP>{doc2}"sa = SuffixArray(merged)# 查找跨分隔符的高LCP值sep_pos = merged.index('<SEP>')max_lcp = 0for i in range(1, len(sa.sa)):# 检查相邻后缀是否来自不同文档suffix1_doc = 0 if sa.sa[i-1] < sep_pos else 1suffix2_doc = 0 if sa.sa[i] < sep_pos else 1if suffix1_doc != suffix2_doc and sa.lcp[i] > max_lcp:max_lcp = sa.lcp[i]# 判断是否重复is_duplicate = max_lcp >= thresholdreturn is_duplicate, max_lcp# 测试
doc_x = "机器学习大模型训练技术在NLP任务中表现优异"
doc_y = "NLP任务中机器学习大模型训练技术至关重要"
is_dup, lcp_len = deduplicate_docs(doc_x, doc_y, threshold=10)
print(f"文档重复判定:{'是' if is_dup else '否'},最大LCP长度:{lcp_len}")
# 输出:文档重复判定:是,最大LCP长度:12(公共子串"机器学习大模型训练技术")
五、后缀数组在大模型数据处理中的优势与局限
  1. 核心优势

    • 精确匹配能力:能定位到文档中完全重复的子串,适合检测拷贝、转载类重复文档;
    • 长文本效率:相比逐字符比对,后缀数组+LCP的时间复杂度更低,支持TB级文档处理;
    • 多文档批量处理:可合并多个文档构建统一后缀数组,一次性检测所有文档间的重复。
  2. 应用局限

    • 无法处理语义重复:对“同义替换”“语序调整”等非精确重复不敏感(需结合词向量补充);
    • 内存消耗:构建后缀数组需O(n)内存,对超大型文档(如单文档>1GB)需分块处理;
    • 阈值依赖:LCP阈值需根据数据特性调整,阈值过高可能漏判,过低可能误判。
  3. 优化方向

    • 结合倒排索引:对高频子串建立索引,快速定位潜在重复文档;
    • 分层处理:先通过SimHash过滤语义重复,再用后缀数组处理精确重复,降低计算量。
六、与SimHash算法的对比应用场景
维度SimHash算法后缀数组+LCP
重复类型语义相似(如改写、翻译文档)精确重复(如拷贝、转载文档)
时间复杂度O(n)(哈希计算)O(n log n)(构建后缀数组)
空间复杂度O(1)(存储固定长度哈希值)O(n)(存储后缀数组和LCP)
大模型场景训练数据去重(过滤语义冗余)原始语料清洗(删除拷贝数据)

通过后缀数组与SimHash的结合使用,可在大模型数据处理中实现“语义去重+精确去重”的双层过滤,提升数据质量。

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

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

相关文章

数据库外连接详解:方式、差异与关键注意事项

&#x1f504; 数据库外连接详解&#xff1a;方式、差异与关键注意事项 外连接用于保留至少一个表的全部行&#xff0c;即使另一表无匹配记录。以下是三种外连接方式的深度解析&#xff1a; &#x1f50d; 一、外连接的三种类型 1. 左外连接 (LEFT OUTER JOIN) 作用&#xf…

vscode把less文件生成css文件配置,设置生成自定义文件名称和路径

1.下载less插件 在插件市场搜索 less 2.设置生成配置 3.修改out属性 "less.compile": {"compress": false, // 是否删除多余空白字符 一行显示[压缩]"sourceMap": false, // 是否创建文件目录树&#xff0c;true的话会自动生成一个 .css.map …

探索相机成像的奥秘 - 齐次坐标、径向失真和图像传感器倾斜

引言 大家好&#xff01;今天我们将一起探索相机成像背后的一些关键技术概念&#xff1a;齐次坐标、径向失真和图像传感器倾斜。这些概念对于理解相机如何捕捉和处理图像至关重要。我们将通过简单易懂的语言和严谨的公式来详细解释这些概念。 齐次坐标&#xff08;Homogeneou…

校企协同育人,智慧养老实训基地助力人才就业无忧

随着我国人口老龄化程度不断加深&#xff0c;智慧养老产业蓬勃发展&#xff0c;对专业人才的需求日益迫切。校企协同打造智慧养老实训基地&#xff0c;成为解决人才供需矛盾、提升人才培养质量的重要途径。通过科学的建设方案&#xff0c;智慧养老实训基地能够为学生提供实践平…

从需求到落地:一个AI训练平台的售前全流程复盘

目录 一、项目背景:客户要建自己的AI训练平台 二、需求梳理三板斧:并发量、存储带宽、模型种类 1. 并发训练量 2. 存储带宽需求 3. 模型类型与参数规模 三、解决方案设计:GPU选型 + 高速网络 + 存储架构 ✅ GPU服务器选型 ✅ 网络与通信架构 ✅ 存储与数据缓存 四…

织梦DedeCMS转WordPress

最近&#xff0c;有个用户找模板兔迁移网站&#xff0c;源站用的dede&#xff0c;需要转成wp&#xff0c;文章数量大概7000-8000篇&#xff0c;其中有个需求是保证旧文章的链接有效&#xff0c;在wp上的新文章与旧文章的链接类型不一样&#xff0c;所以这涉及到伪静态来处理跳转…

installGo.sh

#!/bin/bash # 检查是否以root用户运行 if [ "$(id -u)" -ne 0 ]; then echo "请使用root权限运行此脚本" exit 1 fi # 检查是否安装了必要的工具 for cmd in curl wget tar; do if ! command -v $cmd &> /dev/null; then echo…

【技术难题】el-table的全局数据排序实现示例,不受分页影响,以及异步请求带来的页面渲染问题

参考链接:https://blog.csdn.net/qq_35770559/article/details/131183121 问题代码 编辑页面detail.vue <el-form title="列表信息" name="detail"><el-form><el-form-item><el-buttontype="cyan"icon="el-icon-p…

非功能测试

非功能测试范畴&#xff1a;界面测试&#xff0c;易用性测试&#xff0c;兼容性测试&#xff0c;文档测试&#xff0c;安装/卸载测试等等 界面测试 1.窗体界面测试 1.窗体定义&#xff1a;指整个软件窗口&#xff0c;也可称为窗口&#xff0c;是界面测试的基本单位 2.控件分…

一起endpoint迷路的问题排查总结

今天上班&#xff0c;一到工位上&#xff0c;就有同事和我说有客户反映自己的容器的一些指标在监控平台不上报了&#xff0c;我当时一看机器所在的监控&#xff0c;发现确实是这样 确实存在某个点开始数据就没了&#xff0c;主要这个点当时也没有任何的操作变更&#xff0c;于…

官方 Linker Scripts 语法和规则解析(2)

系列文章目录 官方 Linker Scripts 语法和规则解析&#xff08;1&#xff09; 官方 Linker Scripts 语法和规则解析&#xff08;2&#xff09; 官方 Linker Scripts 语法和规则解析&#xff08;3&#xff09; 链接脚本(Linker Scripts)语法和规则解析(自官方手册) 7.9. 链接脚…

CentOS 7 通过YUM安装MySQL 8.0完整指南

一、准备工作&#xff1a;更新系统与YUM源 # 1. 更换阿里云镜像源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo# 2. 清理并重建缓存 yum clean all yum makecache# 3. 升级系统所有包 yum -y update 二、安装MySQL 8.0 1. 下载…

qq邮箱 新版 怎么去掉个性签名?

qq邮箱 新版 怎么去掉个性签名&#xff1f; 新版的qq邮箱&#xff0c;用着还不错&#xff0c;特别是搜索&#xff0c;比以前好多&#xff0c;以前加载的时候&#xff0c;搜索框里有一行字&#xff0c;加载不完&#xff0c;就没法搜索&#xff0c;特别菜。现在好多了。 不过现在…

C++:string类(1)

一.初步了解STL STL是Standard Template Library的缩写&#xff0c;中文译为标准模板库&#xff0c;是C标准库的重要组成部分。它本质上是一套基于模板的通用编程工具&#xff0c;通过模板技术实现了数据结构和算法的抽象与复用&#xff0c;让开发者无需重复编写基础功能&…

如何避免静态变量初始化中的异常

确保初始化表达式的安全性 基本数据类型初始化 对于基本数据类型&#xff08;如int、double、boolean等&#xff09;的静态变量初始化&#xff0c;要确保赋值的表达式是合法的。例如&#xff0c;在初始化一个int类型的静态变量时&#xff0c;避免出现除数为零的情况。 class Sa…

【151】基于Springboot+Vue实现的校园订餐管理系统小程序(有文档+PPT+视频)

系统介绍 视频演示 基于SpringbootVue实现的校园订餐管理系统小程序&#xff08;有文档PPT视频&#xff09; 基于SpringbootVue实现的校园订餐管理系统小程序采用前后端分离的架构方式&#xff0c;系统设计了管理员、商家、用户三种角色&#xff0c;系统分为管理端、小程序端&…

从 0 到 1:基于 Qwen3 Embedding 的 RAG 智能问答系统搭建指南

RAGFlow 是一个基于深度文档理解的开源 RAG&#xff08;检索增强生成&#xff09;引擎。 与 LLM 集成后&#xff0c;它能够提供真实的问答功能&#xff0c;并以来自各种复杂格式数据的可靠引用为支撑。 教程链接&#xff1a;OpenBayes 控制台 使用云平台:OpenBayes signup -…

Prompt Distillation for Efficient LLM-based Recommendation

题目 基于LLM的高效推荐的快速蒸馏 论文地址&#xff1a;https://dl.acm.org/doi/10.1145/3583780.3615017 摘要 大语言模型&#xff08;LLM&#xff09;在各种任务上表现出了无与伦比的建模能力&#xff0c;例如多步推理&#xff0c;但是这些模型的输入大部分仅限于纯文本&am…

JDBC 工具类:1.0到3.0版本

一、引言 在 Java 开发中&#xff0c;与数据库的交互是一项常见且重要的任务。JDBC&#xff08;Java Database Connectivity&#xff09;作为 Java 语言访问数据库的标准 API&#xff0c;为我们提供了统一的接口来操作各种数据库。然而&#xff0c;每次进行数据库操作都编写大…

实验室建设案例 | 洛阳职业技术学院—人工智能实验室

院校简介 洛阳职业技术学院位于千年古都、牡丹花城、丝路起点洛阳&#xff0c;是一所由洛阳市政府举办的公办高职院校&#xff0c;成立于2011年&#xff0c;办学历史可追溯到1945年的豫西公学。学校全面贯彻党的教育方针&#xff0c;围绕落实立德树人根本任务&#xff0c;秉承“…