편집기에서 본 숫자가 어디서 나왔는지 코드로 확인합시다.
아래 상자에는 메일 44건과 판정기가 들어 있고,
여러분이 채울 자리가 두 곳 있습니다.
채우고 ▶ 실행을 누르면 앞에서 본 표들이 그대로 찍힙니다.
- 빈칸 ① —
judge() 안입니다.
"규칙 낱말이 제목 안에 들어 있는가?"를 파이썬으로 어떻게 묻나요?
힌트: 파이썬에서 '들어 있다'는 in 으로 묻습니다.
채우지 않으면 아무 규칙도 안 걸려 전부 '정상'이 되고, 정확도가 54.5%에서 얼어붙습니다.
- 빈칸 ② — 정확도 계산입니다. 맞힌 건수를 전체로 나누고 100을 곱하세요.
100을 빼먹으면 값이 0~1 로 나와 표가 통째로 어긋납니다.
ℹ️ 코드에서 눈여겨볼 세 줄
def judge(title, rules) — 이것이 오늘의 모델입니다.
규칙 목록을 받아 0이나 1을 내놓는 아주 단순한 모양이지요.
2단원 뒤쪽에서 이 자리에 이웃 찾기(8차시)와 신경망(14차시)이 들어옵니다.
def score(rules) — 이것이 오늘의 손실입니다.
맞힌 건수만 세는 게 아니라 tp(잡은 스팸)와 fp(잘못 잡은 정상)를
따로 세는 것에 주목하세요. 12차시 네 칸의 절반이 여기 이미 있습니다.
MAILS — 이것이 오늘의 데이터입니다.
제목과 이름표(0/1) 두 칸뿐입니다.
채웠으면 세 가지를 확인하세요
- 【1】의 정확도가 72.7%인가? 앞의 편집기에서
무료 · 당첨 · 대출 · 클릭 넷을 넣었을 때와 같은 숫자여야 합니다.
다르면 빈칸을 잘못 채운 것입니다.
- 【2】의 7개째 줄에 화살표가 붙었는가?
<- 오히려 떨어졌다! 라는 표시는 코드가 붙인 것입니다.
앞줄보다 맞힌 건수가 줄었을 때만 나오게 되어 있습니다.
- 【3】의 두 줄에서 정확도가 같은가?
'무료'를 넣은 것과 뺀 것이 둘 다 72.7%입니다.
바뀐 것은
잡은스팸과 잘못잡은정상 두 칸뿐이지요.
💡 부수어 보기
ORDER 목록 뒤에 낱말을 더 넣어 보세요.
아홉 개, 열 개로 늘려도 77.3%를 크게 넘지 못합니다.
그리고 '할인'처럼 넣으면 떨어지는 낱말이 반드시 또 나옵니다.
BASE 에서 "무료" 를 지워 보세요.
【1】의 정확도가 72.7% 그대로인데 잘못 잡은 정상만 3에서 0으로 바뀝니다.
"고쳤는데 점수가 안 움직인다"는 경험을 꼭 해 두세요 —
점수 하나로 판단하면 안 되는 이유가 이 한 줄에 다 있습니다.
💻
손으로 ③ — 컴퓨터에게 65,536가지를 다 시켜 본다
이번에는 규칙 고르기를 통째로 컴퓨터에게 넘깁니다.
후보 낱말 16개를 넣거나 빼는 65,536가지를 전부 돌려 최고를 찾고,
그다음 글자 조각 2,497개까지 풀어 주고 천장을 잽니다.
마지막으로 그렇게 찾은 규칙을 처음 보는 새 메일 12건에 붙여 봅니다.
⚠️ 이 상자는 처음부터 다시 시작한다
파이썬 실행기는 상자마다 새로 시작합니다.
앞 상자에서 만든 MAILS나 judge는 여기서 쓸 수 없습니다.
그래서 이 상자는 맨 위에 실습 ①의 데이터와 판정기를 글자 그대로 다시 싣습니다.
# ───── 실습 ①에서 가져온 부분 — 고치지 않는다 ───── 로 표시해 두었습니다.
같은 표시를 2단원 내내 보게 됩니다. 앞 차시에서 만든 부품을 이어 쓸 때마다 이렇게 다시 싣습니다.
- 빈칸 ③ — 오늘 가장 중요한 한 줄입니다.
어떤 규칙 조합이 몇 건을 맞혔는지 세는 식이지요.
맞힌 건수 = 잡은 스팸 + (정상 전체 − 잘못 잡은 정상) 입니다.
힌트:
c & SPAM_MASK 는 그 조합이 걸어 낸 스팸의 자국이고,
count1() 이 그 개수를 셉니다. 정상 쪽도 HAM_MASK 로 같은 일을 한 뒤 빼세요.
- 빈칸 ④ — 스팸 제목이 정상 제목 안에 통째로 들어 있는지 묻는 자리입니다.
빈칸 ①에서 쓴 것과 똑같은 물음입니다.
⚠️ 빈칸 ③을 틀리면 100%가 나온다
잘못 잡은 정상을 빼지 않고 count1(c & SPAM_MASK) 만 세면
어떻게 될까요? 낱말을 전부 넣는 조합이 1등이 됩니다.
모든 메일을 스팸이라고 우기면 스팸 20건을 다 잡으니까요.
그러면 화면에는 "최고 성적 20/44"가 아니라 훨씬 좋아 보이는 값이 찍힙니다.
손실을 잘못 정의하면 엉뚱한 것이 1등이 된다 — 이것이 12차시의 주제입니다.
⭐ 반드시 해 볼 실험 — 느낌표 하나
【6】이 천장의 원인을 장학금 무료 특강 안내와
장학금 무료 특강 안내드립니다 신청은 진로부로 한 쌍으로 지목했습니다.
정말 그 한 쌍 때문인지 한 글자로 증명할 수 있습니다.
MAILS 목록에서 스팸 "장학금 무료 특강 안내" 를 찾으세요.
(바로 아래 정상 메일 "장학금 무료 특강 안내드립니다 …" 는 건드리지 않습니다.)
- 뒤에 느낌표 하나를 붙여
"장학금 무료 특강 안내!" 로 고칩니다.
- 다시 실행하고 【5】의 천장을 보세요.
43/44 = 97.7% 가 44/44 = 100.0% 로 올라갑니다.
희생 0건으로도 스팸 20건을 다 잡게 되지요.
- 【6】은
spam_txt 라는 별도의 문장 하나를 따로 적어 두고 견주는 자리라
MAILS 만 고쳐서는 바뀌지 않습니다. 【6】의
spam_txt = "장학금 무료 특강 안내" 도 똑같이 느낌표를 붙여 고치세요.
그러면 마지막 줄이 True 에서 False 로 바뀝니다.
글자 하나가 '불가능'을 '가능'으로 바꾸었습니다.
이것이 뜻하는 바는 분명합니다 — 규칙 기반의 한계는 막연히 어려워서가 아니라
데이터 안의 아주 구체적인 한 자리 때문이었습니다.
원인을 이렇게 정확히 짚을 수 있으면, 고칠 방법도 정확해집니다.
💡 더 부수어 보기 — 후보를 늘리면 천장이 올라갈까
POOL 에 낱말을 더 넣어 보세요. 실제로 재 본 값입니다.
| 후보 낱말 수 | 돌려 보는 조합 수 | 최고 성적 |
| 16개 (지금 코드) | 65,536 | 36/44 = 81.8% |
| 19개 (부업·수익·계정 추가) | 524,288 | 38/44 = 86.4% |
| 22개 (해외·특가·즉시 더 추가) | 4,194,304 | 39/44 = 88.6% |
올라가긴 합니다. 그런데 100%에는 못 갑니다.
그리고 22개는 조합이 400만 가지라 브라우저가 멈춥니다 —
POOL 은 19개를 넘기지 마세요.
조각의 길이 범위 range(2, 7) 도 바꿔 보세요.
1~6, 2~4, 2~10, 3~6 — 무엇을 해도 천장은 43/44 로 같습니다.
길이는 천장과 아무 상관이 없습니다. 천장을 만드는 것은 오직 그 한 쌍입니다.