단원 홈

Ⅰ. 데이터 과학의 이해4차시

글을 세면 무엇이 보이고
무엇이 사라지나

한 줄 평 2,000개를 표 한 장으로

영화 한 편에 달린 한 줄 평은 사람이 다 읽을 수 없습니다. 읽는 대신 세기로 하면 2,000줄을 한 장의 표로 볼 수 있어요. 그런데 무엇을 칸으로 삼을지는 사람이 고르고, 고르는 순간 무엇인가는 표에서 사라집니다. 오늘은 그 표를 직접 만들고, 같은 세기를 scikit-learn 에게 다시 시켜 도구가 말없이 고른 규칙을 손으로 센 것과 견줍니다.

  • [12데과01-02]
  • 50분네 정거장
  • 새 도구scikit-learn
  • 자료한국어 영화 한 줄 평 2,000줄(NSMC)

학습 목표

  1. 개념에서

    글(비정형)을 표로 바꿀 때 무엇을 칸으로 고르는지와 그때 사라지는 것을 말할 수 있다.

  2. 손으로

    한 줄 평 2,000줄에서 속성을 뽑아 표를 만들고, 같은 세기를 scikit-learn 으로 다시 해 견줄 수 있다.

  3. 확인에서

    만든 표의 값어치와 한계를 근거를 들어 한 문단으로 쓸 수 있다.

1
여는 장면 · 5분

책상 위에 쌓인 한 줄 평 2,000장

영화가 개봉하면 평점 사이트에 한 줄 평이 쌓입니다. 제작사 사람이 그 평을 다 읽을 수는 없어요. 그래서 “읽는” 대신 “세는” 쪽을 고릅니다. 무엇을 셀지만 정하면 2,000줄이 표 한 장이 되고, 표가 되면 견주고 더하고 정렬할 수 있으니까요.

그런데 무엇을 셀지가 문제입니다. 아래 세 줄은 실제로 달린 평입니다. 셋 가운데 별점이 낮은 평은 몇 번일까요? 표에 적을 칸을 고르기 전에, 사람으로서 먼저 읽어 보세요.

제작사 회의 · 가상 메모

“평이 2,000개면 다 읽는 데만 하루입니다. 다음 작품에서 무엇을 고칠지 월요일까지 정리해 주세요.”

이 메모는 수업을 위해 지어낸 것입니다 · 평 2,000줄은 실제 자료입니다
표 1실제로 달린 한 줄 평 세 줄별점은 가려 두었다 · ‘재미’ 가 들어 있는지만 세어 두었다
한 줄 평글자 수‘재미’ 가 들었나별점
① 정말 재미있었다.. 지금 봐도 손색 없는 작품 25자들었다가려 둠
② 별 관심도 재미도 별루.... 16자들었다가려 둠
③ 너무 재밌어서 5분만에 다봄 15자안 들었다가려 둠

‘재미’ 를 세면 ①과 ②가 같은 편이 됩니다. ③은 ‘재미’ 라는 낱말이 없으니 (‘재밌어’ 는 ‘재미’ 와 글자가 다릅니다) 아예 세어지지 않고요. 자료: NSMC 한국어 영화 평 2,000줄 — ../data/nsmc_2000.csv (원장 계산)

먼저 예측

별점은 3정거장에서 엽니다. 그 전에 여러분이 제작사라면 무엇을 칸으로 삼겠습니까? 2,000줄에서 셀 것을 세 가지만 적어 보세요 — 글자 수처럼 아주 단순한 것도 좋습니다. 그리고 그렇게 세면 무엇이 표에서 사라질지도 한 줄 덧붙여 두세요.

체크포인트 1

표에 적을 칸 세 가지를 스스로 골랐고, 그때 사라질 것을 한 줄 적어 두었다.

다음 정거장 · 개념 15분 →
2
개념 · 15분

구조화는 재는 일이 아니라 고르는 일

2-1비정형을 표로 — 칸을 고르는 사람이 있다

한 줄 평처럼 정해진 칸이 없는 자료를 비정형 데이터라고 합니다. 비정형을 분석하려면 먼저 속성을 뽑아 표로 만들어야 해요. 이 일을 구조화라고 부릅니다. 글자 수 · 어절 수 · 느낌표 수 · ㅋ · ㅠ, 그리고 ‘무엇을 두고 한 말인가’(이야기 · 연기 · 음악 · 영상) — 오늘 우리가 고를 칸은 이 아홉 개입니다.

이 아홉 개는 자료가 정해 준 것이 아니라 우리가 고른 것입니다. 같은 평이라도 마케터는 ‘측면과 불만’ 을 칸으로 삼고, 국어학자는 ‘어미와 띄어쓰기’ 를 칸으로 삼아요. 하나의 ‘정답 표’ 는 없습니다. 묻는 물음이 칸을 정하고, 칸이 답을 정합니다.

그리고 사전에 없는 말은 세어지지 않습니다. 평 2,000줄 가운데 1,714줄(86%) 에는 우리가 고른 측면 낱말이 하나도 들어 있지 않습니다. 그 줄들에게 우리 표는 ‘아무 말도 하지 않은 평’ 입니다 — 사실은 무언가 말했는데도요.

규칙표를 내놓을 때는 어떤 칸을 왜 골랐는지와 그 칸에 담기지 않은 것을 함께 적는다.

