0%

基于大语言模型LLM+知识库KB实现的问答系统-2.文本分割[智能客服][NLP][LLM]

当前章节:文本分割
目录导航

介绍

文本分割是项目数据处理的第一步,也是最重要的一步。因为文本分割的效果直接影响到信息查找和最后提问的内容,如果语义分割的效果差,最终实现的效果也是差强人意的。

原理

文本分割原理简单,就是段落分割,由于大模型本身就具有总结能力,只需要分割出段落,或一小段即可,而不需要精确到每一个句子。这能减少段落向量的查询次数,但是会增加提问的信息内容,甚至会导致长度超出模型处理能力。

切割方法

使用一般算法切割

大部分的系统都是使用的普通的方法切割,通过设置正则表达式按照句段切割,如langchain的textspliter。

使用llm进行切割

modelscope专门未段落切割训练了切割模型,该模型接收一般数据,最后完成内容格式整理和切割,返回分段的文本。

测试

我们通过一个样本文本测试这几种分割实际效果(测试的时候是无任何段落换行文本):

1
2
3
4
5
6
7
8
9
为了帮助用户提升信息获取及信息加工的效率,阿里巴巴达摩院语音实验室的口语语言处理团队实践了一系列针对音视频转写结果的长文本语义理解能力。本文主要围绕其中的信息结构化段落分割相关能力进行介绍。

随着在线教学、会议等技术的扩展,口语文档的数量以会议记录、讲座、采访等形式不断增加。然而,经过自动语音识别(ASR)系统生成的长篇章口语文字记录缺乏段落等结构化信息,会显著降低文本的可读性,十分影响用户的阅读和信息获取效率。

此外,缺乏结构化分割信息对于语音转写稿下游自然语言处理(NLP)任务的性能也有较大影响。比如文本摘要和机器阅读理解之类的下游 NLP 应用通常在带有段落分割、格式良好的文本上进行训练和使用才能保证较好的效果和用户体验。

段落或章节通常指语义连贯的子文档单元,通常对应单篇文章内的单一主题或子主题文本片段。文档分割被定义为自动预测文档的段(段落或章节)边界。已有的文档分割工作主要集中在书面文本上,主要包括无监督和有监督两大类方法。近年来,诸多研究者提出了许多基于神经网络的文本分割算法。比如,当前文本分割的 state of the art (SOTA) 是 Lukasik 等[1]提出的基于 BERT 的 cross-segment 模型,将文本分割定义为逐句的文本分类任务。同时,他们也提出使用两个 BERT 模型分别编码句子和文档,从而利用更长上下文的分层 BERT 模型 (Hier.BERT)。

然而,文档分割是一个强依赖长文本篇章信息的任务,逐句分类模型在利用长文本的语义信息时,容易面临模型性能的阻碍。而层次模型也存在计算量大,推理速度慢等问题。我们的目标是探索如何有效利用足够的上下文信息以进行准确分割以及在高效推理效率之间找到良好的平衡。此外,针对口语 ASR 转写稿的数据特性,比如 ASR 识别错误等,我们也进行了一部分针对性优化的工作。接下来,将主要从三个方面展开描述我们的工作,分别是方法介绍、实验结果和分析以及总结展望。
  1. CharacterTextSplitter和RecursiveCharacterTextSplitter
    这个是langchain的两个文本分割类,按照设定的分割符切割,等效于设置简单的re表达式,通用性非常差,一般不直接使用,作为接口来使用。

  2. chatglm的分割类
    这个是chatglm使用的中文文本分割类,实现的效果就是从最基本的一句话实现语义分割,效果较好,能让模型准确定位到问题的答案并且提取的信息简短。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    from langchain.text_splitter import CharacterTextSplitter
    import re
    from typing import List

    class ChineseTextSplitter(CharacterTextSplitter):
    def __init__(self, pdf: bool = False, sentence_size: int = 250, **kwargs):
    super().__init__(**kwargs)
    self.pdf = pdf
    self.sentence_size = sentence_size

    def split_text(self, text: str) -> List[str]:
    if self.pdf:
    text = re.sub(r"\n{3,}", "\n", text)
    text = re.sub('\s', ' ', text)
    text = text.replace("\n\n", "")
    sent_sep_pattern = re.compile('([﹒﹔﹖﹗.。!?]["’”」』]{0,2}|(?=["‘“「『]{1,2}|$))') # del :;
    sent_list = []
    for ele in sent_sep_pattern.split(text):
    if sent_sep_pattern.match(ele) and sent_list:
    sent_list[-1] += ele
    elif ele:
    sent_list.append(ele)
    return sent_list

