7차시. 텍스트 분할 이해
6. 실습 ② — overlap을 눈으로 확인하기
출처: 원본 PDF 07차시_텍스트분할이해.pdf 13쪽 · 쪽 그림 13쪽
개념 설명만으로는 잘 와닿지 않습니다. 직접 겹치는 부분을 봅시다.
📝 src/check_overlap.py
def show_boundary(chunks, i=0):
print(f"=== {i}번 조각의 마지막 80자 ===")
print(chunks[i].page_content[-80:])
print()
print(f"=== {i+1}번 조각의 처음 80자 ===")
print(chunks[i+1].page_content[:80])
print()
print("▶ 위아래에 같은 문장이 보이면 overlap 정상 작동!")
# 3·4번 조각 사이가 실제로 겹치는 지점입니다
show_boundary(chunks, 3)실습 코드 · 07/check_overlap.py
실습 코드: 실습/src/07/check_overlap.py · 위의 원본 PDF 7차시 13쪽 「6️⃣ 실습 ② — overlap을 눈으로 확인하기」과 이어집니다.
# ============================================================
# 7차시 | PPT: 07차시_텍스트분할이해.pptx
# 역할: chunk_overlap 때문에 이웃 조각의 경계가 겹치는지 확인
# 입력: ../../data/manual.pdf
# 출력: 로딩 문장, 0번 조각의 끝 20자, 1번 조각의 앞 20자
# 흐름:
# manual.pdf -> load_documents
# -> 페이지 본문을 한 문자열로 합침
# -> splitter (크기 30, 겹침 20)
# -> show_boundary()
# ============================================================
# Document: 본문과 metadata를 담는 객체. 여기서는 합친 글 전체를 담습니다.
# chunk: 잘라 낸 조각. overlap: 앞 조각 끝과 다음 조각 시작이 겹치는 글자 수
from langchain_community.document_loaders import PyPDFLoader
import os
import sys
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.documents import Document
CURRENT_DIR = os.path.dirname(__file__)
INGEST_DIR = os.path.join(CURRENT_DIR, "..", "06")
sys.path.insert(0, INGEST_DIR)
from ingest import load_documents
docs = load_documents("../../data/manual.pdf")
# 크기를 30, 겹침을 20으로 두어 경계가 잘 보이게 합니다.
splitter = RecursiveCharacterTextSplitter(
# chunk_size = 100,
chunk_size = 30,
chunk_overlap = 20,
separators=["\n\n", "\n", ". ", " ", ""],
length_function = len,
)
# chunk_overlap 내용을 알려면?
# chunks = splitter.split_documents(docs)
# for i in range(len(chunks) - 1):
# print(f"Chunk {i} 끝: {chunks[i].page_content[-50:]!r}")
# print(f"Chunk {i + 1} 시작: {chunks[i + 1].page_content[:50]!r}")
# print()
# 페이지를 따로 자르면 경계가 페이지에서 끊깁니다. 글을 한 덩어리로 합칩니다.
full_text = ""
for doc in docs:
full_text += doc.page_content + "\n\n"
merged_doc = Document(page_content = full_text)
chunks = splitter.split_documents([merged_doc])
def show_boundary(chunks, index=0):
# index 조각의 마지막 20자와 다음 조각의 처음 20자를 출력합니다.
print(chunks[index].page_content[-20:])
print()
print(chunks[index+1].page_content[:20])
print('='*50)
show_boundary(chunks, 0)실행 결과 샘플 (교안 기록. API 키가 필요한 코드는 키 없이 맞춘 예시이고, 모델의 답은 실행할 때마다 달라집니다)
===== 실행 결과 샘플 =====
실행: cd 실습/src/07
python check_overlap.py
3쪽 로딩 완료 (총 1529 자)
명서
가정용 공기청정기 AP-3300
가정용 공기청정기 AP-3300
목차
==================================================코드 해설
chunk_overlap 때문에 이웃 조각의 경계가 겹치는지 확인입니다. 입력은 ../../data/manual.pdf이고, 출력은 로딩 문장, 0번 조각의 끝 20자, 1번 조각의 앞 20자입니다.
주석에 적힌 흐름입니다.
manual.pdf -> load_documents
-> 페이지 본문을 한 문자열로 합침
-> splitter (크기 30, 겹침 20)
-> show_boundary()코드 앞에서 고정해 두는 말입니다.
- Document: 본문과 metadata를 담는 객체. 여기서는 합친 글 전체를 담습니다.
- chunk: 잘라 낸 조각. overlap: 앞 조각 끝과 다음 조각 시작이 겹치는 글자 수
함수와 클래스로 나누어 읽습니다.
show_boundary: 이름 그대로 한 가지 일만 합니다. 본문 주석을 같이 읽습니다.
파일 맨 아래 실행 결과 샘플 주석은 실행되지 않습니다. 화면 출력은 다음 절에 다시 적어 두었습니다.
6-1) overlap 있을 때 vs 없을 때
■ chunk_overlap = 20 일 때
─────────────────────────────
=== 3번 조각의 마지막 80자 ===
을 신청할 수 있으며 단순 변심으로 환불하는 경우 왕복
배송비는 고객이 부담하고 제품에 불량이 있는 경우에는
30일 이내에 무상으로 교환해드리며
=== 4번 조각의 처음 80자 ===
30일 이내에 무상으로 교환해드리며 이때 배송비는
회사가 부담합니다
↑ "30일 이내에 무상으로 교환해드리며" 겹침 확인!
■ chunk_overlap = 0 일 때
─────────────────────────────
=== 3번 조각의 마지막 80자 === (동일)
=== 4번 조각의 처음 80자 ===
이때 배송비는 회사가 부담합니다
↑ 겹치는 부분이 전혀 없음⚠️ 직접 실행해보세요
chunk_overlap 값을 0과 50으로 각각 바꿔가며
show_boundary를 실행해보세요.
글로 읽는 것보다
직접 눈으로 확인하는 것이 열 배 빠릅니다.