그림 1평 한 줄이 아홉 칸이 되기까지왼쪽은 사람이 읽는 것 · 오른쪽은 표가 적는 것
① 사람이 읽는 것“별 관심도 재미도 별루....”별점 낮음순서‘재미도’ 다음에 ‘별루’ 가 온다관계‘재미’ 는 칭찬이 아니라 불평의 재료다말투점 넷(....) 이 말끝을 흐린다셋 다 ‘낱말이 몇 번 나왔나’ 로는 적을 수 없다. ② 표가 적는 것 — 9칸글자수16어절수4느낌표0ㅋ0ㅠ0이야기0연기0음악0영상0순서 · 관계 · 말투가 들어갈 칸이 없다.측면 넷이 모두 0 — 우리 사전에 ‘재미’ 가 없다. ① 사람이 읽는 것“별 관심도 재미도 별루....”별점 낮음순서‘재미도’ 다음에 ‘별루’ 가 온다관계‘재미’ 는 칭찬이 아니라 불평의 재료다말투점 넷(....) 이 말끝을 흐린다셋 다 ‘낱말이 몇 번 나왔나’ 로는 적을 수 없다. ② 표가 적는 것 — 9칸글자수16어절수4느낌표0ㅋ0ㅠ0이야기0연기0음악0영상0순서 · 관계 · 말투가 들어갈 칸이 없다.측면 넷이 모두 0 — 우리 사전에 ‘재미’ 가 없다.

표로 바꾸면 2,000줄을 한꺼번에 견줄 수 있게 되지만, 한 줄이 가진 것은 줄어듭니다. 순서 · 관계 · 말투가 들어갈 칸이 아홉 개 안에 없기 때문입니다. 구조화는 바꿔 얻는 일입니다. 자료: 평 ‘별 관심도 재미도 별루....’ — 2,000줄 안의 실제 평(원장 계산)

2-2세는 순간 사라지는 것

칸을 고르면 그 칸에 담기지 않는 것은 없던 일이 됩니다. 아래 네 쌍은 같아야 할 것 같은 두 숫자가 다른 자리입니다. 차이가 곧 사라진 것의 자국이에요.

‘재미’ 가 든 평 148줄 · 긍정과 부정
77긍정(줄)
vs
71부정(줄)
긍정 77부정 71반반 자리

‘재미’ 만으로는 방향을 못 가른다 — ‘재미없다’ 도 ‘재미’ 로 세진다.

부정 낱말 ‘안’ 을 몇 번 세나
16손으로(번)
→
0도구 기본(번)
16번0번손으로도구

도구 기본은 한 글자 낱말을 버린다 — 방향을 가르는 말이 통째로.

‘이야기’ 사전에 두 낱말을 더하면
1437낱말(줄)
→
1979낱말(줄)
143줄197줄7낱말9낱말

칸이 38% 커졌다 — 사전을 만든 사람이 표의 크기를 정한다.

모든 어절을 칸으로 삼으면
9,315손으로(칸)
vs
8,612도구 기본(칸)
9,3158,612손으로도구 기본

같은 2,000줄인데 칸이 다르다 — 규칙이 달랐기 때문이다.

자료: 평 2,000줄 — 네 쌍의 숫자는 모두 3정거장 코드 ② · ③ · ④가 찍는 값이다.

가장 아픈 자리는 비꼼입니다. ‘너무 재밌어서 5분만에 다봄’ 은 별점이 낮은 평인데 칭찬 낱말만 들어 있어요. 우리 표에서 이 평은 15자 4어절, 모든 측면 0 인 한 행이 됩니다. 그 행만 받은 사람은 원문이 칭찬이었는지 불평이었는지 짐작할 길이 없습니다.

또 하나, 한국어는 어절을 세면 특히 많이 흩어집니다. ‘재미없다’ 와 ‘재미 없다’ 는 띄어쓰기 하나로 다른 낱말이 되고, ‘노잼’ 은 아예 다른 글자입니다. 그래서 도구가 만든 표에서 ‘재미’ 가 든 칸만 82개로 쪼개져 있어요.

2-3값어치는 속성 사이의 관계에서 나온다

칸 하나하나는 값어치가 작습니다. 값어치는 칸과 칸을 엮을 때 생겨요 — ‘무엇을 두고 한 말인가’(측면) × ‘칭찬인가 불평인가’(별점)를 엮으면 제작사가 결정할 수 있는 표가 됩니다.

표 2측면 × 평가 — 다음 작품에서 무엇을 먼저 손볼까평 2,000줄 · 한 평이 두 측면에 들 수도 있다 · 사전은 아래에
측면긍정 평부정 평합부정 비율
이야기4310014369.9%
연기845313738.7%
음악1572231.8%
영상12162857.1%

쓴 사전 — 이야기: 스토리 · 내용 · 줄거리 · 전개 · 각본 · 개연성 · 결말 / 연기: 연기 · 배우 / 음악: 음악 · OST · 노래 / 영상: 영상 · CG · 화면. 평에 이 낱말이 하나라도 들어 있으면 그 측면으로 셌습니다.
가장 많이 언급된 것은 연기(137줄)지만 대개 칭찬입니다(부정 38.7%). 먼저 손볼 것은 이야기예요 — 143줄 가운데 100줄이 불평입니다(69.9%). 다만 이 표가 말하는 것은 평을 쓴 사람들의 목소리일 뿐, 관객 전체의 목소리는 아닙니다. 자료: 평 2,000줄 — 코드 ②의 출력값(원장 계산)

