文档API 参考📓 教程🧑‍🍳 菜谱🤝 集成💜 Discord🎨 Studio
文档

ChineseDocumentSplitter

ChineseDocumentSplitter 使用先进的中文语言处理能力将中文文本文档分割成更小的块。它利用 HanLP 进行准确的中文分词和句子分词,非常适合处理需要语言意识的中文文本。

pipeline 中的最常见位置转换器DocumentCleaner 之后, 分类器 之前的索引管道中。
强制运行变量"documents": 包含中文文本内容的文档列表。
输出变量"documents": 文档列表,每个文档包含原始中文文本的一个片段。
API 参考PreProcessors (预处理器)
GitHub 链接https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/hanlp

概述

ChineseDocumentSplitter 是一个专门为中文文本处理设计的文档分割器。与英文文本不同,英文文本中的单词由空格分隔,而中文文本连续书写,单词之间没有空格。

此组件利用 HanLP(Han Language Processing)提供准确的中文分词和句子分词。它支持两种粒度级别:

  • 粗粒度:提供适合大多数通用场景的更宽泛的分词。使用COARSE_ELECTRA_SMALL_ZH 模型进行通用分词。
  • 细粒度:为特定应用提供更详细的分词。使用FINE_ELECTRA_SMALL_ZH 模型进行详细分词。

分割器可以按各种单位分割文档:

  • word:按中文词语(多字符标记)分割。
  • sentence:使用 HanLP 句子分词器按句子分割。
  • passage:按双换行符(“\n\n”)分割。
  • page:按换页符(“\f”)分割。
  • line:按单换行符(“\n”)分割。
  • period:按句号(“.”)分割。
  • function:使用自定义分割函数。

每个提取的块都保留了原始文档的元数据,并包含其他字段:

  • source_id:原始文档的 ID。
  • page_number:块所属的页码。
  • split_id:文档中分割的序列 ID。
  • split_idx_start:块在原始文档中的起始索引。

respect_sentence_boundary=True 设置时,该组件使用 HanLP 的句子分词器(UD_CTB_EOS_MUL),以确保分割仅发生在完整的句子之间,从而保持文本的语义完整性。

用法

单独使用

您可以使用在管道外直接处理中文文档的 ChineseDocumentSplitter

from haystack import Document
from haystack_integrations.components.preprocessors.hanlp import ChineseDocumentSplitter

# Initialize the splitter with word-based splitting
splitter = ChineseDocumentSplitter(
    split_by="word", 
    split_length=10, 
    split_overlap=3, 
    granularity="coarse"
)

# Create a Chinese document
doc = Document(content="这是第一句话,这是第二句话,这是第三句话。这是第四句话,这是第五句话,这是第六句话!")

# Warm up the component (loads the necessary models)
splitter.warm_up()

# Split the document
result = splitter.run(documents=[doc])
print(result["documents"])  # List of split documents

尊重句子边界

按词语分割时,可以确保尊重句子边界。

from haystack import Document
from haystack_integrations.components.preprocessors.hanlp import ChineseDocumentSplitter

doc = Document(content=
    "这是第一句话,这是第二句话,这是第三句话。"
    "这是第四句话,这是第五句话,这是第六句话!"
    "这是第七句话,这是第八句话,这是第九句话?"
)

splitter = ChineseDocumentSplitter(
    split_by="word", 
    split_length=10, 
    split_overlap=3, 
    respect_sentence_boundary=True,
    granularity="coarse"
)
splitter.warm_up()
result = splitter.run(documents=[doc])

# Each chunk will end with a complete sentence
for doc in result["documents"]:
    print(f"Chunk: {doc.content}")
    print(f"Ends with sentence: {doc.content.endswith(('。', '!', '?'))}")

使用细粒度

用于更详细的分词。

from haystack import Document
from haystack_integrations.components.preprocessors.hanlp import ChineseDocumentSplitter

doc = Document(content="人工智能技术正在快速发展,改变着我们的生活方式。")

splitter = ChineseDocumentSplitter(
    split_by="word", 
    split_length=5, 
    split_overlap=0, 
    granularity="fine"  # More detailed segmentation
)
splitter.warm_up()
result = splitter.run(documents=[doc])
print(result["documents"])

使用自定义分割函数

您也可以使用自定义函数进行分割。

from haystack import Document
from haystack_integrations.components.preprocessors.hanlp import ChineseDocumentSplitter

def custom_split(text: str) -> list[str]:
    """Custom splitting function that splits by commas"""
    return text.split(",")

doc = Document(content="第一段,第二段,第三段,第四段")

splitter = ChineseDocumentSplitter(
    split_by="function", 
    splitting_function=custom_split
)
splitter.warm_up()
result = splitter.run(documents=[doc])
print(result["documents"])

在 pipeline 中

以下是如何集成ChineseDocumentSplitter 到 Haystack 索引管道中。

from haystack import Pipeline, Document
from haystack.document_stores.in_memory import InMemoryDocumentStore
from haystack.components.converters.txt import TextFileToDocument
from haystack_integrations.components.preprocessors.hanlp import ChineseDocumentSplitter
from haystack.components.preprocessors import DocumentCleaner
from haystack.components.writers import DocumentWriter

# Initialize components
document_store = InMemoryDocumentStore()
p = Pipeline()
p.add_component(instance=TextFileToDocument(), name="text_file_converter")
p.add_component(instance=DocumentCleaner(), name="cleaner")
p.add_component(instance=ChineseDocumentSplitter(
    split_by="word", 
    split_length=100, 
    split_overlap=20, 
    respect_sentence_boundary=True,
    granularity="coarse"
), name="chinese_splitter")
p.add_component(instance=DocumentWriter(document_store=document_store), name="writer")

# Connect components
p.connect("text_file_converter.documents", "cleaner.documents")
p.connect("cleaner.documents", "chinese_splitter.documents")
p.connect("chinese_splitter.documents", "writer.documents")

# Run pipeline with Chinese text files
p.run({"text_file_converter": {"sources": ["path/to/your/chinese/files.txt"]}})

此管道通过将中文文本文件转换为文档、清理文本、使用符合语言学规律的中文分词将其分割成块,并将结果存储在 Document Store 中以供进一步检索和处理,来处理中文文本文件。