一文掌握文本语义分割:从朴素切分、Cross-Segment到阿里SeqModel

前言

之所以写本文,源于以下两点

  1. 在此文《基于LangChain+LLM的本地知识库问答:从企业单文档问答到批量文档问答》的3.5节中,我们曾分析过langchain-chatchat项目中文本分割相关的代码,当时曾提到该项目中的文档语义分割模型为达摩院开源的:nlp_bert_document-segmentation_chinese-base (这是其论文)
  2. 在此文《知识库问答LangChain+LLM的二次开发:商用时的典型问题及其改进方案》中,我们再次提到,langchain-chatchat的默认分块大小是chunk_size:250 (详见configs/model_config.py,但该系统也有个可选项,可以选择达摩院开源的语义分割模型:nlp_bert_document-segmentation_chinese-base)

考虑到在RAG中,embedding和文档语义分割、段落分割都是绕不开的关键点,故本文重点梳理下各类典型的语义分割模型

  • 一方面,更好的促进我司第三项目组知识库问答项目的进度
  • 二方面,把我司在这个方向上的探索、经验一定程度的通过博客分享给大家(更多深入细节则见我司的大模型项目开发线上营)

第一部分 基于Cross Segment Attention的文本分割

RAG场景下,目前比较常用的文本切块方法还都是基于策略的,例如大模型应用开发框架提供的RecursiveCharacterTextSplitter方法,定义多级分割符,用上一级切割符分割后的文本块如果还是超过最大长度限制,再用第二级切割符进一步切割

Lukasik等人在论文《Text Segmentation by Cross Segment Attention》提出了三种基于transformer的分割模型架构。其中一种仅利用每个候选断点(candidate break)周围的局部上下文,而另外两种则利用来自输入的完整上下文(所谓候选断点指任何潜在的段边界,即any potential segment boundary)

1.1 Cross-segment BERT:确定某个句子是否作为下一个段落的开头

分割模型旨在完成文档分割任务,以预测每个句子是否是文本分段的边界

  1. 在 Cross-segment BERT模型中,我们将围绕潜在段落断点的局部上下文输入到模型中:左边k个标记和右边k个标记
  2. 其中与[CLS]对应的输出隐状态被传递给softmax分类器,以便对候选断点进行分段决策

1.2 BERT+Bi-LSTM

在BERT+Bi-LSTM模型中,我们首先使用BERT对每个句子进行编码,然后将句子表示输入到Bi-LSTM中,具体而言

  1. 当用BERT编码每个句子时,所有序列都以[CLS]标记开始
    \rightarrow  如果分割决定是在句子级别sentence level做出的(例如,文档分割document segmentation),我们使用[CLS]token作为LSTM的输入
    \rightarrow  在分词决策是在词级word level做出的情况下(例如,话语分词discourse segmentation),我们获得BERT的完整序列输出,并使用每个词的最左边的词段作为LSTM的输入(use the left-most word-piece of each word as an input to LSTM)

    需要注意的是,在话语分割(discourse segmentation)任务中,由于上下文较短,可以仅使用一次BERT进行完全编码(Note that,due to the context being short for the discourse seg-mentation task, it is fully encoded in a single passusing BERT. );
    或者可以独立地对每个单词进行编码。考虑到许多单词由single word-piece组成,使用深度transformer编码器来对它们进行编码可能会比较费计算资源,毕竟transformer的计算成本(特别是自注意力)随着输入长度呈二次增长
    故在使用这个模型的时候,一般将BERT的输入减少到最大句子大小为64个token,以减少训练和推理时间
  2. 然后,LSTM负责处理具有线性计算复杂度的多样化和潜在的大型句子序列(Then, the LSTM isresponsible for handling the diverse and potentiallylarge sequence of sentences with linear computa-tional complexity)。在实践中,我们将最大文档长度设定为128个句子,更长的文档会被分割成连续且非重叠的128个句子块,并作为独立的文档进行处理

// 待更

1.3 Hierarchical BERT

而在分层BERT模型中,我们首先使用BERT对每个句子进行编码,然后将输出的句子表示输入到基于Transformer的另一个模型中

第二部分 阿里语义分割模型SeqModel

