본문 바로가기
Python

[Python] CharacterTextSplitter의 chunk_size와 chunk_overlap의 동작 과정

by YBin's 2024. 12. 15.

 

CharacterTextSplitter

  • 텍스트를 separator단위로 자릅니다.
  • 각 잘린 부분이 chunk_size를 넘지않으면 합쳐집니다.
  • separator가 없다면, chunk_size를 초과해도 잘리지 않고 하나의 chunk로 생성됩니다.
hp_book = "123 234 567 8 9123456"

text_splitter = CharacterTextSplitter(
    separator=" ",  # 공백 기준으로 나누거나 적절히 설정
    chunk_size=10,
    chunk_overlap=0,
    length_function=len_func
)

para_list2 = text_splitter.split_text(hp_book)
print(para_list2)

스텝1 separator 단위로 나눈다

para_list2 = [ “123”, “234”, “567”, “8”, “9123456”]

단, separator가 최소단위이므로, chunk_size를 초과해도 separator가 없다면, 하나의 청크로 만들어진다.

스텝2. 만약 앞청크와 합쳤을 때, size가 chunk_size를 넘지 않는다면, 합친다

주의 ) 분리 기준은 “분리자 직전”까지 이므로, 만약 1번 청크와 2번 청크를 합치는 경우에는 1번 청크뒤의 분리자도 길이에 포함시켜야 한다. → 123234를 합칠 때, 234는 분리자 직전에 짤려있으므로 길이가 3이지만, 123은 분리자와 함께 붙여야하므로 분리자 1개를 포함한 길이가 4이다.

para_list2 = [ “123 234”, “567 8”,”9123456” ]

—> 각 길이 : 7 5 7

  • 만약 chunk_size를 6으로 주면?
    • 마지막 9123456은 chunk_size를 초과하지만, separator가 없으므로 잘리지 않고, 초과된 크기로 하나의 청크가 된다.
['123', '234', '567 8', '9123456'] 
길이 :: 3 3 5 7

스텝3. chunk_overlap이 있을 경우, 스텝2의 결과물로 나온 list에 반영한다.

주의 ) 여기서도 청크로 합쳐지는 단위는 separator 이며, 합쳐진 후의 크기가 chunk_size를 넘지 않을때만 합쳐진다.

스텝3-1. overlap을 1로 주었을 경우

para_list2 = [ “123 234”, “567 8”,”9123456” ]

# "567 8"에 바로 앞 청크인 234를 붙이려고 시도.
# 합쳐져도 "234 567 8"로서 길이가 9이지만, overlap 크기인 1을 벗어난 
# 3의 길이를 가진"234"를 붙이려고 시도했으므로 실패.

## "9123456"에 바로 앞 청크인 "8"을 붙이려고 시도.
## 합쳐져도 "8 9123456"으로 길이가 9이므로 통과, overlap도 길이가 1인 것을 만족
## "8 9123456"으로 overlap 된다.
결과 :: ['123 234', '567 8', '8 9123456']
길이 :: 7 5 9 

스텝3-2. overlap을 3으로 주었을 경우

para_list2 = [ “123 234”, “567 8”,”9123456” ]

# "567 8"에 바로 앞 청크인 234를 붙이려고 시도.
# 합쳐져도 "234 567 8"로서 길이가 9이지만, overlap 크기인 3을 벗어난 만족
# "234 567 8"으로 overlap 된다

## "9123456"에 바로 앞 청크인 "8"을 붙이려고 시도.
## 합쳐져도 "8 9123456"으로 길이가 9이므로 통과, overlap도 길이가 1인 것을 만족
## "8 9123456"으로 overlap 된다.
결과 :: ['123 234', '234 567 8', '8 9123456']
길이 :: 7 9 9

 

 

참조

https://stackoverflow.com/questions/76633836/what-does-langchain-charactertextsplitters-chunk-size-param-even-do