文本分块策略
| 方法 | 优势 | 权衡 | 最适合 |
|---|---|---|---|
| 固定大小 | 简单,块可预测 | 忽略结构,破坏含义 | 原始或非结构化文本 |
| 基于句子 | 保留完整的思想 | 块大小不一致 | RAG,问答系统 |
| 基于段落 | 与语义单元对齐 | 长度差异大 | 文档、手册、教学内容 |
| 滑动窗口 | 保持完整上下文 | 冗余,计算量大 | 重排序,高召回检索 |
| 递归 | 灵活,处理混乱输入 | 启发式,有时易碎 | 抓取网页,混合来源 |
| 语义 | 高质量,语义感知 | 较慢,资源密集型 | 法律、研究、关键问答 |
按句子分块实现:
# ! pip install nltk
from nltk.tokenize import sent_tokenize
def sentence_chunk(text, max_words=150):
sentences = sent_tokenize(text)
chunks, buffer, length = [], [], 0
for sent in sentences:
count = len(sent.split())
if length + count > max_words:
chunks.append(" ".join(buffer))
buffer, length = [], 0
buffer.append(sent)
length += count
if buffer:
chunks.append(" ".join(buffer))
return chunks