分割结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
x:为了帮助用户提升信息获取及信息加工的效率,阿里巴巴达摩院语音实验室的口语语言处理团队实践了一系列针对音视频转写结果的长文本语义理解能力。
x:本文主要围绕其中的信息结构化段落分割相关能力进行介绍。
x:随着在线教学、会议等技术的扩展,口语文档的数量以会议记录、讲座、采访等形式不断增加。
x:然而,经过自动语音识别(ASR)系统生成的长篇章口语文字记录缺乏段落等结构化信息,会显著降低文本的可读性,十分影响用户的阅读和信息获取效率。
x:此外,缺乏结构化分割信息对于语音转写稿下游自然语言处理(NLP)任务的性能也有较大影响。
x:比如文本摘要和机器阅读理解之类的下游 NLP 应用通常在带有段落分割、格式良好的文本上进行训练和使用才能保证较好的效果和用户体验。
x:段落或章节通常指语义连贯的子文档单元,通常对应单篇文章内的单一主题或子主题文本片段。
x:文档分割被定义为自动预测文档的段(段落或章节)边界。
x:已有的文档分割工作主要集中在书面文本上,主要包括无监督和有监督两大类方法。
x:近年来,诸多研究者提出了许多基于神经网络的文本分割算法。
x:比如,当前文本分割的 state of the art (SOTA) 是 Lukasik 等[1]提出的基于 BERT 的 cross-segment 模型,将文本分割定义为逐句的文本分类任务。
x:同时,他们也提出使用两个 BERT 模型分别编码句子和文档,从而利用更长上下文的分层 BERT 模型 (Hier.BERT)。
x:然而,文档分割是一个强依赖长文本篇章信息的任务,逐句分类模型在利用长文本的语义信息时,容易面临模型性能的阻碍。
x:而层次模型也存在计算量大,推理速度慢等问题。
x:我们的目标是探索如何有效利用足够的上下文信息以进行准确分割以及在高效推理效率之间找到良好的平衡。
x:此外,针对口语 ASR 转写稿的数据特性,比如 ASR 识别错误等,我们也进行了一部分针对性优化的工作。
x:接下来,将主要从三个方面展开描述我们的工作,分别是方法介绍、实验结果和分析以及总结展望。

  1. document-segmentation模型
    modelscope训练一个专门文本分割模型,这个分割更加偏向于段落分割,分割结果接近实际文本的段落,但存在一些特殊文本导致误分段的结果,并且推理较慢,不适用超长文本,
1
2
3
4
5
6
x:为了帮助用户提升信息获取及信息加工的效率,阿里巴巴达摩院语音实验室的口语语言处理团队实践了一系列针对音视频转写结果的长文本语义理解能力。本文主要围绕其中的信息结构化段落分割相关能力进行介绍。
x:随着在线教学、会议等技术的扩展,口语文档的数量以会议记录、讲座、采访等形式不断增加。然而,经过自动语音识别(ASR)系统生成的长篇章口语文字记录缺乏段落等结构化信息,会显著降低文本的可读性,十分影响用户的阅读和信息获取效率。此外,缺乏结构化分割信息对于语音转写稿下游自然语言处理(NLP)任务的性能也有较大影响。比如文本摘要和机器阅读理解之类的下游 NLP 应用通常在带有段落分割、格式良好的文本上进行训练和使用才能保证较好的效果和用户体验。
x:段落或章节通常指语义连贯的子文档单元,通常对应单篇文章内的单一主题或子主题文本片段。文档分割被定义为自动预测文档的段(段落或章节)边界。已有的文档分割工作主要集中在书面文本上,主要包括无监督和有监督两大类方法。
x:近年来,诸多研究者提出了许多基于神经网络的文本分割算法。比如,当前文本分割的 state of the art (SOTA) 是 Lukasik 等[1]提出的基于 BERT 的 cross-segment 模型,将文本分割定义为逐句的文本分类任务。同时,他们也提出使用两个 BERT 模型分别编码句子和文档,从而利用更长上下文的分层 BERT 模型 (Hier.
x:BERT)。然而,文档分割是一个强依赖长文本篇章信息的任务,逐句分类模型在利用长文本的语义信息时,容易面临模型性能的阻碍。而层次模型也存在计算量大,推理速度慢等问题。我们的目标是探索如何有效利用足够的上下文信息以进行准确分割以及在高效推理效率之间找到良好的平衡。此外,针对口语 ASR 转写稿的数据特性,比如 ASR 识别错误等,我们也进行了一部分针对性优化的工作。
x:接下来,将主要从三个方面展开描述我们的工作,分别是方法介绍、实验结果和分析以及总结展望。

总结

通过以上示例,我们可以按照实际需求结合算法和神经网络分割,算法分割作为主要分割方式,神经网络作为备用分割方式,作为可选方法。

并且我们需要考虑到不同文本格式的支持,如markdown,pdf,html,img
常用库有rapidocr_onnxruntime-RapidOCR,langchain.document_loaders下有无结构化文本转换器