글을 표로 바꿀 때 묻는 네 가지 — 차례대로

  1. 물음무엇을 결정하려고 표를 만드나 — 물음이 칸을 정한다
  2. 칸그 물음에 답하려면 무엇을 세야 하나 — 사전과 규칙을 적는다
  3. 빠진 것이 칸에 담기지 않는 것은 무엇인가 — 세어지지 않은 줄은 몇 줄인가
  4. 고른 사람이 사전을 누가 만들었나 — 다른 사람이 만들면 표가 달라지나

넷 가운데 셋째와 넷째를 함께 내놓아야 표가 믿을 만해집니다. ‘이야기’ 사전에 ‘연출’ · ‘감독’ 두 낱말만 더해도 143줄이 197줄이 되니까요.

Ⅰ-3 에서 가져옴같은 정보라도 모양이 다르면 드는 품이 다릅니다. 표(CSV)는 곧바로 셀 수 있고, 글은 셀 수 있는 모양으로 먼저 바꿔야 합니다 — 오늘 하는 일이 그 ‘바꾸기’ 입니다.

2-4도구도 칸을 고른다 — 기계의 눈 셋

칸을 사람이 고르지 않는 방법도 있습니다. 모든 어절을 칸으로 삼으면 되니까요. 평 한 줄이 한 행, 어절 하나가 한 열인 아주 넓은 표 — scikit-learn 의 CountVectorizer 가 한 줄로 만들어 줍니다. 그런데 이 도구도 말없이 규칙을 고릅니다. 기본 설정은 한 글자 낱말을 버리고, 대문자를 소문자로 바꾸고, 붙은 문장부호를 떼어 냅니다.

오늘 우리는 같은 평을 세 가지 규칙으로 세어 볼 겁니다. 이 세 규칙을 앞으로 기계의 눈이라고 부르겠습니다 — 평 한 줄을 표의 한 행으로 바꾸는 규칙 하나가 눈 하나입니다.

표 3오늘의 기계의 눈 셋셋 다 오늘 실습에서 직접 돌려 본다
눈세는 규칙한 행의 모양버리는 것
눈 ① 아홉 칸 우리가 고른 아홉 가지를 센다숫자 9개낱말 자체 — 어떤 말을 썼는지는 남지 않는다
눈 ② 어절 봉투 띄어쓰기로 잘라 어절마다 센다낱말 → 횟수순서 — 어떤 말이 먼저 왔는지
눈 ③ 도구 기본 봉투 문장부호를 떼고 두 글자 이상만 센다낱말 → 횟수순서 + 한 글자 낱말 · 문장부호

눈 ②와 ③이 만드는 행을 봉투라고 부르겠습니다 — 어떤 낱말이 몇 번 들어 있는지만 적힌 주머니라서, 넣은 차례는 적히지 않습니다. 눈 ③이 세지 않고 버리는 조각이 떨어지는 자리는 버린 조각 통이라고 부릅니다.

그림 2같은 두 평, 두 봉투뜻이 반대인 두 평을 눈 ②와 눈 ③이 각각 어떻게 보나
눈 ② 어절 봉투split() + Counter“큭 웃긴다”별점 높음봉투큭1번웃긴다1번“안 웃긴다”별점 낮음봉투안1번웃긴다1번봉투가 다르다 — 눈 ② 는 두 평을 가른다 눈 ③ 도구 기본 봉투CountVectorizer()“큭 웃긴다”별점 높음봉투웃긴다1번“안 웃긴다”별점 낮음봉투웃긴다1번버린 조각 통큭안한 글자는 세지 않는다봉투가 같다 — 눈 ③ 은 두 평을 못 가른다 눈 ② 어절 봉투split() + Counter“큭 웃긴다”별점 높음봉투큭1번웃긴다1번“안 웃긴다”별점 낮음봉투안1번웃긴다1번봉투가 다르다 — 눈 ② 는 두 평을 가른다 눈 ③ 도구 기본 봉투CountVectorizer()“큭 웃긴다”별점 높음봉투웃긴다1번“안 웃긴다”별점 낮음봉투웃긴다1번버린 조각 통큭안한 글자는 세지 않는다봉투가 같다 — 눈 ③ 은 두 평을 못 가른다

‘큭 웃긴다’ 와 ‘안 웃긴다’ 는 뜻이 반대인데, 눈 ③ 에게는 한 칸도 다르지 않은 같은 행입니다. 한 글자 ‘안’ 이 버린 조각 통으로 떨어졌기 때문이에요. 이렇게 뜻은 다른데 그 눈에는 행이 같은 두 평을 오늘부터 쌍둥이 평이라고 부르겠습니다. 자료: 두 평 모두 NSMC 20만 줄에 실제로 있는 평(원장 확인) · 봉투는 scikit-learn 1.4.2 기본 설정

체크포인트 2

구조화가 곧 선택임을 말할 수 있고, 기계의 눈 셋과 그 셋이 각각 버리는 것을 안다. 이제 직접 세어 본다.

다음 정거장 · 손으로 20분 →
3
손으로 · 20분

