Ch.3 텍스트를 숫자로 — 토큰화의 세계

딕셔너리 — 단어장 만들기

딕셔너리의 키-값 구조를 이해하고 활용한다Counter로 단어 빈도수를 측정한다토큰 → 정수 매핑(어휘 사전)의 원리를 파악한다

LLM의 '단어장'은 어떻게 만들까?

GPT가 텍스트를 처리하려면 모든 단어에 고유 번호를 부여해야 합니다. '안녕'→42, '세계'→108처럼요. 이것이 바로 어휘 사전(vocabulary)입니다.

수만 개의 단어에 어떻게 번호를 매기지?

딕셔너리 — 키와 값을 연결하는 Python의 핵심 자료구조로 어휘 사전을 만듭니다.

lightbulb

핵심 개념

어휘 사전

모델이 인식하는 모든 토큰의 집합

딕셔너리

키-값 쌍으로 데이터를 저장하는 자료구조


article

핵심 내용

딕셔너리는 이름표(키)로 값을 찾는 자료구조입니다

# 딕셔너리 = 키:값 쌍
vocab = {
    "안녕": 0,
    "세계": 1,
    "파이썬": 2,
    "AI": 3,
}

print(vocab["파이썬"])  # 2
print(len(vocab))       # 4

dict[키] — 값 조회 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")에서 가장 빈도가 높은 문자는?

딕셔너리와 어휘 사전

key

핵심 용어

📚

어휘 사전

모델이 인식하는 모든 토큰의 집합

📖

딕셔너리

키-값 쌍으로 데이터를 저장하는 자료구조

edit_note

정리 노트

딕셔너리 · Counter · 어휘 사전 핵심 정리

딕셔너리 기본 조작

dict[키]
값 조회 — 없는 키면 KeyError 발생
dict.get(키, 기본값)
안전한 조회 — 없는 키면 기본값 반환
dict[새키] = 값
새 항목 추가 또는 기존 항목 수정

Counter와 어휘 사전

Counter
dict의 하위 클래스 — 요소 빈도를 자동으로 계산
most_common(n)
빈도 상위 n개 항목을 튜플 리스트로 반환
어휘 사전
단어 → 정수 매핑 (<PAD>=0, <UNK>=1, 이후 빈도순)

GPT-4의 어휘 사전은 약 10만 개 토큰! 딕셔너리가 LLM의 '단어장'을 만드는 핵심 도구입니다.

image

시각 자료

다이어그램: py-scene-word-count
check_circle

핵심 정리

  • 1딕셔너리 — 키:값 매핑 자료구조
  • 2Counter — 토큰 빈도 분석의 핵심 도구
  • 3어휘 사전 = 단어 → 정수 매핑 (LLM의 기본)

퀴즈와 인터랙션으로 더 깊이 학습하세요

play_circle인터랙티브 레슨 시작