以下是对 gc-qa-rag/ragapp/common/chunk.py
文件的详细 Markdown 文档说明:
文档:chunk.py
代码详解
文件概述
本文件实现了一个用于将文本按句子分组的实用函数 split_text_into_sentence_groups
。该函数主要用于将一段较长的文本,按照指定的分隔符(默认为中文句号“。”)切分为若干句子,并进一步将这些句子分组,以便后续处理(如文本摘要、分块检索、分段存储等场景)。分组时,既考虑了每组的最大句子数,也兼顾了最后一组过小的情况,保证分组的合理性和实用性。
主要函数说明
split_text_into_sentence_groups
参数说明
-
text: str
输入的原始文本字符串。 -
group_size: int = 10
每组最多包含的句子数。默认每组最多 10 句。 -
min_group_size: int = 5
新分组所需的最小句子数。如果最后一组句子数小于该值,则会尝试与前一组合并,避免出现过小的分组。默认值为 5。 -
sentence_delimiter: str = "。"
句子分隔符,默认为中文句号“。”。可根据实际文本类型调整为其他符号(如英文句号“.”等)。
返回值
List[List[str]]
返回一个二维列表,每个子列表为一组句子,组内为字符串类型的句子。
实现原理与细节说明
1. 句子切分与清洗
首先,函数会根据指定的分隔符将输入文本切分为句子。切分后,使用列表推导式去除每个句子的首尾空白,并过滤掉空字符串。这一步确保了后续处理的句子都是有效内容,避免因多余分隔符或空白导致的无效分组。
2. 分组逻辑
分组采用顺序累加的方式:遍历所有句子,将其依次加入当前分组。当当前分组的句子数达到 group_size
时,将该分组加入结果列表,并重置当前分组。这样可以保证每组的句子数不会超过设定的上限。
3. 最后一组的特殊处理
遍历结束后,可能会剩下一组未满 group_size
的句子。此时,函数会判断该组的句子数是否小于 min_group_size
,且结果列表中已有分组。如果满足条件,则将这部分句子合并到上一组,避免出现过小的分组。这一设计考虑了实际应用中分组粒度的一致性,防止最后一组内容过少,影响后续处理效果。
4. 边界与异常处理
- 如果输入文本为空,或切分后没有有效句子,函数会直接返回空列表,避免后续处理出错。
- 所有参数均有默认值,便于直接调用,也支持根据实际需求灵活调整。
设计考虑与应用场景
该函数的设计充分考虑了文本分组在实际 NLP 任务中的常见需求。通过灵活的分组参数设置,可以适应不同长度、不同语言的文本处理场景。尤其是在中文文本处理中,句号“。”作为分隔符的默认选择,体现了对中文语料的适配性。同时,分组时对最后一组的特殊处理,体现了对分组均衡性的关注,避免了数据分布不均的问题。
此函数可广泛应用于文本摘要、知识检索、分块存储、上下文窗口构建等场景,是文本预处理阶段的一个基础而实用的工具。
代码示例
text = "这是第一句。这是第二句。这是第三句。这是第四句。这是第五句。这是第六句。"
groups = split_text_into_sentence_groups(text, group_size=3, min_group_size=2)
print(groups)
# 输出: [['这是第一句', '这是第二句', '这是第三句'], ['这是第四句', '这是第五句', '这是第六句']]
总结
split_text_into_sentence_groups
是一个简洁高效的文本分组工具,兼顾了分组的灵活性与实用性。其设计细致,适合多种文本处理场景,能够为后续的自然语言处理任务提供良好的数据基础。