2,000줄을 표로 만들고, 같은 일을 도구에게 다시 시킨다

오늘의 장비

scikit-learn — 이 책에서 처음 부르는 기계학습 도구 상자

오늘은 그 가운데 세는 도구 하나만 씁니다(CountVectorizer). 분류기는 만들지 않아요. 처음 실행은 몇 초 멈춥니다 — 고장이 아니라 도구를 내려받아 준비하는 중입니다(쪽마다 한 번).

부르는 모양

from sklearn.feature_extraction.text \
     import CountVectorizer

cv = CountVectorizer()
X = cv.fit_transform(글들)     # 표 만들기
cv.get_feature_names_out()   # 칸 이름

오늘 쓰는 것 넷

CountVectorizer
세는 규칙을 정한다 — token_pattern·lowercase
fit_transform
낱말 목록을 만들고 곧바로 센다
get_feature_names_out
칸(열) 이름 목록
X.nnz · X.shape
0 이 아닌 칸 수 · 표의 크기

손으로 센 것과 다른 셋

  1. 낱말 목록을 대신 만든다2,000줄을 훑어 칸 이름을 뽑는다
  2. 0 이 아닌 칸만 적어 둔다1,722만 칸 가운데 1만 3천 칸만 쓴다
  3. 규칙을 기본값으로 정해 둔다말하지 않으면 도구가 고른다 — 오늘의 핵심

대가 — 빨라진 만큼 내가 고르지 않은 규칙이 표에 들어옵니다. 그래서 손으로 센 것과 한 번 견줍니다.

1

평 2,000줄을 9칸 표로 — 눈 ①을 손에 넣는다

3.5분

여는 장면에 적어 둔 내 칸 세 가지입니다. 아래 코드가 고른 아홉 칸과 얼마나 겹치나요?

그리고 하나 더 짐작해 두세요 — 부정 평이 더 길까요, 짧을까요? ‘ㅋ’ 는 어느 쪽에 많을까요?

기본 빈칸 ①·②를 채우고 ▶ 실행하세요. ①은 띄어쓰기로 자른 조각(어절)이 몇 개인지, ②는 사전 낱말이 하나라도 들어 있으면 1 이 되게 하는 자리입니다.

도전 측면 이름을 하나 더 만들어 보세요(예: "길이": ["길다", "지루", "늘어"]). 사전을 더할 때마다 표의 열이 하나씩 늘어납니다 — 칸은 자료가 아니라 내가 만드는 것입니다.

탐구 아홉 칸 가운데 지워도 되는 칸이 있을까요? 지워도 되는지 아닌지는 ‘무엇을 결정하려는가’ 를 먼저 정해야 답할 수 있습니다. 여러분이 제작사라면, 국어학자라면 어떨까요?

긍정 평의 ‘ㅋ’ 평균이 이고 부정 평은 이다. 그래도 ‘ㅋ 가 있으면 긍정’ 이라는 규칙을 만들 수 없는 까닭은 이기 때문이다.

확인 문제 1에 적어 제출 →
2

사전이 표를 만든다 — 측면별 불만과 ‘재미’ 의 정체

4분

먼저 두 가지를 짐작해 두세요. ① ‘이야기’ 사전에 ‘연출’ · ‘감독’ 을 더하면 평 수와 부정 비율은 각각 얼마나 움직일까요? ② ‘재미’ 가 든 평은 긍정이 몇 % 쯤일까요?

기본 코드 ②는 채워져 있습니다. 그대로 ▶ 실행해 측면별 부정 비율을 확인하세요.

도전 "이야기" 목록 끝에 "연출", "감독" 을 더해 다시 돌리세요. 평 수와 부정 비율이 각각 얼마나 움직이는지 예측과 견주어 보세요.

기본 코드 ③의 빈칸 ③을 채우고 ▶ 실행해 ‘재미’ 가 든 평만 골라 보세요.

탐구 ‘재미’ 대신 "재미없" 으로 바꿔 골라 보세요. 몇 줄이 걸리나요? 그 줄들의 긍정·부정 비율은 ‘재미’ 와 얼마나 다릅니까? 속성을 다시 설계하면 값어치가 올라갈까요?

제작사에 먼저 권할 것은 이다. 근거는 이고, 이 권고의 한계는 이다.

확인 문제 3에 적어 제출 → 사전을 만든 사람 이야기는 확인 문제 4로 →
3

도구에게 같은 일을 시킨다 — 그리고 그 눈을 속여 본다

11분

이번에는 칸을 고르지 않고 모든 어절을 칸으로 삼습니다. 평 한 줄이 한 행, 어절 하나가 한 열이에요. 도구가 만든 칸은 손으로 센 칸보다 많을까요, 적을까요? 먼저 한쪽을 고르고 그 까닭도 생각해 두세요.

기본 코드 ④의 빈칸 ④를 채우고 ▶ 실행하세요. 빈칸 ④는 ‘대문자를 소문자로 바꿀까’ 를 정하는 자리입니다 — 손으로 센 규칙(split())은 대소문자를 바꾸지 않습니다. 처음 실행은 몇 초 멈춥니다(scikit-learn 을 받는 중이에요).

도전 token_pattern 만 바꾸고 lowercase 는 그대로 두면 어떻게 될까요? 둘 가운데 어느 설정이 칸 수를 더 많이 바꾸는지 하나씩 켜고 꺼 보세요.

