Langchain-Chatchat/markdown_docs/text_splitter/chinese_text_splitter.md

103 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## ClassDef ChineseTextSplitter
**ChineseTextSplitter**: 该类的功能是对中文文本进行分句处理特别优化了对PDF文本的处理以及长句的分割。
**属性**:
- `pdf`: 布尔值指示是否对PDF文本进行特殊处理默认为False。
- `sentence_size`: 整数定义了句子的最大长度超过这个长度的句子将被进一步分割默认值为250。
**代码描述**:
ChineseTextSplitter类继承自CharacterTextSplitter专门用于处理中文文本的分句。它提供了两个主要的方法`split_text1`和`split_text`,用于不同的分句逻辑。
- `split_text1`方法主要处理PDF文本通过正则表达式去除多余的换行和空格然后使用特定的分句符号进行分句。这个方法适用于简单的分句需求。
- `split_text`方法提供了更复杂的分句逻辑不仅处理PDF文本的特殊格式还对长句进行了细致的分割处理。它首先使用标点符号进行初步分句然后针对超过`sentence_size`属性定义的长度的句子,进行进一步的分割,确保每个句子的长度都不会超过设定的最大值。
这两个方法共同支持了对中文文本的高效和灵活的分句处理特别是在处理PDF来源的文本和长句时展现了很好的适应性和精确性。
**注意**:
- 在使用`split_text`方法进行文本分割时,应注意`sentence_size`属性的设置,以避免过长或过短的句子影响后续处理。
- 对于PDF文本建议开启`pdf`属性,以获得更好的分句效果。
- 此类的分句规则主要基于中文标点符号,对于包含大量英文或其他特殊格式文本的处理可能需要额外的调整。
**输出示例**:
```python
splitter = ChineseTextSplitter(pdf=True, sentence_size=250)
text = "这是一个测试文本。这个文本包含多个句子,用于测试。"
result = splitter.split_text(text)
print(result)
```
假设输出为:
```python
["这是一个测试文本。", "这个文本包含多个句子,用于测试。"]
```
这个示例展示了如何使用`ChineseTextSplitter`类对一个包含两个句子的文本进行分割,得到一个句子列表作为输出。
### FunctionDef __init__(self, pdf, sentence_size)
**__init__**: 该函数用于初始化ChineseTextSplitter类的实例。
**参数**:
- `pdf`: 一个布尔值用于指定是否处理PDF文件默认为False。
- `sentence_size`: 一个整数用于指定句子的最大长度默认为250。
- `**kwargs`: 接收可变数量的关键字参数,这些参数将传递给父类的初始化方法。
**代码描述**:
`__init__`方法是ChineseTextSplitter类的构造函数用于创建类的实例时初始化其属性。它接收三个参数`pdf`、`sentence_size`和`**kwargs`。`pdf`参数用于指示是否处理PDF文件其默认值为False表示默认不处理PDF文件。`sentence_size`参数用于指定分割文本时每个句子的最大长度默认值为250个字符。`**kwargs`是一个可变关键字参数,允许传递额外的参数给父类的构造函数,这在类的继承体系中非常有用,以确保父类也能被正确初始化。
在方法体内,首先通过`super().__init__(**kwargs)`调用父类的构造函数,确保父类的初始化逻辑得到执行。然后,将`pdf`和`sentence_size`参数的值分别赋值给实例变量`self.pdf`和`self.sentence_size`,这样在类的其他方法中就可以通过这些实例变量访问到这些值了。
**注意**:
- 在使用ChineseTextSplitter类时应根据实际需求设置`pdf`和`sentence_size`参数。如果需要处理的是PDF文件则应将`pdf`参数设置为True。
- `sentence_size`参数应根据目标文本的特性和处理需求来调整,以达到最佳的文本分割效果。
- 通过`**kwargs`传递给父类的参数应确保与父类的构造函数兼容,避免传递无效或错误的参数。
***
### FunctionDef split_text1(self, text)
**split_text1**: 此函数的功能是对中文文本进行分句处理。
**参数**:
- `text`: 需要分句处理的文本,类型为字符串。
**代码描述**:
`split_text1` 函数首先检查对象是否有 `pdf` 属性。如果有,它会对文本进行预处理,包括将连续三个或更多的换行符替换为单个换行符、将所有空白字符替换为单个空格,并删除连续的两个换行符。这些预处理步骤旨在简化文本结构,为分句做准备。
接下来,函数使用正则表达式定义了一个分句模式 `sent_sep_pattern`,该模式能够识别中文文本中的句子结束标志,包括常见的中文标点符号(如句号、问号、感叹号等)及其后可能跟随的引号。这个模式是分句的核心,它能够准确地识别出句子的边界。
函数接着通过 `sent_sep_pattern.split(text)` 方法将文本分割成多个片段。然后,它遍历这些片段,根据片段是否匹配分句模式来决定是将片段添加到新句子中,还是作为一个新句子独立出来。这个过程最终生成了一个句子列表 `sent_list`,包含了文本中所有独立的句子。
**注意**:
- 该函数假设输入的文本是中文,并且特别针对中文标点进行了分句处理。如果输入的文本不是中文,或者使用了非中文的标点符号,分句的效果可能不理想。
- 函数的分句效果受正则表达式 `sent_sep_pattern` 的准确性影响,可能需要根据具体的文本内容调整正则表达式以达到最佳效果。
**输出示例**:
假设输入文本为:"今天天气真好。我们去公园玩吧!你同意吗?",函数的返回值可能如下:
```python
["今天天气真好。", "我们去公园玩吧!", "你同意吗?"]
```
这个示例展示了如何将包含多个句子的文本分割成单独的句子列表,每个句子作为列表的一个元素。
***
### FunctionDef split_text(self, text)
**split_text**: 此函数的功能是将文本分割成句子列表。
**参数**:
- `text`: 需要分割的文本,类型为字符串。
**代码描述**:
此函数首先检查是否存在`pdf`属性,如果存在,则对文本进行预处理,包括合并多余的换行符、将所有空白字符替换为单个空格以及删除连续的换行符。接下来,函数使用正则表达式对文本进行分句处理。这包括处理单字符断句符(如句号、问号等)、英文和中文的省略号,并考虑双引号后的终止符作为句子的结束。此外,如果段落末尾有多余的换行符,也会被去除。
对于超过设定句子长度(`self.sentence_size`)的文本,函数进一步细化分割逻辑,包括对逗号、句号后的文本进行分割,以及处理连续的空格或换行符。这一过程可能会递归进行,以确保没有任何单个句子超过设定的长度限制。
最后,函数返回一个列表,其中包含分割后的所有句子,且每个句子都不为空且长度不超过设定的句子大小。
**注意**:
- 函数的分句逻辑主要基于中文文本的特点,但也适用于包含英文句号、逗号等标点的文本。
- 对于特殊格式的文本如PDF文档中的文本可能需要先进行预处理以优化分句效果。
- 分句的精确度受正则表达式的设计影响,可能需要根据实际文本内容调整正则表达式以达到最佳效果。
**输出示例**:
假设`self.sentence_size`设定为100对于输入文本
```
"这是第一句。这是第二句,包含,逗号。这是一个超过设定长度的句子,因此需要被进一步分割。"
```
函数可能返回如下列表:
```
["这是第一句。", "这是第二句,包含,逗号。", "这是一个超过设定长度的句子,", "因此需要被进一步分割。"]
```
***