2.1 SeqModel核心原理

回顾一下

  1. 上文的Cross-Segment提出了一个基于本地上下文的跨段BERT模型和一个分层BERT模型(Hier.BERT),以利用两个BERT模型对句子和文档进行编码,从而实现更长的上下文建模
    proposed a cross-segment BERT model using local contextand a hierarchical BERT model (Hier.BERT) using two BERTmodels to encode sentence and document separately for ex-ploiting longer context
  2. 2020年,此篇论文《Two-level transformer and auxiliary coherence modeling for improved text segmentation》还采用了两个分层连接的Transformer结构(uses two hierarchically con-nected transformers)。然而,由于分层模型计算成本高且推理速度较慢

2.1.1 SeqModel:将文档分割建模为句子级序列标记任务

为此,Zhang等人在论文《Sequence Model with Self-Adaptive Sliding Window for Efficient Spoken Document Segmentation》中提出了SeqModel

  • SeqModel利用BERT对多个句子同时编码,建模了更长的上下文之间依赖关系之后再计算句向量,最后预测每个句子后边是否进行文本分割
  • 此外,该模型还使用了自适应滑动窗口方法,在在不牺牲准确性的情况下进一步加快推理速度

如下图所示,SeqModel将文档分割建模为句子级序列标记任务(which models document segmentation as a sentence-level sequence label-ing task)

  1. 首先,文档中的每个句子经过WordPiece分词器进行分词[12]
  2. 然后,通过由“token嵌入、位置嵌入和段落嵌入”组成的输入表示层来对这些句子进行编码
    This sequence is embedded through the input representation layer as the element-wise sum of token embedding, position embedding, and segment embedding.
  3. 接下来,这些嵌入被送入Transformer编码器,输出与k个标记对应的隐状态\left\{R_{m-i}\right\}_{i=1}^{k},并使用均值池化方法得到句子编码
    These embedding sare then fed to a transformer encoder and the output hiddenstates corresponding to k tokens in sentence sm, denoted by {Rm−i }ki=1, are mean-pooled to represent the sentenceencoding. 
  4. 最后,将所有句子\{s\}_{m=1}^{n}的句子编码\left\{S_{m}\right\}_{m=1}^{n}输入softmax二元分类器以判断每个句子是否为段落边界,训练目标是最小化softmax交叉熵损失
    The sentence encodings {Sm}nm=1 for sentences{s}nm=1 are fed to a softmax binary classifier to classifywhether each sentence is a segment boundary. The training objective is minimizing the softmax cross-entropy loss.

2.1.2 自适应滑动窗口(Self-adaptive Sliding Window)

我们还提出了一种自适应滑动窗口方法,在不牺牲准确性的情况下进一步加快推理速度(We also propose a self-adaptive sliding window approach tofurther speed up inference without sacrificing accuracy),如下图所示

  1. 传统的分割推理滑动窗口使用固定的前向步长。在我们提出的自适应滑动窗口方法中,在推理过程中,从前一个窗口中的最后一句话开始,模型在最大后向步长内 向后查看,以找到来自前一个推理步骤的积极分割决策(模型对分割预测概率>0.5)
    Traditional sliding window for seg-mentation inference uses a fixed forward step size. In ourproposed self-adaptive sliding window approach, during in-ference, starting from the last sentence in the previous win-dow, the model looks backward within a maximum backward step size to find positive segmentation decisions (segmenta-tion prediction probability from the model > 0.5) from the previous inference step.
  2. 当在这个跨度内有积极的决策时,下一个滑动窗口将自动调整为:从最近预测片段边界之后的下一个句子开始。否则,当在这个跨度内没有积极的决策时,下一个滑动窗口将从前一个窗口中的最后一句话开始
    When there are positive decisions within this span, the next sliding window is automatically ad-justed to start from the next sentence after the most recent predicted segment boundary. Otherwise, when no positive de-cisions exist within this span, the next sliding window startsfrom the last sentence in the previous window.
  3. 考虑到最后一段和历史对下一个分割决策影响已经降低,这种策略有助于丢弃滑动窗口内不相关的历史信息。因此,自适应滑动窗口既可以加快推理速度也可以提高分割准确性
    Consideringthat the last paragraph and the history beyond have reducedimpact on the next segmentation decision, this strategy helpsdiscard irrelevant history within the sliding window. Hence,the self-adaptive sliding window may both speed up inferenceand improve segmentation accuracy. 