탐구 '연기'가 든 칸 50개 가운데 가장 긴 칸이 109글자입니다. 어떤 평이 이런 칸을 만들까요? 그 평은 띄어쓰기를 어떻게 썼을까요?

이제 세 눈이 모두 갖춰졌습니다 — 눈 ①(코드 ①의 아홉 칸) · 눈 ②(코드 ④의 어절 봉투) · 눈 ③(코드 ④의 도구 기본 봉투). 공방에서 그 눈들을 속여 보세요. 뜻은 반대인데 그 눈에게는 한 칸도 다르지 않은 쌍둥이 평을 만드는 것이 일입니다. 도전 셋을 풀면 카드가 스스로 닫힙니다. 만든 쌍은 공방이 PAIRS 한 줄로 찍어 주고, 미션 ④에서 그대로 씁니다.

시뮬레이터

쌍둥이 공방

뜻은 반대인데 표로는 한 칸도 다르지 않은 평을 만들 수 있을까

  1. 1가장 속이기 어려울 것 같은 눈을 골라 예측을 잠근다
  2. 2작업대의 어절 카드를 옮기고 · 빼고 · 서랍 조각을 끼운다
  3. 3눈 창에서 두 행이 같아지면 뜻을 판정받는다
예측 잠금 — 가장 속이기 어려운 눈
판
조각 서랍 — 골라서 작업대의 틈을 누른다
손
교차 시험 — 아홉 칸을 다 찍으면 잠근다
눈 가린 짝 — 짝이 읽은 뜻
예측을 먼저 잠근다셋 가운데 가장 속이기 어려울 것 같은 눈은?

쌍둥이 = 두 평의 행이 그 눈에서 한 칸도 다르지 않은 것 · 위조 성공 = 쌍둥이 + 뜻이 원본과 반대

이번 심판 — ① 설계자의 정답 배열 → ② 20만 줄에 실제로 있는 평이면 글쓴이의 별점 → ③ 둘 다 아니면 눈 가린 짝이 읽은 뜻

PAIRS = []   # 판을 통과하면 여기에 쌓입니다
속인 눈—/ 3
글자 수—
어절 수—
손댄 횟수0
같은 행인 실제 평—
통과한 판0
도전 1

1판을 손댄 횟수 3번 이하로 통과하라 — 빼기와 끼우기도 한 번씩 센다.

도전 2

2판을 카드 한 장만 바꿔 통과하라 — 원본과 견주어 달라진 어절이 딱 하나여야 한다.

도전 3

3판에서 세 눈을 모두 속이는 서로 다른 배열 둘을 통과시켜라.

자료: 씨앗 평 일곱 줄은 모두 NSMC 20만 줄에 실제로 있는 평이다(2,000줄 밖 — 원장이 읽고 확인). ‘같은 행인 실제 평’ 은 쪽 안에 실은 2,000줄의 아홉 칸 행(숫자만)에서 그때그때 센다 — 평의 글은 보기로 드는 아홉 줄 말고는 싣지 않았다. 눈 ③ 의 세는 규칙은 scikit-learn 1.4.2 기본 설정과 2,000줄 전수로 대조해 다른 줄 0 임을 확인했다.

도구가 대신 해 준 것은 이고, 말없이 정한 것은 이다. 그래서 한국어 평의 긍정·부정을 따질 때 가 표에서 사라진다.

확인 문제 6에 표를 채우고 제출 →
4

내 쌍을 세 눈에 걸어 본다 — 파이썬이 같은 답을 내나

1.5분

공방이 찍어 준 PAIRS 를 코드 ⑤의 PAIRS 자리에 옮겨 붙입니다(그대로 두어도 됩니다 — 네 쌍이 기본으로 들어 있어요). 쌍마다 세 눈이 속을지(True) 먼저 적어 두세요. 공방에서 본 것과 같을까요?

기본 그대로 ▶ 실행해 공방의 판정과 파이썬의 판정을 맞대어 보세요.

도전 공방에서 만든 내 쌍으로 PAIRS 를 바꿔 다시 돌리세요. 공방의 눈 창과 파이썬의 True/False 가 한 칸도 어긋나지 않아야 합니다.

탐구 설정 둘을 고친 ‘고친 도구’ 도 끝내 속는 쌍이 하나 있습니다. 그 쌍은 무엇을 잃었기 때문에 속을까요? 그 잃은 것을 표에 담으려면 칸을 어떻게 늘려야 할까요?

평 한 줄을 표의 한 행으로 바꾸면 정보는 . 근거는 이다. 대신 얻는 것은 이다.

확인 문제 5에 적어 제출 → ‘재미’ 라는 속성 이야기는 확인 문제 2로 →
체크포인트 3

표를 직접 만들었고, 같은 세기를 도구에게 시켜 견주었고, 세 눈이 각각 무엇을 못 보는지 쌍둥이 평으로 확인했다.

다음 정거장 · 정리·확인 10분 →
4
정리·확인 · 10분

오늘의 탐험 일지

  1. 찾은 것

    글을 표로 바꾸는 일은 재는 일이 아니라 고르는 일이다 — 사전을 두 낱말만 늘려도 칸이 38% 커졌다.

  2. 도구의 한계

    도구도 말없이 규칙을 고른다 — 기본 설정이 한 글자 낱말을 버려 부정 낱말 ‘안’ 16번이 0번이 됐다.

  3. 보고의 규칙

    표를 내놓을 때는 고른 칸 · 그 까닭 · 담기지 않은 것 셋을 함께 적는다. 세어지지 않은 줄 수(1,714줄)도 숫자다.

