基于语义分块

基于语义分块的文本处理方法

什么是基于语义分块?

基于语义分块是一种利用自然语言处理方法,根据语义或句子边界对文本进行切分的技术。这种方法通过在句子结尾或标点处分块,或者通过模型预测段落边界,将文档分段为有意义的单元(如句子、段落或主题部分)。其目标是尽量保证每个分块的语义独立完整。
Pasted image 20250506215357.png
Pasted image 20250506215404.png

做法

  1. 语义切分:在句子结尾、标点处或通过模型预测段落边界进行分块。
  2. 创建 Embedding:为每个分段创建 embedding(嵌入向量)。
  3. 相似度计算:比较相邻分段的 embedding。如果两个分段的余弦相似度较高,则将它们合并为一个分块。
  4. 新片段开始:当余弦相似度显著下降时,开始一个新的片段,并重复上述步骤。

优势

局限性


NLTK 的文本切分功能

NLTK(Natural Language Toolkit)是一个广泛使用的 Python 自然语言处理库,提供了丰富的文本处理功能。其 sent_tokenize 方法可以自动将文本切分为句子。

原理

sent_tokenize 方法基于论文《Unsupervised Multilingual Sentence Boundary Detection》的研究成果,使用无监督算法为缩写词、搭配词和句子开头的词建立模型,然后利用这些模型识别句子边界。这种方法在多种语言(主要是欧洲语言)上都取得了良好效果。

中文支持现状

  1. 预训练模型缺失:NLTK 官方并未提供中文分句模型的预训练权重,因此需要用户自行训练。
  2. 训练接口可用:NLTK 提供了训练接口,用户可以基于自己的中文语料库训练分句模型。

在 LangChain 中的应用

LangChain 集成了 NLTK 的文本切分功能,用户可以直接调用这些功能来实现文本切分。以下是一个示例代码:

使用示例

from langchain.text_splitter import NLTKTextSplitter

text_splitter = NLTKTextSplitter()

text = "..."  # 待处理的文本

texts = text_splitter.split_text(text)

for doc in texts:
    print(doc)

扩展:基于 spaCy 的文本切块

spaCy 是另一款强大的自然语言处理库,具备更高级的语言分析能力。LangChain 同样集成了 spaCy 的文本切分方法。

使用方法

只需将 NLTKTextSplitter 替换为 SpacyTextSplitter 即可:

from langchain.text_splitter import SpacyTextSplitter

text_splitter = SpacyTextSplitter()

text = "..."  # 待处理的文本

texts = text_splitter.split_text(text)

for doc in texts:
    print(doc)

提示

使用 spaCy 时,需要先下载对应语言的模型。例如,对于中文处理,可以下载 spaCy 的中文语言模型。