2주차: 언어와 말뭉치, 텍스트 전처리와 단어 분포
언어와 말뭉치, 텍스트 전처리와 단어 분포.
□ 이번 주에 하는 일
- 글을 모아 둔 더미를 말뭉치라고 부른다는 것과, 말뭉치를 사용할 때 출처·범위·이용 조건을 기록해야 한다는 것을 본다
- 1주차에서 미뤄 둔 “말을 어떤 기준으로 자를 것인가”에 답한다. 자르는 기준이 여러 개이고 기준마다 결과가 달라진다
- 잘라 놓은 조각을 세어 본다. 세어 보면 언어가 달라도 자료가 달라도 거의 같은 모양이 하나 나타난다
□ 1주차에서 이어지는 자리
1주차 마지막에 이렇게 적어 두었다.
- “말을 어떤 기준으로 자를지는 2주차에서 다룬다”
- “
혼저 옵서예를 두 덩어리로 볼지 더 잘게 나눌지에 따라 확률표의 모양 자체가 달라지기 때문이다”
이번 주가 그 약속을 갚는 자리다. 자르는 일을 제대로 보고 나면, 3주차에서 만들 확률표가 왜 자르는 기준에 따라 달라지는지도 저절로 이해된다.
□ 이 문서를 읽는 법
- 수식은 한 개도 나오지 않는다. 계산은 나눗셈과 세기까지만 한다
- 표에 적힌 숫자는 따로 밝히지 않는 한 설명하려고 정한 값이다. 실제 자료를 센 값이 아니다
- 대면 실습에서 나오는
15,13,제주 2같은 값만 예외다. 그것들은 제시된 네 문장에서 직접 세어 확인할 수 있다
온라인 (2시수)
Section titled “온라인 (2시수)”강의 1: 말뭉치와 토큰, 글을 모으고 자르는 일
Section titled “강의 1: 말뭉치와 토큰, 글을 모으고 자르는 일”□ 말뭉치란 무엇인가
말뭉치는 컴퓨터가 읽을 수 있게 모아 둔 글 더미다. 영어로는 corpus이고 코퍼스라고도 부른다.
여기서 중요한 것은 “많다”가 아니다. 글을 모으면 말뭉치로 부를 수 있지만, 분석에 쓸 때는 무엇을 왜 모았는지 기록해야 결과를 해석할 수 있다.
장바구니에 비유하면 이렇다. 물건이 가득 담긴 장바구니가 있다. 그런데 영수증이 없으면 어디서 샀는지, 얼마였는지, 언제 산 것인지 알 수 없다. 나중에 무언가 잘못됐을 때 되짚을 곳이 없다. 말뭉치도 마찬가지다.
○ 말뭉치에 반드시 적어 두는 네 가지
| 적어 둘 것 | 왜 필요한가 | 안 적어 두면 |
|---|---|---|
| 출처 | 어디서 가져왔는지 | 결과가 이상할 때 되짚을 곳이 없다 |
| 규모 | 글이 몇 편이고 조각이 몇 개인지 | 다른 결과와 비교할 수 없다 |
| 범위 | 어떤 종류의 글인지 | 엉뚱한 데 갖다 쓰게 된다 |
| 이용 조건 | 써도 되는 자료인지 | 쓰면 안 되는 자료를 쓰게 된다 |
셋째 줄의 “범위”를 조금 더 보자. 관광 후기만 모은 말뭉치는 관광 말투만 담는다. 그 말뭉치로 만든 빈도표를 학과 공지에 갖다 대면 맞지 않는다. 공지에는 “너무 좋았어요”가 거의 안 나오고 “안내”, “바랍니다”가 자주 나오기 때문이다.
1주차에서 “읽은 글에 치우침이 있으면 확률에도 그대로 남는다”고 했다. 그 치우침이 시작되는 자리가 바로 여기, 무엇을 모을지 정하는 순간이다. 이 문제를 본격적으로 다루는 것은 14주차다.
한 가지 더 짚어 두자. 모으는 양을 늘린다고 범위 문제가 해결되지는 않는다. 관광 후기를 열 배로 늘려도 여전히 관광 말투만 잔뜩 모일 뿐이다. 양이 늘면 숫자는 안정되지만 치우침은 그대로 남는다. 오히려 양이 많아진 만큼 “이 정도면 충분하겠지”라고 안심하게 되어 더 위험할 수 있다.
그래서 말뭉치를 고를 때 던져야 할 질문은 “얼마나 많은가”가 아니라 **“내가 답하려는 질문과 같은 종류의 글인가”**다.
○ 제주에서 구할 수 있는 말뭉치
공개 자료의 접근 경로는 자료 출처에 정리돼 있다. 이 주차 노트북의 네 문장과 방언 대응쌍은 원문 자료에서 추출한 실측 말뭉치가 아니라, 자르기와 세기를 설명하는 수업용 가공 예시다. 공개 포털 소개와 실제 사용한 예시를 구분한다.
| 무엇이 들어 있나 | 이 수업에서 쓰는 자리 |
|---|---|
| 제주 관련 공공 문서와 통계 | 빈도 세기 실습의 기본 재료 |
| 관광지 소개와 이용 안내 글 | 상위 단어 목록을 만들어 보는 활동 |
| 한국어 방언 발화 자료 | 공개 자료의 종류와 접근 경로 소개. 이 주차는 제공 대응쌍 예시로 구조 관찰 |
도내 기업 자료는 쓰지 않는다. 기업이 등장하는 예제는 전부 “이런 조건을 가진 곳이 있다면”이라는 상정이다.
□ 원문을 그대로 셀 수는 없다
웹에서 긁어 온 글에는 표시 부호, 빈 줄, 같은 문장의 중복이 섞여 있다. 세기 전에 손질하는 단계를 전처리라고 부른다.
전처리를 “정리 정돈”으로 생각하면 요점을 놓친다. 이 단계에서 하는 일은 의도적으로 버리는 것이다. 그림의 아랫줄이 각 단계에서 무엇이 빠지는지를 보여 준다.
그리고 처리된 글만 남기면 버린 정보를 복원하기 어렵다. 문장부호를 모두 떼어 낸 뒤에는 어떤 문장이 물음표로 끝났는지 알 수 없다. 원문은 별도로 보존하고 처리된 사본을 만든다. 그래서 무엇을 버렸는지 적어 두는 습관이 필요하다.
무엇을 버릴지는 하려는 일에 따라 달라진다. 몇 가지 예를 보자.
| 버릴까 말까 | 버려도 되는 경우 | 버리면 안 되는 경우 |
|---|---|---|
| 물음표와 느낌표 | 어떤 주제의 글인지 알아볼 때 | 질문인지 아닌지 가려낼 때 |
| 숫자 | 글의 분위기를 볼 때 | 날짜나 가격을 뽑아낼 때 |
| 이모지 | 공문서를 다룰 때 | 후기의 감정을 볼 때 |
| 중복된 문장 | 대부분의 경우 | 같은 문장이 몇 번 퍼졌는지 셀 때 |
정해진 답이 없다는 것이 요점이다. 교재나 남의 코드에 있는 전처리를 그대로 가져다 쓰면 내 목적에 필요한 것까지 버리게 되는 일이 생긴다.
□ 토큰과 토큰화
이제 1주차에서 “단어”라고만 부르던 것을 갈라 준다.
- 토큰은 정한 기준대로 잘라 낸 조각 하나다
- 토큰화는 글을 토큰으로 자르는 일이다
단어와 토큰은 비슷하지만 같지 않다. 단어는 사람이 뜻을 기준으로 삼는 개념이고, 토큰은 자르는 기준이 만들어 낸 결과다. 기준을 바꾸면 같은 문장에서 다른 토큰이 나온다. 문장에 든 단어 수가 바뀐 것이 아니라 자른 방법이 바뀐 것이다.
○ 같은 문장을 네 기준으로 잘라 보기
문장 하나로 확인한다. 제주에서 고기국수를 먹었다.
| 자르는 기준 | 나온 조각 | 조각 수 | 좋은 점 | 아쉬운 점 |
|---|---|---|---|---|
| 글자 하나씩 (공백 제외) | 제 / 주 / 에 / 서 / 고 / 기 / 국 / 수 / 를 / 먹 / 었 / 다 / . | 13 | 어떤 글에도 쓸 수 있다 | 조각 하나하나에 뜻이 없다 |
| 띄어쓰기 | 제주에서 / 고기국수를 / 먹었다. | 3 | 규칙이 단순하고 빠르다 | 조사가 붙어 있고 마침표가 딸려 온다 |
| 띄어쓰기 + 부호 떼기 | 제주에서 / 고기국수를 / 먹었다 / . | 4 | 마침표가 떨어졌다 | 조사는 그대로 붙어 있다 |
| 뜻 단위 | 제주 / 에서 / 고기국수 / 를 / 먹었다 / . | 6 | 제주와 고기국수가 따로 잡힌다 | 이 줄은 사람이 손으로 잘랐다 |
마지막 줄에 단서를 달아 둔다. 이 줄은 사람이 손으로 잘랐다. 기계가 자동으로 이렇게 자르는 도구가 있고 4주차에 쓴다. 이번 주에는 띄어쓰기로 자르는 방법과 그 한계까지만 본다.
여기서 1주차에 남겨 둔 두 가지를 회수한다.
아버지가방에들어가신다를 띄어쓰기로 자르면 한 조각이다. 띄어쓰기가 없는 글에 띄어쓰기 기준을 쓰면 아무 일도 일어나지 않는다혼저 옵서예를 띄어쓰기로 자르면 두 조각이지만 뜻으로는 인사말 하나다. 조각 수와 뜻의 개수가 맞지 않는 반대 방향 사례다
○ 영어와 한국어는 왜 다른가
같은 뜻의 영어 문장을 잘라 보자. We ate noodles in Jeju.
| 자르는 기준 | 나온 조각 | 조각 수 |
|---|---|---|
| 띄어쓰기 | We / ate / noodles / in / Jeju. | 5 |
| 띄어쓰기 + 부호 떼기 | We / ate / noodles / in / Jeju / . | 6 |
영어는 “in”이 앞뒤로 띄어져 있어서 띄어쓰기만으로도 뜻 단위와 거의 맞아떨어진다. 한국어의 “에서”는 앞말에 딱 붙어 있어서 띄어쓰기로는 떨어지지 않는다.
조사와 어미가 붙는 방식은 영어 예제를 한국어에 옮길 때 확인할 차이 중 하나다. 영어도 walked처럼 형태가 바뀌며, 문맥·복합어·축약형 때문에 띄어쓰기만으로 모든 문제가 풀리지는 않는다. 교재를 읽을 때 이 차이를 염두에 두면 훨씬 수월하다.
정리하면 이렇다.
| 영어 | 한국어 | |
|---|---|---|
| 띄어쓰기로 자르면 | 뜻 단위와 거의 맞는다 | 조사가 붙어 온다 |
| 같은 말의 형태 | walk / walked처럼 형태가 바뀐다 | 조사와 어미에 따라 여러 꼴이 된다 |
| 띄어쓰기가 틀리면 | 자르는 경계가 어긋날 수 있다 | 조사가 붙은 경계까지 함께 어긋날 수 있다 |
○ 어떤 기준을 골라야 하는가
네 기준 중 무엇이 정답일까. 하려는 일에 따라 다르다가 답이다.
- 글자 하나씩 자르는 방법은 조각에 뜻이 없지만 어떤 글에도 통한다. 띄어쓰기가 없는 글이나 처음 보는 언어에도 쓸 수 있다
- 띄어쓰기로 자르는 방법은 빠르고 단순해서 이 수업의 실습에서 쓴다. 한계를 알고 쓰면 된다
- 형태소 같은 단위로 자르는 방법은 조사와 어미를 따로 관찰하는 데 유용하지만 도구·사전·목적에 따라 경계가 달라지고 오류도 생긴다
이 수업에서는 띄어쓰기로 자르는 방법을 쓰되 그것이 무엇을 놓치는지 함께 본다. 놓치는 것을 알고 쓰는 것과 모르고 쓰는 것은 결과 해석에서 크게 갈린다.
강의 2: 세어 보면 보이는 것
Section titled “강의 2: 세어 보면 보이는 것”□ 종류와 개수는 다르다
세기 전에 말을 하나 갈라 두자. 아래 두 가지는 다른 것이다.
- 전체 개수: 조각이 모두 몇 개인가. 같은 말이 열 번 나오면 열 개다
- 종류 수: 서로 다른 말이 몇 가지인가. 같은 말이 열 번 나와도 한 종이다
대면 실습에서 쓸 네 문장은 조각이 15개인데 종류는 13종이다. 두 번 나온 말이 둘 있기 때문이다. 이 구분은 뒤에 나올 Zipf 법칙을 이해하는 데 반드시 필요하다.
□ 상위 10개에 무엇이 올라오는가
관광 후기 같은 글을 모아 띄어쓰기로 자르고 많이 나온 순서로 놓으면 어떤 모양이 될지 보자.
아래 표는 실제로 어떤 자료를 센 결과가 아니라, 설명하려고 지어낸 숫자다. 대면 실습은 제공된 네 문장 가공 예시를 직접 센다. 자료가 매우 작으므로 여기와 같은 분포 모양이 나타난다고 보장할 수 없다.
| 순위 | 단어 | 나온 횟수 |
|---|---|---|
| 1 | 너무 | 1200 |
| 2 | 정말 | 600 |
| 3 | 좋았어요 | 400 |
| 4 | 그리고 | 300 |
| 5 | 제주 | 240 |
| 6 | 바다 | 200 |
| 7 | 있어요 | 170 |
| 8 | 다시 | 150 |
| 9 | 커피 | 133 |
| 10 | 사진 | 120 |
기대와 다를 것이다. 관광 후기이니 “제주”, “바다”, “흑돼지”가 앞에 올 것 같은데 1등은 “너무”이고 2등은 “정말”이다. “그리고”가 4등이다.
많이 나온 말과 중요한 말은 같지 않다. 이 어긋남이 다음 이야기로 이어진다.
□ 불용어
불용어는 자주 나오지만 그 자료의 내용을 가려내는 데 도움이 안 되는 말이다.
체로 거르는 일과 같다. 모양이 제각각인 큰 돌은 체 위에 남고, 어디에나 있는 똑같이 생긴 잔자갈은 아래로 빠진다. “너무”와 “정말”은 어느 후기에나 나오니 글을 구별해 주지 못한다.
네 개를 빼고 다시 세어 보자.
| 제거 전 상위 6 | 횟수 | 제거 후 상위 6 | 횟수 |
|---|---|---|---|
| 너무 | 1200 | 좋았어요 | 400 |
| 정말 | 600 | 제주 | 240 |
| 좋았어요 | 400 | 바다 | 200 |
| 그리고 | 300 | 있어요 | 170 |
| 제주 | 240 | 커피 | 133 |
| 바다 | 200 | 사진 | 120 |
이제 관광 후기다운 목록이 됐다.
○ 불용어 목록에 정답은 없다
그런데 빼는 것이 늘 이득은 아니다. 무엇을 하려는지에 따라 갈린다.
후기가 만족인지 불만인지 가려내려는 일이라면 사정이 정반대다. 별로 안 좋았어요 에서 “별로”와 “안”을 불용어라고 빼 버리면 좋았어요 만 남아 뜻이 정반대가 된다. “너무”도 마찬가지다. “너무 좋았어요”와 “좋았어요”는 강도가 다른데 그 차이가 사라진다.
그러니 불용어 목록은 어디선가 받아 오는 정답이 아니라 이번 작업에서 무엇을 보려는지에 맞춰 고르는 것이다. 무엇을 넣었는지 적어 두면 나중에 결과가 이상할 때 되짚을 수 있다. 만족과 불만을 가려내는 일은 5주차에서 다룬다.
□ 조사 때문에 빈도가 흩어진다
강의 1에서 본 조사 문제를 이제 세기 관점에서 다시 본다. 다섯 문장짜리 말뭉치를 보자.
제주는 섬이다제주가 좋다제주를 걷는다제주에서 먹는다제주까지 간다
| 띄어쓰기로 자른 조각 | 횟수 |
|---|---|
| 제주는 | 1 |
| 제주가 | 1 |
| 제주를 | 1 |
| 제주에서 | 1 |
| 제주까지 | 1 |
| 뜻으로 묶으면 | 횟수 |
|---|---|
| 제주 | 5 |
다섯 문장 전부에 나온 말인데 띄어쓰기로 세면 어느 조각도 1회를 넘지 못한다. 상위 목록을 만들면 “제주”는 아예 보이지 않는다. 사실상 이 말뭉치에서 가장 많이 나온 말인데도 그렇다.
1주차에서 “제주, 제주가, 제주를, 제주에서는 글자로만 보면 서로 다른 덩어리다”라고 했던 말의 결과가 이것이다. 조사를 떼어 내는 방법은 4주차에서 다룬다.
□ Zipf 법칙
이제 이번 주의 마지막 이야기다. 앞의 상위 10개 표를 다시 보되 옆 순위와 견주어 보자.
| 순위 | 단어 | 나온 횟수 | 앞 순위와 비교 |
|---|---|---|---|
| 1 | 너무 | 1200 | |
| 2 | 정말 | 600 | 1등의 절반 |
| 3 | 좋았어요 | 400 | 2등의 1.5분의 1 |
| 4 | 그리고 | 300 | 3등의 1.33분의 1 |
| 5 | 제주 | 240 | 4등의 1.25분의 1 |
| 10 | 사진 | 120 | 5등의 절반 |
표에서 세 곳만 확인해 보자.
- 1등과 2등: 1200과 600이다. 절반이다
- 2등과 4등: 600과 300이다. 절반이다
- 5등과 10등: 240과 120이다. 절반이다
순위가 두 배가 되면 나온 횟수는 대략 절반이 된다. 이것이 Zipf 법칙이다.
○ 머리와 꼬리
같은 자료를 다른 각도에서 보자. 전체 조각 10,000개, 단어 종류 2,000종이라고 하자.
| 단어 종류 | 종류의 몫 | 나온 횟수 합 | 횟수의 몫 | |
|---|---|---|---|---|
| 상위 10종 | 10종 | 0.5퍼센트 | 3,513번 | 약 35퍼센트 |
| 딱 한 번만 나온 말 | 800종 | 40퍼센트 | 800번 | 8퍼센트 |
상위 10종은 종류로 따지면 200분의 1인데 나온 횟수로는 3분의 1을 넘게 가져간다. 반대로 딱 한 번만 나온 말은 종류로는 40퍼센트나 되는데 횟수로는 8퍼센트다.
해변에 비유하면 큰 바위 몇 개와 끝없는 잔자갈이다. 눈에 띄는 것은 바위지만 개수로는 자갈이 압도적이다.
○ “법칙”이라는 이름에 대하여
한 가지 오해를 막아 두자. Zipf 법칙은 계산해서 딱 맞아떨어지는 식이 아니다. 여러 자료를 세어 보니 늘 비슷한 모양이 나오더라는 관찰이고, 그 관찰에 이름을 붙인 것이다.
실제로 세어 보면 1등이 2등의 1.8배일 수도 있고 2.3배일 수도 있다. 값어치는 정확도가 아니라 어디서나 비슷하게 나온다는 데 있다. 한국어든 영어든, 관광 후기든 신문 기사든 모양이 같다.
새 자료에서 모양이 다르면 자료의 크기·종류·중복·자르는 기준을 다시 살펴볼 단서가 된다. 작은 자료나 특정 양식의 글은 다르게 보일 수 있으며, 모양이 다르다는 것만으로 잘못된 자료라고 판정하지 않는다.
예를 들어 이런 경우다.
- 1등과 2등의 횟수가 비슷비슷하고 뒤로도 완만하게 줄어든다면, 같은 문장이 여러 번 복사돼 들어갔거나 자동으로 생성된 글이 섞였을 수 있다
- 한 번만 나온 말이 거의 없다면 자료가 너무 작거나 특정 양식 문서만 모였을 수 있다
- 1등이 지나치게 압도적이라면 표시 부호나 빈 칸이 조각으로 세어지고 있을 수 있다
이렇게 기대와 다른 모양의 원인을 실제 원문에서 점검할 수 있다. 모양만으로 원인이 확정되지는 않는다. 이것이 Zipf 법칙을 배우는 실용적인 이유 중 하나다.
○ 이것이 왜 중요한가
두 가지 때문이다.
- 자료를 아무리 늘려도 처음 보는 말은 계속 나온다. 꼬리가 끝나지 않기 때문이다
- 그래서 3주차에 세어 만들 확률표에는 한 번도 본 적 없는 자리가 늘 남는다
1주차에서 “세어 본 적 없는 말은 다룰 수 없다”고 했던 문제가 여기서 정량적으로 확인된다.
□ 강의 2에서 꼭 가져갈 것
- 자르는 기준을 정해야 셀 수 있고, 기준이 달라지면 세어진 결과가 달라진다
- 많이 나온 말과 중요한 말은 같지 않다
- 자주 나오는 소수가 전체의 큰 몫을 가져가고, 한 번만 나온 말이 종류로는 훨씬 많다
- 꼬리는 끝나지 않는다. 처음 보는 말은 계속 나온다
여기까지가 화면으로 보는 부분이고, 직접 돌려 보는 것은 대면 시간이다. 이번 주에 잘라 놓은 조각을 세어 확률표를 만드는 일이 3주차다.
□ 활동 A: 눈으로 세어 10개 고르기
코드를 열기 전에 손으로 먼저 센다. 순서가 중요하다.
제공되는 글은 제주 관련 짧은 글 묶음이고 노트북 1-1 셀과 이 페이지에 함께 실려 있다.
- 코드를 열지 않고 글을 읽는다
- 많이 나왔다고 생각하는 말 10개를 순서대로 적는다
- 각각 몇 번쯤 나왔을지 숫자도 적는다
| 내 예상 순위 | 단어 | 예상 횟수 | 실제 횟수 | 맞았나 |
|---|---|---|---|---|
| 1 | ||||
| 2 |
실제 횟수 칸은 대면 실습에서 채운다.
□ 활동 B: 예상이 왜 빗나갈지 미리 적어 보기
예상 10개를 적은 뒤 아래 두 질문에 답을 미리 적어 둔다.
- 내가 고른 10개 중에 “너무”, “정말”, “그리고” 같은 말이 있는가
- 없다면 왜 안 골랐는가
사람은 내용이 있는 말을 기억하고 자주 나오는 연결어는 기억하지 못한다. 이 어긋남을 스스로 확인하는 것이 활동의 목적이다.
□ 기록할 때 유의할 점
- 예상이 틀려도 그대로 둔다. 고치면 활동이 무의미해진다
- 띄어쓰기 기준으로 세는 것이니 “제주”와 “제주에서”는 따로 센다
- 숫자를 정확히 맞히는 것이 목표가 아니라 순서를 맞히는 것이 목표다
대면 (1시수)
Section titled “대면 (1시수)”두 명씩 짝을 짓되 1학년과 2학년을 섞어 앉는다. 노트북에는 기본 과제와 심화 과제가 나뉘어 있고, 2학년은 심화 쪽을 맡아 짝에게 설명한다.
실습 1: 단어 빈도 집계
Section titled “실습 1: 단어 빈도 집계”□ 잘라서 세기
text = """제주 바다는 오늘도 푸르다제주에서 고기국수를 먹었다바다가 보이는 카페에 갔다제주 바다는 정말 좋았다"""
tokens = text.split()print(len(tokens))print(tokens[:5])출력은 15 와 ['제주', '바다는', '오늘도', '푸르다', '제주에서'] 다.
from collections import Counter
counter = Counter(tokens)print(len(counter))print(counter.most_common(5))출력은 13 과 [('제주', 2), ('바다는', 2), ('오늘도', 1), ('푸르다', 1), ('제주에서', 1)] 이다.
□ 출력을 읽는 법
| 나오는 줄 | 뜻 |
|---|---|
15 | 띄어쓰기로 자른 조각이 모두 15개다 |
13 | 서로 다른 말은 13종이다. 두 번 나온 말이 둘 있다 |
[('제주', 2), ...] | 괄호 한 쌍이 말 하나와 그 횟수다. 많이 나온 순서로 놓여 있다 |
이 작은 예제 하나에 강의 2의 개념 두 개가 그대로 들어 있다.
- 조각은 15개인데 종류는 13종이다. 개수와 종류가 다르다를 손으로 확인한 것이다
- “바다는” 2회와 “바다가” 1회가 따로 세어진다. 조사를 떼어 바다로 묶으면 3회로 1위인데 띄어쓰기로 세면 2회에 머문다. 조사 때문에 흩어지는 문제가 네 문장에서 그대로 재현된다
□ 불용어 빼기
stopwords = ["오늘도", "정말"] # TODO: 빼고 싶은 말을 여기에 더 넣어 본다
kept = [t for t in tokens if t not in stopwords]print(Counter(kept).most_common(5))TODO는 이 한 줄뿐이고, 손대지 않아도 노트북은 끝까지 돈다.
심화 과제는 제공된 심화 셀을 그대로 실행하고, 파일에서 읽은 불용어 목록이 TODO 셀의 목록과 어떻게 다른지 설명하는 것이다. 별도 파일을 편집할 필요 없이 상위 10개 두 표에서 달라진 말과 남은 말을 비교한다. 학생이 바꾸는 곳은 TODO 한 줄이다.
□ 자주 나는 오류
| 증상 | 원인 | 조치 |
|---|---|---|
| 그래프의 한글이 네모로 나온다 | 그림 도구에 한글 글꼴이 없다 | 노트북 맨 위의 글꼴 준비 셀을 실행한 뒤 그래프 셀을 다시 실행한다. 준비가 실패하면 막대의 번호와 함께 출력되는 한글 표를 대조한다 |
NameError: name 'Counter' is not defined | from collections import Counter 셀을 건너뛰었다 | 맨 위 셀부터 차례로 실행한다 |
| 빈도표가 비어 있다 | 입력이 빈 문자열이거나 모든 토큰이 불용어로 빠졌다 | 입력 토큰 수와 불용어 제거 후 수를 확인한다 |
실습 2: 분포 그리기와 방언 대응쌍
Section titled “실습 2: 분포 그리기와 방언 대응쌍”□ 막대그래프로 그리기
상위 10개를 막대그래프로 그린다. 앞에서 본 Zipf 모양이 이 작은 말뭉치에서도 어렴풋이 보이는지 확인한다. 네 문장뿐이라 또렷하지는 않을 것이다. 그것 자체가 관찰 결과다.
□ 방언 대응쌍 열어 보기
같은 뜻을 방언과 표준어로 짝지어 둔 자료를 소개 수준으로 열어 본다.
| 방언 표현 | 표준어 | 띄어쓰기로 자른 조각 수 |
|---|---|---|
| 혼저 옵서예 | 어서 오세요 | 2 대 2 |
| 폭삭 속았수다 | 정말 수고하셨습니다 | 2 대 2 |
| 감수광 | 가십니까 | 1 대 1 |
여기서 세 가지를 확인한다.
- 뜻이 같은데 띄어쓰기로 자른 조각이 하나도 겹치지 않는다. 빈도표에서는 완전히 다른 조각으로 세어진다
- 표준어 자료로 만든 불용어 목록이 방언 자료에도 맞는지 별도로 확인한다. 같은 기능의 말이라도 표기가 다르면 목록에서 빠질 수 있다
- 그래서 말뭉치를 무엇으로 모았는가가 그 뒤의 모든 숫자를 바꾼다
위 세 쌍은 표현 차이를 보여 주기 위한 수업용 대응 예시이며, 원본 데이터셋에서 추출한 기록이 아니다. 노트북에는 이 세 쌍이 이미 들어 있다. 문장 뜻의 세부 뉘앙스는 상황에 따라 달라질 수 있으므로 방언 번역의 정답표로 사용하지 않는다. 원본 데이터셋의 규모나 이용 조건은 이 예시 실행만으로 확인되지 않는다. 방언을 다루는 방법 자체는 이 과목의 범위가 아니다.
□ 오늘 확인할 것
15와13을 눈으로 확인했다- 불용어를 넣고 뺀 두 결과의 상위 10개가 다르다는 것을 확인했다
- 활동 A의 예상표에 실제 횟수를 채웠다
□ 기본·심화 학습 경로
- 기본: 기본 네 문장의 15토큰·13종과 TODO 불용어 목록 적용 전후 빈도 비교
- 심화: 제공 심화 셀을 그대로 실행해 파일 불용어 목록과 TODO 목록의 차이 해석. 작은 표본에서 Zipf 형태를 확정하기 어려운 이유 설명
- 두 경로 모두 제공 코드를 실행한 결과 해석 중심. 추가 구현이나 별도 TODO 요구 없음
[이론] 소수 단어가 대부분의 빈도를 차지하는 분포를 직접 센 결과와 대조
- 활동 A의 예상표와 실습 1의 실제 표를 나란히 놓고 몇 개나 맞혔는지 센다
- 상위 몇 개가 전체에서 차지하는 몫을 확인하고 세 문장에서 다섯 문장으로 쓴다
- 수식 없이 실제로 센 몫과 자료의 크기를 설명해도 정답이다. 네 문장에서는 상위 몇 개가 거의 전부를 차지하지 않아도 관찰을 그대로 기록한다
[구현] 파이썬으로 단어 빈도 집계와 시각화
- 코드를 실행해 조각 수와 종류 수를 확인하고 결과를 옮겨 적는다
- 불용어 목록에 무엇을 넣었고 왜 넣었는지 한 줄로 적는다
- 그림이 안 그려져도 무엇을 보려 했는지 쓰면 부분 점수를 받는다
[실무] 제주 지역 텍스트가 교과서 예제와 어떻게 다른지 확인
- 방언과 표준어 표기 차이가 빈도표를 어떻게 흔드는지 한 줄로 적는다
- 쓰는 자료의 출처는 자료 출처 문서에 정리돼 있다
- 제품 이름 대신 기능 이름으로 적는다
자주 하는 오해 Q&A
Section titled “자주 하는 오해 Q&A”Q1. 토큰이 결국 단어 아닌가?
같은 것으로 봐도 되는 경우가 많지만 정확히는 다르다. 단어는 사람이 뜻을 기준으로 삼는 개념이고, 토큰은 정해 놓은 기준대로 잘라 낸 결과다. 그래서 기준을 바꾸면 같은 문장에서 다른 토큰이 나온다. 제주에서 고기국수를 먹었다. 를 띄어쓰기로 자르면 3개이고 뜻 단위로 자르면 6개인데, 문장에 들어 있는 단어의 개수가 바뀐 것이 아니라 자르는 기준이 바뀐 것이다. 그래서 결과를 보고할 때는 어떤 기준으로 잘랐는지를 같이 적어야 다른 결과와 비교할 수 있다.
Q2. 한국어도 그냥 띄어쓰기로 자르면 되지 않나?
간단한 빈도 실험에는 쓸 수 있다. 다만 얼마나 잘 되는지는 자료와 목적에 따라 다르므로 일정한 비율로 말할 수 없다. 첫째, 조사가 앞말에 붙어 있어서 “제주”, “제주가”, “제주에서”가 전부 다른 조각이 된다. 같은 말을 다섯 번 썼는데도 빈도표에서 각각 한 번씩으로 흩어져 상위 목록에 이름이 오르지 못한다. 둘째, 띄어쓰기가 아예 없는 글에는 통하지 않는다. 아버지가방에들어가신다 를 띄어쓰기로 자르면 조각이 하나다. 셋째, 반대 경우도 있다. 혼저 옵서예 는 띄어쓰기로 두 조각이지만 뜻으로는 인사말 하나다. 조사를 떼 내는 일을 자동으로 하는 도구가 있고 4주차에 쓴다.
Q3. 불용어는 항상 빼는 것이 좋은가?
아니다. 무엇을 하려는지에 따라 갈린다. 어떤 글인지 주제를 알아보려는 일이라면 “그리고”, “정말” 같은 말은 빼는 편이 낫다. 어느 글에나 나오니 글을 구별해 주지 못한다. 그런데 후기가 만족인지 불만인지 가려내려는 일이라면 정반대다. 별로 안 좋았어요 에서 “별로”와 “안”을 빼 버리면 좋았어요 만 남아 뜻이 뒤집힌다. 불용어 목록은 받아 오는 정답이 아니라 이번 작업에서 무엇을 보려는지에 맞춰 고르는 것이다.
Q4. Zipf 법칙이 법칙이면 정확히 두 배로 딱 떨어져야 하는 것 아닌가?
계산해서 딱 맞아떨어지는 식이 아니다. 여러 자료를 세어 보니 늘 비슷한 모양이 나오더라는 관찰이고, 그 관찰에 이름을 붙인 것이다. 실제로 세어 보면 1등이 2등의 1.8배일 수도 있고 2.3배일 수도 있다. 값어치는 정확도가 아니라 어디서나 비슷하게 나온다는 데 있다. 한국어든 영어든, 관광 후기든 신문 기사든 앞쪽 몇 개가 큰 몫을 가져가고 뒤로는 한 번씩만 나온 말이 끝없이 이어지는 모양은 같다. 다만 작은 자료에서는 모양이 달라도 자연스러우므로, Zipf와의 차이만으로 오류를 판정할 수 없다.
Q5. 네 문장 그래프가 Zipf 모양과 다르면 실패한 것인가?
작은 자료의 관찰과 일반 경향의 구분. 이 예시는 15토큰·13종뿐이어서 여러 단어의 빈도가 1회로 같음. 긴 꼬리의 경향을 설명할 재료는 되지만 법칙의 성립·실패를 판단할 충분한 표본은 아님. 나온 그래프를 그대로 기록하는 것이 우선.
Q6. 원문에서 표시를 지운 뒤 저장하면 충분한가?
원문과 처리본의 분리 보존 필요. 문장부호나 조사 제거가 결과를 바꿨는지 비교하려면 원문이 필요. 가져온 경로·수집 시점·이용 조건과 전처리 기준을 함께 기록. 이미 지운 사본만으로 모든 정보를 되살릴 수 있다는 보장은 없음.
Q7. 노트북의 방언 예시를 실행하면 원본 공개 말뭉치를 확인한 것인가?
수업용 가공 예시 실행과 원본 자료 확인은 별개. 이 노트북의 대응쌍은 표기 차이를 설명하는 세 쌍의 예시. 원본 파일을 내려받거나 전체 자료의 규모·품질·이용 조건을 검증한 결과가 아님. 공개 데이터로 보고하려면 실제 사용한 파일과 출처의 대조 필요.
Q8. 한글 한 글자를 토큰으로 쓰면 뜻 문제도 해결되는가?
자르기와 의미 해석은 별개. 글자 단위는 새로운 단어도 조각으로 표현하기 쉬우나, 같은 글자가 모여 어떤 뜻을 만드는지는 추가 문맥으로 판단해야 함. 6주차 이후에 다룰 숫자 표현도 자르는 단위와 자료에 의존.
스스로 점검
Section titled “스스로 점검”제주에서 고기국수를 먹었다.를 띄어쓰기로 자르면 조각이 몇 개인가? 마침표까지 따로 떼어 내면 몇 개가 되는가?- 다섯 문장에 “제주”가 조사만 바꿔 다섯 번 나왔다. 띄어쓰기로 자르면 각 조각은 몇 회로 세어지는가? 상위 10위 표에 “제주”가 보이지 않는 이유는 무엇인가?
- 상위 10개 표에서 1등이 1200번, 2등이 600번이었다. 3등은 대략 몇 번쯤일 것으로 예상되는가?
- 전체 조각이 10,000개이고 단어 종류는 2,000종이다. 상위 10종이 합쳐서 3,513번 나왔다. 상위 10종은 종류로 몇 퍼센트이고 횟수로 몇 퍼센트인가?
- 관광 후기만 모아 만든 불용어 목록을 학과 공지 분석에 그대로 쓰면 어떤 문제가 생기는가?
정답 보기
-
띄어쓰기로 자르면 3개이고, 마침표를 떼면 4개다. 띄어쓰기만 쓰면 마침표가 “먹었다”에 붙어 한 조각이 된다. 같은 문장인데 기준을 하나 더 넣었다고 조각 수가 바뀌는 것이 이번 주의 요점이다.
-
다섯 조각이 각각 1회씩이다. “제주는”, “제주가”, “제주를”, “제주에서”, “제주까지”가 서로 다른 글자 덩어리이기 때문이다. 사실상 가장 많이 나온 말인데도 어느 조각도 1회를 넘지 못한다. 상위 목록에 나타나는지는 다른 단어들의 빈도와 동점 순서에 따라 달라진다. 조사를 떼어 하나로 묶으면 제주가 5회로 집계된다.
-
400번 언저리다. 1등에서 2등으로 갈 때 절반이 됐으니 2등에서 3등으로 갈 때는 그보다 덜 줄어든다. 표에서는 2등의 1.5분의 1인 400이다. 정확히 400이어야 하는 것은 아니고 그 언저리라는 것이 요점이다.
-
종류로는 0.5퍼센트, 횟수로는 약 35퍼센트다. 10을 2,000으로 나누면 0.5퍼센트이고, 3,513을 10,000으로 나누면 약 35퍼센트다. 종류로는 200분의 1인데 횟수로는 3분의 1을 넘게 가져간다.
-
후기에서 흔한 말과 공지에서 흔한 말이 다르기 때문이다. 후기 목록에는 “너무”, “정말”이 들어 있는데 공지에는 그런 말이 거의 없어 빼 봐야 달라지는 것이 없다. 반대로 공지에서 흔한 “안내”, “바랍니다”는 그 목록에 없으니 그대로 남아 상위를 차지한다. 범위가 다르면 거기서 나온 것들도 옮겨 쓸 수 없다.
이번 주 용어 정리
Section titled “이번 주 용어 정리”| 용어 | 한 줄 뜻 |
|---|---|
| 말뭉치 (코퍼스) | 컴퓨터가 읽을 수 있게 모아 둔 글 더미. 무엇을 왜 모았는지 같이 적어 둔다 |
| 전처리 | 세기 전에 글을 손질하는 단계. 필요 없는 것을 의도적으로 버리는 일이다 |
| 토큰 | 정한 기준대로 잘라 낸 조각 하나 |
| 토큰화 | 글을 토큰으로 자르는 일 |
| 띄어쓰기 기준 자르기 | 공백이 나올 때마다 끊는 가장 단순한 토큰화 방법 |
| 조사 | 앞말에 붙어서 말의 역할을 바꾸는 부분. 같은 말을 여러 조각으로 흩어 놓는 원인 |
| 종류 수 | 서로 다른 말이 몇 가지인지. 같은 말이 열 번 나와도 한 종이다 |
| 전체 개수 | 조각이 모두 몇 개인지. 같은 말이 열 번 나오면 열 개다 |
| 빈도 | 어떤 말이 몇 번 나왔는지 |
| 빈도표 | 말마다 빈도를 적어 많이 나온 순서로 놓은 표 |
| 불용어 | 자주 나오지만 그 자료의 내용을 가려내는 데 도움이 안 되는 말. 목록은 목적에 따라 달라진다 |
| 분포 | 빈도가 말들 사이에 어떻게 나뉘어 있는지의 모양 |
| Zipf 법칙 | 순위가 두 배가 되면 나온 횟수가 대략 절반이 되는 관찰 |
| 머리와 꼬리 | 아주 자주 나오는 소수의 말이 머리이고, 한두 번만 나오는 수많은 말이 꼬리다 |
| 방언-표준어 대응쌍 | 같은 뜻을 방언과 표준어로 각각 적어 짝지어 둔 자료 |
1주차에서 “단어”로만 말했던 자리들은 이제 상황에 따라 토큰이라고 부르게 된다. 3주차부터는 토큰이 기본 단위다.
이번 주 읽기
Section titled “이번 주 읽기”주교재 2장 Words and Tokens. 자세한 서지 정보와 공개본 주소는 강의계획서를 참고한다.
- 영어 예제가 대부분인데, 각 예제를 볼 때마다 **“같은 일을 한국어로 하면 어떻게 될까”**를 한 번씩 떠올려 보면 그것만으로 충분한 공부가 된다
- 규칙 문자열로 글자를 찾아내는 부분이 나오는데 이 과목에서는 쓰지 않으니 넘어가도 된다
- 순위와 빈도 그래프가 나오는 대목만 찾아 이번 주 차트와 모양을 비교해 봐도 좋다. 자료가 영어인데 모양이 같다는 것이 이번 주의 요점이다
실습 노트북
Section titled “실습 노트북”네 문장을 잘라 세고, 불용어를 뺀 상위 단어를 막대그래프로 그린다. TODO는 불용어 목록 한 줄이다.