✍️ 문제마다 답을 쓰고 제출하기를 누르세요. 제출하면 모범 답안이 열리고, 제출한 답은 선생님께 전달됩니다.

1. [B]에서 ‘ㅋ’ 와 느낌표의 평균이 긍정 평에서 더 높게 나왔다(ㅋ 0.20 대 0.15 · 느낌표 0.26 대 0.08). 이것으로 ‘ㅋ 가 있으면 긍정’ 이라는 규칙을 만들면 어디서 틀리는지 쓰시오.
📖 모범 답안

‘ㅋ’ 의 차이는 0.20 대 0.15 로 아주 작다. 그리고 ‘ㅋ’ 가 든 평 119줄 가운데 긍정은 60.5% 이므로 39.5%(47줄)는 부정 평이다 — ‘ㅋㅋ 이걸 돈 주고 봄’ 같은 비웃음이 그렇다.

평균의 차이는 무리 전체의 경향이지 한 줄을 판정하는 규칙이 아니다. 한 줄의 방향을 가르려면 ‘ㅋ’ 앞뒤에 무엇이 왔는지 — 곧 맥락 — 이 필요한데, 우리 아홉 칸에는 그 칸이 없다. 느낌표도 마찬가지다(0.26 대 0.08). 차이가 크게 보여도 ‘!’ 가 든 평 166줄 가운데 28.3%(47줄)는 부정이다.

2. [D]의 결과(‘재미’ 가 든 평 148줄 — 긍정 77 · 부정 71)로 ‘재미’ 라는 속성의 값어치를 평가하시오. 그리고 값어치를 높이려면 이 속성을 어떻게 다시 설계해야 하는지 쓰시오.
📖 모범 답안

값어치가 낮다. 148줄 가운데 긍정 77 · 부정 71 로 거의 반반이라, ‘재미’ 칸이 1 이라는 사실만으로는 그 평이 칭찬인지 불평인지 거의 알 수 없다. 속성의 값어치는 ‘그 칸을 알면 결정이 달라지는가’ 로 잰다.

다시 설계하려면 ① ‘재미’ 뒤에 ‘없’ 이 오는지까지 보는 속성(‘재미없’), ② 띄어쓰기를 통일한 뒤 ‘재미 없다’ 도 같이 묶기, ③ ‘노잼’ · ‘꿀잼’ 처럼 글자가 다른 말도 같은 칸에 넣기 — 곧 낱말 하나가 아니라 뜻 덩어리를 칸으로 삼아야 한다.

그래도 남는 것이 있다. 인용(“재미있다더니”)과 비꼼(‘너무 재밌어서 5분만에 다봄’ — 별점 낮은 평)은 낱말만으로는 끝내 가를 수 없다. 속성을 고쳐도 사라지지 않는 한계가 있다는 것까지 적어야 한다.

3. 측면 표(표 2)를 보고 제작사에 ‘다음 작품에서 가장 먼저 손볼 것’ 을 권하시오. 근거와 한계를 함께 쓰시오.
📖 모범 답안

이야기를 먼저 손본다. 근거는 부정 비율이다 — 이야기는 143줄 가운데 100줄이 불평(69.9%)으로 가장 높다. 연기는 137줄로 가장 많이 언급되지만 38.7% 만 불평이라 대개 칭찬이다. 건수가 아니라 비율로 읽어야 ‘많이 말한 것’ 과 ‘불만인 것’ 을 가를 수 있다.

한계 셋. ① 사전에 없는 표현은 세어지지 않는다 — 평의 86%(1,714줄) 에는 측면 낱말이 하나도 없다. ② 언급 수는 불만의 세기가 아니다(짧은 한 줄이 긴 한 줄보다 덜 화난 것이 아니다). ③ 이 자료는 평점 사이트에 평을 쓴 사람들의 목소리다 — 아주 좋았거나 아주 싫었던 사람이 더 많이 쓴다.

4. 측면 사전에 ‘연출’ · ‘감독’ 을 더했더니 이야기의 평이 143줄에서 197줄로 늘었지만 부정 비율은 69.9%에서 70.6% 로 거의 그대로였다. 사전을 만든 사람이 결과를 어떻게 좌우하는지, 그리고 분석을 공개할 때 무엇을 함께 공개해야 하는지 쓰시오.
📖 모범 답안

사전이 곧 물음이다. 무엇을 ‘이야기’ 로 셀지 정하는 사람이 표의 크기를 정한다 — 두 낱말을 더하자 칸이 38% 커졌다(143 → 197줄). 비율이 거의 안 움직인 것은 이번 두 낱말이 우연히 비슷한 비율로 나뉘었기 때문이고(‘연출’ 24줄 · ‘감독’ 47줄), 다른 낱말이었다면 비율도 움직였을 것이다. ‘감독’ 은 작품이 아니라 사람을 가리키는 평까지 끌어온다는 점도 함께 봐야 한다.