2.2 与cross-segment BERT、Hierarchical BERT的区别

2.2.1 与cross-segment BERT的区别

  • 对于cross-segment BERT而言,其将文档分割作为每个候选断点的token级别的二分类任务。输入训练样本由一个领头的[CLS]标记和连接候选断点左右局部上下文的方式组成,并通过[SEP]标记进行分隔
    该序列被送入BERT编码器,其中与[CLS]对应的输出隐状态被传递给softmax分类器,以便对候选断点进行分段决策

    the cross-segment BERT model [10],treats document segmentation as a token-level binary classi-fication task for each candidate break (i.e., each token). The input training sample is composed of a leading [CLS] token,and concatenation of the left and right local contexts for acandidate break, separated by the [SEP] token.
    This sequenceis fed to a BERT-encoder and the output hidden state corre-sponding to [CLS] is fed to a softmax classifier for segmen-tation decision on the candidate break. 
  • 相比之下,我们的SeqModel同时编码一组句子\left\{S_{m}\right\}_{m=1}^{n},因此通过编码器自注意力机制可以利用更长的上下文和句子间依赖关系。因此,使用上下文化的句子编码\left\{S_{m}\right\}_{m=1}^{n}来进行分类有潜在地提高了分割准确性
    此外,我们的SeqModel同时对多个句子进行分类,在推理速度方面较跨段模型显著加快
    In comparison, our SeqModel encodes a block of sentences {sm}nm=1 simulta-neously, hence exploits longer context and inter-sentence de-pendencies through encoder self-attention. Consequently, thecontextualized sentence encodings {Sm}nm=1 for classifica-tion can potentially improve segmentation accuracy.
    In ad-dition, our SeqModel classifies multiple sentences simultane-ously, hence significantly speeds up inference compared tothe cross-segment model. 

2.2.2 与Hierarchical BERT、直接BERT的区别

  • 不同于Hierarchical BERT,SeqModel通过均值池生成上下文化的句子编码,而不是像Hierarchical BERT那样使用另一个Transformer编码器进行文档编码。因此,它显著降低了计算复杂度,并提高了推理效率(SeqModel generates contextualized Hier.BERT, hence significantly reduces computational com-plexity and improves inference efficiency.)
  • BERT[BERT: pre-training of deep bidirectional transformers for language understanding]采用下一句预测(NSP)任务作为句间目标,这是一个判别两个句子在原始来源中是否相邻的二值分类任务
    BERT [13] employs the next sentence prediction (NSP) task as an inter-sentence objective, which is a binary classification task deciding whether two sentences are contiguous in the original source.

    啥意思呢,其实很简单
    在预训练BERT模型过程中,为了让模型学到两个句子之间的关系,设计了一个二分类任务,即

    1. 同时向BERT中输入两个句子,预测第二个句子是否是第一个句子的下一句。基于这个原理,我们可以设计一种最朴素的文本切分方法,其中最小的切分单位是句子 (下图:图源)

    2. 在完整的文本上,用滑动窗口的方式分别将相邻的两个句子输入到BERT模型中做二分类,如果预测分值较小,说明这两个句子之间的语义关系比较弱,可以作为一个段落切分点
    3. 然而,这种方法判断是否是文本切分点时只考虑了前后各一个句子,没有利用到距离更远位置的文本信息。此外,该方法的预测效率也相对较低
  • RoBERTa[14]将NSP目标从预训练中移除,但也添加了其他训练优化
    RoBERTa [14] removes the NSP objective from pre-training but also adds other training optimizations.
  • StructBERT[15]在BERT预训练目标的基础上增加了一个单词结构目标和一个句子结构目标。句子结构目标对两个句子(S1,S2)进行三元分类,以决定S1是在S2之前还是之后,或者两个句子是不连续的
    StructBERT [15] augments BERT pre-training objectives with a word structural objective and a sentence structural objective. The sentence structural objective conducts a ternary classification on two sentences (S1, S2) to decide whether S1 precedes or follows S2 or the two sentences are noncontiguous.
  • CONPONO模型[16]利用了新的句子间目标,包括预测具有多个句子之间的连贯但非连续的跨度之间的排序。
    The CONPONO model [16] exploits new inter-sentence objectives, including predicting ordering between coherent yet noncontiguous spans with multiple sentences in between.
  • ELECTRA[17]用一个更有效的替换token检测任务取代了BERT预训练中的屏蔽语言建模,该任务用生成器网络生成的可信替代(plausible alternatives)替代一些输入token,然后训练一个判别器来预测损坏输入中的每个token是否被生成的样本替换
    ELECTRA [17] replaces masked language modeling in BERT pre-training with a more efficient replaced-token detection task, which replaces some input tokens with plausible alternatives generated by a generator network, then trains a discriminator to predict whether each token in the corrupted input is replaced by a generated sample or not.

