ChineseDocumentSplitter

ChineseDocumentSplitter

ChineseDocumentSplitter는 중국어 텍스트 문서를 고급 중국어 처리 기능으로 더 작은 청크로 나누는 컴포넌트예요. HanLP를 활용해 정확한 중국어 단어 분리(word segmentation)와 문장 토큰화를 수행하므로, 언어적인 이해가 필요한 중국어 텍스트 처리에 이상적입니다.

출처: 문서

본문

항목 내용
파이프라인에서의 일반적인 위치 인덱싱 파이프라인에서 Converters와 DocumentCleaner 이후, Classifiers 이전
필수 run 변수 documents — 중국어 텍스트 내용을 담은 문서 리스트
출력 변수 documents — 각각 원본 중국어 텍스트의 한 조각을 담은 문서 리스트
API reference HanLP
GitHub link https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/hanlp
Package name hanlp-haystack

Overview

ChineseDocumentSplitter는 중국어 텍스트 처리를 위해 특별히 설계된 문서 스플리터예요. 영어는 단어가 공백으로 구분되지만, 중국어는 단어 사이 공백 없이 연속으로 쓰이는 점이 다릅니다.

이 컴포넌트는 HanLP(Han Language Processing)를 활용해 정확한 중국어 단어 분리와 문장 토큰화를 제공하며, 두 가지 세분화(granularity) 수준을 지원해요:

  • Coarse granularity: 대부분의 일반적인 용도에 적합한 넓은 단어 분리를 제공하며, 범용 분리를 위해 COARSE_ELECTRA_SMALL_ZH 모델을 사용해요.
  • Fine granularity: 전문적인 응용을 위한 더 세부적인 단어 분리를 제공하며, 상세 분리를 위해 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)를 사용해 분할이 항상 완전한 문장 사이에서만 일어나도록 보장합니다. 이로써 텍스트의 의미론적 무결성이 유지됩니다.

Usage

On its own

파이프라인 밖에서도 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="这是第一句话,这是第二句话,这是第三句话。这是第四句话,这是第五句话,这是第六句话!",
)

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

With sentence boundary respect

단어 단위로 분리할 때 문장 경계를 존중하도록 할 수 있어요:

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",
)
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(('。', '!', '?'))}")

With fine granularity

더 세부적인 단어 분리를 원한다면:

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
)
result = splitter.run(documents=[doc])
print(result["documents"])

With custom splitting function

분리에 사용자 정의 함수를 쓸 수도 있어요:

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)
result = splitter.run(documents=[doc])
print(result["documents"])

In a 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에 저장해요.

더 알아보기 (Learn more)