공개할 것 — ① 사전의 낱말 목록, ② 세는 규칙(부분 문자열로 찾았는지, 띄어쓰기를 어떻게 다뤘는지), ③ 자료를 어떻게 고르고 걸렀는지, ④ 세어지지 않은 줄 수. 이 넷이 있어야 다른 사람이 검토하고 다시 해 볼 수 있다.

이 교과서도 같은 것을 밝힌다 — 평 2,000줄은 NSMC 20만 줄에서 긍정·부정 1,000줄씩 무작위로 뽑되, 비속어·혐오 표현이 든 줄은 낱말 목록과 사람의 눈으로 걸러 267줄을 빼고 다시 채웠다. 다만 거른 낱말 목록 자체는 싣지 않는다 — 그 목록이 곧 혐오 표현 모음이 되기 때문이다. 기준은 밝히고 목록은 싣지 않는 것도 공개의 한 방법이다.

5. 평 한 줄을 아홉 칸 행으로 바꾸면 정보가 늘어나는가, 줄어드는가? 오늘의 출력 가운데 하나를 근거로 들어 쓰시오.
📖 모범 답안

한 줄이 가진 정보는 줄어든다. 근거 ① — [E]의 비꼼 평 ‘너무 재밌어서 5분만에 다봄’(별점 낮음)의 행은 15자 4어절, 측면 넷이 모두 0 이다. 이 행만 받은 사람은 원문이 칭찬이었는지 불평이었는지 알 수 없다. 근거 ② — [F′]에서 순서만 바꾼 두 평(‘의외로 재밌네 별로 기대 안 했는데’ / ‘기대 했는데 의외로 별로 안 재밌네’)은 세 눈 모두에서 같은 행이다. 순서가 들어갈 칸이 없기 때문이다.

대신 얻는 것이 있다. 2,000줄을 한꺼번에 세고 견주고 정렬할 수 있게 된다 — 측면별 부정 비율(표 2)은 표가 없으면 하루를 읽어도 나오지 않는 숫자다. 구조화는 바꿔 얻는 일이다. 그래서 ‘줄어든다/늘어난다’ 가 아니라 무엇을 버리고 무엇을 얻었는지를 적는 것이 맞다.

6. [F]에서 CountVectorizer 기본 설정으로 센 칸이 손으로 센 것보다 적었다(8,612 대 9,315). 아래 표를 채운 뒤, 이 기본 설정으로 한국어 평의 긍정·부정을 따지면 어떤 일이 생길지 [D]와 이어 쓰시오.
무엇도구가 대신 해 준 것도구가 말없이 정한 것
칸 만들기
낱말 자르기
표 저장
📖 모범 답안

표 — 칸 만들기: 2,000줄을 훑어 낱말 목록 8,612개를 대신 만들어 주었다 / 두 글자 이상만 낱말로 친다고 말없이 정했다. 낱말 자르기: 붙은 문장부호를 떼어 내고 대문자를 소문자로 바꾸어 주었다 / 그 결과 손으로는 ‘…하다.’ 였던 어절이 ‘하다’ 라는 새 칸이 되었다(하다 8 · 없네요 6 · 영화네요 6 · 알았다 4). 표 저장: 1,722만 칸 가운데 0 이 아닌 13,367칸(0.08%) 만 적어 두어 기억 공간을 아껴 주었다 / 0 과 ‘없음’ 을 같은 것으로 다룬다.

빠진 것 — 한 글자 낱말이 통째로 사라진다(이 65 · 더 45 · 수 42 · 잘 42 …). 그 가운데 부정 낱말 ‘안’ 이 16번에서 0번이 된다. 그래서 ‘안 봄’ · ‘못 봄’ 처럼 방향을 가르는 말이 표에서 지워진다 — [D]에서 ‘재미’ 와 ‘없다’ 의 관계가 사라진 것과 같은 일이 한 번 더 일어나는 셈이다. [F′]이 그 결과를 보여 준다: ‘큭 웃긴다’ 와 ‘안 웃긴다’ 가 도구 기본에서는 같은 행이다.

도구가 틀린 것이 아니다. 설정 둘(token_pattern · lowercase)을 손으로 센 규칙에 맞추자 칸이 9,315개로 한 칸도 다르지 않게 되었다(같나: True). 도구는 다른 규칙을 골랐을 뿐이고, 그 규칙은 손으로 센 것과 한 번 견줘 봐야 보인다. 도구를 처음 쓸 때 이 대조를 한 번 하는 것이 오늘의 규칙이다.

+
더 알아보기

세는 일이 바꾼 이야기 셋

1,000낱말마다 ‘upon’ 이 몇 번저자가 다투어진 논설 12편을 가른 낱말해밀턴약 3.0번매디슨약 0.2번0123scikit-learn 의 영어 불용어 목록 318낱말theofanduponisto저자를 가른 그 낱말이 ‘흔해서 버려도 되는 말’ 칸에 들어 있다.stop_words='english' 를 켜는 순간 이 연구는 불가능해진다.
역사

낱말을 세어 저자를 찾다

미국 헌법을 옹호한 신문 논설 모음 「연방주의자 논집」에는 저자가 누구인지 다투어진 논설 12편이 있습니다. 해밀턴과 매디슨이 서로 자기 글이라고 했거든요. 1964년 통계학자 모스텔러와 월리스는 내용 낱말이 아니라 버릇 낱말을 세었습니다 — ‘upon’ · ‘whilst’ 처럼 뜻은 거의 없지만 사람마다 쓰는 빈도가 다른 말이지요.