2.3 SeqModel的应用

SeqModel模型权重已公开在魔搭社区上,支持中文,地址为:https://modelscope.cn/models/damo/nlp_bert_document-segmentation_chinese-base/summary,可通过如下代码使用:

from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

p = pipeline(
    task=Tasks.document_segmentation,
    model='damo/nlp_bert_document-segmentation_chinese-base')

result = p(documents='......')
print(result[OutputKeys.TEXT])

这就是本文前言中所说的阿里开源的语义分割模型了呐

// 待更..

参考文献与推荐阅读

  1. 检索增强生成(RAG)有什么好的优化方案?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

56K star!一键拥有跨平台 ChatGPT 应用:ChatGPT-Next-Web

前言 现在围绕 openai 的客户端层出不穷,各路开发大神可以说是各出绝招,我也试用过几个国内外的不同客户端。 今天我们推荐的开源项目是目前我用过最好的ChatGPT应用,在GitHub超过56K Star的开源项目:ChatGPT-Next-Web。 ChatGP…

【计算机组成原理】通过带符号整数的减法运算中加法器的溢出标志 OF 和符号标志 SF 对两个带符号整数的大小进行比较

对于带符号整数的减法运算,能否直接根据 CF 的值对两个带符号整数的大小进行比较? 对于带符号整数的减法运算,不能直接根据CF(进/借位标志)的值对两个带符号整数的大小进行比较。 CF标志位在带符号整数运算中主要用于…

Java最大优先队列设计与实现

Java 学习面试指南:https://javaxiaobear.cn 1、API设计 类名MaxPriorityQueue构造方法MaxPriorityQueue(int capacity):创建容量为capacity的MaxPriorityQueue对象成员方法private boolean less(int i,int j):判断堆中索引i处的元素是否小…

二叉树算法题(一)

根据二叉树创建字符串 根据二叉树创建字符串 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 "()" 表示,转化后需要省…

基于JSP+Servlet+Mysql的学生信息管理系统

基于JSPServletMysql的学生信息管理系统 一、系统介绍二、功能展示1.目录2.数据库3.登陆4.注册5.主页 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称:基于JSPServletMysql的学生信息管理系统 项目架构:B/S架构 开发语言:Java语…

软件装一送三了!还附带弹窗资讯,你确定不试一下?

前言 前几天一个朋友向我吐槽,说电脑太卡了。自己好像都没安装什么软件,怎么就那么多弹窗广告。 我看了一下他的电脑,笑了一下说:你的电脑真好,都会只能给你推荐美女看,这资讯来之不易啊,好好享…

libexif库介绍

libexif是一个用于解析、编辑和保存EXIF数据的库。它支持EXIF 2.1标准(以及2.2中的大多数)中描述的所有EXIF标签。它是用纯C语言编写的,不需要任何额外的库。源码地址:https://github.com/libexif/libexif ,最新发布版本为0.6.24,…

如何保障开放网络边界安全?

针对开放式网络(办事大厅、视频网络等),如何在内部网络构建起一道安全屏障,有效解决广大用户普遍存在的无法保证网络边界完整、边界安全、公共场所终端摄像头管理、办事大厅智能设备(一体机等)管理、开放场…

