Ch.3 텍스트를 숫자로 — 토큰화의 세계
딕셔너리 — 단어장 만들기
LLM의 '단어장'은 어떻게 만들까?
GPT가 텍스트를 처리하려면 모든 단어에 고유 번호를 부여해야 합니다. '안녕'→42, '세계'→108처럼요. 이것이 바로 어휘 사전(vocabulary)입니다.
수만 개의 단어에 어떻게 번호를 매기지?
딕셔너리 — 키와 값을 연결하는 Python의 핵심 자료구조로 어휘 사전을 만듭니다.
핵심 개념
어휘 사전
모델이 인식하는 모든 토큰의 집합
딕셔너리
키-값 쌍으로 데이터를 저장하는 자료구조
핵심 내용
딕셔너리는 이름표(키)로 값을 찾는 자료구조입니다
# 딕셔너리 = 키:값 쌍
vocab = {
"안녕": 0,
"세계": 1,
"파이썬": 2,
"AI": 3,
}
print(vocab["파이썬"]) # 2
print(len(vocab)) # 4dict[키] — 값 조회 dict[새키] = 값 — 항목 추가 키 in dict — 키 존재 여부 확인 len(dict) — 항목 개수
Counter는 각 요소가 몇 번 등장했는지 셉니다
from collections import Counter
text = "나는 AI를 배운다 나는 파이썬을 배운다"
tokens = text.split()
counts = Counter(tokens)
print(counts)
# Counter({'나는': 2, '배운다': 2, 'AI를': 1, '파이썬을': 1})
print(counts.most_common(2))
# [('나는', 2), ('배운다', 2)]빈도가 높은 단어 = 어휘 사전에 반드시 포함
텍스트에서 단어 빈도를 직접 세어봅시다
from collections import Counter
corpus = ("딥러닝은 인공지능의 한 분야이다 "
+ "인공지능은 머신러닝을 포함한다 "
+ "머신러닝은 딥러닝을 포함한다 "
+ "딥러닝은 신경망을 기반으로 한다 "
+ "인공지능 연구가 활발하다")
tokens = corpus.split()
counts = Counter(tokens)
print("=== 단어 빈도 Top 5 ===")
for word, count in counts.most_common(5):
bar = chr(9608) * count
print(f" {word:8s} | {bar} ({count}회)")
print(f"
총 토큰: {len(tokens)}, 고유: {len(counts)}")실제 텍스트의 단어 빈도는 지프의 법칙을 따릅니다
지프의 법칙(Zipf's Law): 가장 빈번한 단어의 빈도는 2위의 2배, 3위의 3배... 조사('은/는', '이/가')가 압도적으로 많고, 의미 있는 단어('딥러닝')는 적습니다. 이것이 BPE 같은 서브워드 토큰화가 필요한 이유입니다.
단어 → 정수 매핑, LLM 어휘 사전의 핵심입니다
from collections import Counter
corpus = "나는 AI를 배운다 나는 파이썬을 배운다 AI는 미래다"
tokens = corpus.split()
counts = Counter(tokens)
vocab = {}
vocab["<PAD>"] = 0
vocab["<UNK>"] = 1
for i, (word, _) in enumerate(counts.most_common(), start=2):
vocab[word] = i
print("=== 어휘 사전 ===")
for word, idx in vocab.items():
print(f" {word:8s} → {idx}")
test = "나는 AI를 공부한다"
encoded = [vocab.get(w, vocab["<UNK>"]) for w in test.split()]
print(f"
입력: {test}")
print(f"인코딩: {encoded}")<PAD> — 길이 맞추기용 빈 토큰 <UNK> — 어휘 사전에 없는 단어 실제 GPT-4의 어휘 사전은 약 10만 개의 토큰을 포함합니다.
딕셔너리로 나만의 단어 빈도 분석기를 직접 만들어봅시다
# 딕셔너리로 단어 빈도 분석기 만들기
text = "나는 파이썬을 배운다 나는 AI를 배운다 AI는 미래다 파이썬은 도구다"
tokens = text.split()
# 방법 1: 수동으로 빈도 세기
freq = {}
for token in tokens:
if token in freq:
freq[token] += 1
else:
freq[token] = 1
print("=== 수동 빈도 분석 ===")
for word, count in sorted(freq.items(), key=lambda x: -x[1]):
bar = "#" * (count * 5)
print(f" {word:8s} | {bar} ({count}회)")
# 방법 2: get() 활용 (더 깔끔)
freq2 = {}
for token in tokens:
freq2[token] = freq2.get(token, 0) + 1
print(f"\n두 방법 결과 동일: {freq == freq2}")
print(f"총 토큰: {len(tokens)}개, 고유 토큰: {len(freq)}개")다음 코드의 출력은? d = {"a": 1, "b": 2} d["c"] = 3 print(len(d))
Counter는 딕셔너리의 하위 클래스이다
딕셔너리에 존재하지 않는 키로 접근하면 어떤 일이 일어나나요?
다음 코드의 빈칸을 채우세요. d = {"a": 1, "b": 2} result = d.___("c", 0) # result → 0
d.___("c", 0) → 0
Counter("banana")에서 가장 빈도가 높은 문자는?
딕셔너리와 어휘 사전
핵심 용어
어휘 사전
모델이 인식하는 모든 토큰의 집합
딕셔너리
키-값 쌍으로 데이터를 저장하는 자료구조
정리 노트
딕셔너리 · Counter · 어휘 사전 핵심 정리
딕셔너리 기본 조작
- dict[키]
- 값 조회 — 없는 키면 KeyError 발생
- dict.get(키, 기본값)
- 안전한 조회 — 없는 키면 기본값 반환
- dict[새키] = 값
- 새 항목 추가 또는 기존 항목 수정
Counter와 어휘 사전
- Counter
- dict의 하위 클래스 — 요소 빈도를 자동으로 계산
- most_common(n)
- 빈도 상위 n개 항목을 튜플 리스트로 반환
- 어휘 사전
- 단어 → 정수 매핑 (<PAD>=0, <UNK>=1, 이후 빈도순)
GPT-4의 어휘 사전은 약 10만 개 토큰! 딕셔너리가 LLM의 '단어장'을 만드는 핵심 도구입니다.
시각 자료
핵심 정리
- 1딕셔너리 — 키:값 매핑 자료구조
- 2Counter — 토큰 빈도 분석의 핵심 도구
- 3어휘 사전 = 단어 → 정수 매핑 (LLM의 기본)
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작