해밀턴은 ‘upon’ 을 즐겨 썼고 매디슨은 거의 쓰지 않았습니다. 두 사람의 빈도가 크게 갈리니, 다투어진 12편에서 그 낱말을 세는 것만으로 저자를 매디슨 쪽으로 판정할 수 있었어요. 오늘 우리가 ‘무엇을 칸으로 삼을까’ 를 고른 것과 같은 일입니다 — 고른 칸이 답을 만들었습니다.

덧붙여, scikit-learn 에는 영어 불용어 목록(stop_words='english', 318낱말)이 있는데 거기에 ‘upon’ 이 들어 있습니다. 저자를 가른 바로 그 낱말을 ‘흔해서 버려도 되는 말’ 로 치는 설정이 도구에 이미 준비돼 있는 것이지요. [F]에서 본 ‘도구가 말없이 정한 것’ 과 같은 이야기입니다.

도해: 두 저자의 1,000낱말당 ‘upon’ 빈도(널리 인용되는 어림값 — 해밀턴 약 3번 · 매디슨 약 0.2번)와, scikit-learn 불용어 목록 안의 ‘upon’. · 출처: F. Mosteller & D. L. Wallace, Inference and Disputed Authorship: The Federalist, 1964 · 불용어 목록은 scikit-learn 문서의 ENGLISH_STOP_WORDS

① 인터넷 평점에 흔한 J자 모양아주 좋거나 아주 싫은 사람이 더 쓴다 — 모양만 보인 그림★★★★★★★★★★★★★★★② 우리가 고른 2,000줄긍정·부정을 1,000줄씩 — 우리가 만든 모양이다부정 1,000긍정 1,000표를 만들기 전에 이미 한 번 고른 것이다 —우리 표의 ‘긍정 절반’ 은 세상이 아니라 우리 선택이다.
자료를 의심하기

평은 누가 쓰나 — 그리고 우리가 고른 2,000줄

인터넷 평점은 아주 좋았거나 아주 싫었던 사람이 더 많이 씁니다. 별 다섯 개짜리와 별 하나짜리가 양 끝에 몰리고 가운데가 패는 J자 모양이 자주 나타나는 까닭이에요. 그래서 평점의 ‘평균’ 은 본 사람 전체의 생각이 아니라 쓴 사람들의 생각입니다.

오늘 우리 자료는 한 번 더 고른 것입니다. 20만 줄에서 긍정 1,000줄 · 부정 1,000줄을 일부러 같은 수로 뽑았거든요. 덕분에 ‘긍정 평이 더 길다’(33.64자 대 31.73자) 같은 비교는 깔끔해지지만, “평의 절반이 긍정이다” 라고 말하면 틀립니다. 그 절반은 세상이 아니라 우리가 만든 것이니까요.

표를 만들기 전에 이미 두 번의 고르기가 있었던 셈입니다 — 누가 평을 쓰는가, 그리고 우리가 어느 줄을 가져왔는가. Ⅱ 단원에서 이 ‘고르기’ 를 정면으로 다룹니다.

도해 ①은 인터넷 평점에서 자주 나타나는 J자 모양만 보인 그림이다(특정 자료의 값이 아니다). 도해 ②의 1,000 · 1,000 은 우리 자료 nsmc_2000.csv 의 실제 구성이다. · 자료: NSMC(e9t, CC0 1.0)

고객의 소리를 표로 바꾸는 한 주들어오는 글상담 녹취 · 게시판 · 앱 리뷰1측면 사전배송 · 요금 · 친절 · 품질2측면 × 감정 표건수와 부정 비율3주간 보고가장 많이 늘어난 불만 하나4사전을 고치는 일이 이 사람의 일이다‘교환’ 이 불만인지 문의인지는 사전이 정한다
현장

고객의 소리를 표로 바꾸는 사람

기업과 공공기관에는 상담 녹취 · 게시판 글 · 앱 리뷰가 매일 쌓입니다. 이것을 읽는 대신 세어 “이번 주에 가장 많이 늘어난 불만은 무엇인가” 를 보고하는 일을 고객의 소리(VOC) 분석이라고 합니다. 오늘 만든 측면 사전이 현장에서는 ‘배송 · 요금 · 친절 · 품질’ 같은 목록이 되지요.

이 일의 절반은 사전을 고치는 일입니다. ‘교환’ 이라는 말이 불만인지 단순 문의인지는 자료가 알려 주지 않고 분석가가 정합니다. 새 제품이 나오면 새 낱말이 생기고, 그때마다 지난 달과 이번 달의 숫자를 그대로 견줄 수 없게 됩니다 — 사전이 바뀌면 칸이 바뀌니까요.

그래서 이 자리에 필요한 힘은 프로그래밍만이 아닙니다. 말을 다루는 감각(같은 뜻의 다른 표현을 알아보는 눈), 현업과 이야기하는 힘(무엇을 결정하려는지 먼저 묻기), 그리고 바뀐 기준을 정직하게 적는 습관이지요.

도해: 고객의 소리 분석의 네 단계와, 사전을 고치는 일이 분석가의 몫이라는 설명. 특정 기업의 절차가 아니라 이 일의 얼개를 보인 그림이다.