【AI视野·今日CV 计算机视觉论文速览 第283期】Thu, 4 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Thu, 4 Jan 2024 Totally 85 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers LEAP-VO: Long-term Effective Any Point Tracking for Visual Odometry Authors Weirong Chen, Le Chen, Rui Wang, Marc P…

信源编码与信道转移矩阵

目录 一. 信息论模型 二. 点对点通信模型 三. 信源编码 四. 信道转移矩阵 4.1 二进制对称信道 4.2 二进制擦除信道 五. 小结 (1)信道直射与反射 (2)信道散射 (3) 信道时变性 一. 信息论模型 194…

Python 面向对象之反射

Python 面向对象之反射 【一】概念 反射是指通过对象的属性名或者方法名来获取对象的属性或调用方法的能力反射还指的是在程序额运行过程中可以动态获取对象的信息(属性和方法) 【二】四个内置函数 又叫做反射函数 万物皆对象(整数、字符串、函数、模块、类等等…

thinkphp6入门(15)-- 模型动态构建查询条件

背景 我使用thinkphp6的模型写数据库查询,有多个where条件,但是不确定是否需要添加某个where条件,怎么才能动态得生成查询 链式查询 在ThinkPHP 6中,可以使用链式查询方法来动态地构建查询条件。可以根据参数的值来决定是否添加…

【Docker基础一】Docker安装Elasticsearch,Kibana,IK分词器

安装elasticsearch 下载镜像 查看版本:Elasticsearch Guide [8.11] | Elastic # 下载镜像 docker pull elasticsearch:7.17.16 # 查看镜像是否下载成功 docker images创建网络 因为需要部署kibana容器,要让es和kibana容器互联 # 创建一个网络&…

2024阿里云优惠_阿里云活动中心

2024年阿里云优惠活动大全,包括阿里云服务器优惠活动清单、配置价格表、域名优惠活动、阿里云建站活动、阿里云优惠代金券免费领取、对象存储OSS活动、企业邮箱优惠、无影云电脑优惠、CDN特惠等等,阿里云百科aliyunbaike.com分享2024阿里云优惠活动大全_…

【JAVA】Iterator 和 ListIterator 有什么区别?

🍎个人博客:个人主页 🏆个人专栏: JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 在Java中,遍历集合是日常编程中常见的任务,而Iterator和ListIterator作为遍历集合的两个主要接口&#xff0…

MacOS M1/M2 Go Debug 配置

前言 换电脑,Go 环境带来一些麻烦,耽误很多时间,稍作记录。 原始电脑是 Mac 旧款,CPU x86 构型,新电脑 M2,因为旧电脑里本地文件很多,为了简化搬迁,还是用了 Mac 自带的迁移&#x…

[论文阅读] Revisiting Feature Propagation and Aggregation in Polyp Segmentation

[论文地址] [代码] [MICCAI 23] Abstract 息肉的准确分割是筛查过程中有效诊断结直肠癌的关键步骤。 由于能够有效捕获多尺度上下文信息,普遍采用类似UNet 的编码器-解码器框架。 然而,两个主要限制阻碍了网络实现有效的特征传播和聚合。 首先&#xff…

AI教我学编程之C#关键字

AI教我学编程系列学习第三课 — C#关键字 前言重点先知关键字分类保留字上下文关键字 对话AI首遇波澜调整指令第一次第二次第三次直到我提出如下指令 人工智能?阶段总结 知识拓展1、Ecma和ISO是什么?2、System,dllhost.exe,taskmg…

力扣:438. 找到字符串中所有字母异位词 题解

Problem: 438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 预备知识解题思路复杂度Code其它细节推荐博客或题目博客题目滑动窗口哈希表 预备知识 此题用到了双指针算法中的滑动窗口思想,以及哈希表的运用。c中是unordered_map。如果对此不了解的u…

江科大STM32

目录 STM32简介 STM32简介 我们主要学习的就是STM32的外设。 NVIC:内核里面用于管理中断的设备,比如配置中断优先级这些东西SysTick:内核里面的定时器,主要用来给操作系统提供定时服务的,STM32是可以加入操作系统的&am…