Skip to content
딥러닝 NLP

6주차: 단어의 의미 표현, 분포적 통계와 임베딩 기초

단어의 의미 표현, 분포적 통계와 임베딩 기초.

□ 이번 주에 하는 일

  • 단어의 뜻은 함께 다니는 단어에 있다는 분포 가설을 본다
  • 창(window)으로 이웃을 세어 동시발생 행렬을 만들고, 행을 단어 벡터로 쓴다
  • 두 단어 벡터의 코사인 유사도를 계산해, 사람이 느끼는 비슷함과 숫자가 말해 주는 비슷함을 비교한다
현무암 돌담 앞 나무 탁자 위에 글자 없는 빈 카드 두 장이 놓인 그림. 왼쪽 카드 주위에는 귤잎, 작은 대바구니, 전지가위가 있고 오른쪽 카드 주위에는 조개껍데기, 감긴 밧줄, 주황색 부표가 있다. 창밖으로 바다가 보인다

빈 카드에는 아무것도 적혀 있지 않다. 그래도 왼쪽 카드는 귤과 관련된 것, 오른쪽 카드는 바다와 관련된 것이라고 짐작할 수 있다. 주위에 무엇이 놓였는지가 카드의 정체를 알려 준다. 이번 주는 이 생각을 단어에 적용한다.

□ 5주차에서 이어지는 자리

5주차 단어 가방은 순서를 버렸고, 가방에 없던 단어는 판단에 아무것도 더하지 못했다. 한계를 줄이는 방향 세 가지 중 하나가 **“뜻이 비슷한 단어끼리 가깝게 표현한다”**였다. 이번 주는 그 방향의 첫 단계다. 단어를 숫자 목록, 즉 벡터로 바꿔 뜻이 비슷한 단어가 숫자로도 비슷하게 나오는지 본다.

2주차와 5주차에서 본 조사 문제도 다시 나온다. 5주차에 직원이 와 직원들이 가 다른 단어였던 것처럼, 이번 주에는 귤을 과 귤은 이 다른 단어로 세어진다. 그것이 어떤 결과를 만드는지가 이번 주의 핵심 관찰이다.

□ 이 문서를 읽는 법

  • 수식은 한 개도 나오지 않는다. 코사인 유사도의 공식도 쓰지 않고, 방향을 재는 값이라는 감만 잡는다
  • 말뭉치 문장과 방언 표본 문장은 설명용 예시다. 실제 말뭉치에서 온 것이 아니다
  • 표와 그림의 유사도는 노트북과 같은 문장, 같은 설정(창 2) 에서 계산한 값이다. 소수 둘째 자리로 반올림했다. 개념 그림이라고 밝힌 그림 하나만 측정값이 아니다
  • 벡터 계산을 손으로 하지 않는다. 이번 주에 요구하는 것은 숫자를 읽고 사람의 눈과 비교하는 능력이다

강의 1: 분포 가설과 동시발생 행렬

Section titled “강의 1: 분포 가설과 동시발생 행렬”

□ 분포 가설: 단어의 뜻은 함께 다니는 단어에 있다

처음 보는 단어의 뜻을 어떻게 알게 되는가. 사전을 찾기 전에 그 단어가 어떤 말들과 함께 다니는지를 본다. “귤”이라는 단어를 처음 보는 사람에게 “겨울에 나오고, 밭에서 따고, 깨끗이 씻어 먹는다”고 하면 감을 잡는다. 사전 뜻이 아니라 이웃이 단어를 설명해 준다.

분포 가설은 이것을 원리로 만든 것이다. 단어의 뜻은 그 단어가 함께 다니는 단어에 있다. 영국 언어학자 Firth(1957)의 “You shall know a word by the company it keeps”(단어는 그 단어가 어울리는 친구를 보면 안다)라는 말로 자주 소개된다.

이 가설을 따르면 두 단어가 비슷한 이웃과 함께 다니면 두 단어도 비슷하다. 함께 다닌다는 것을 어떻게 재고, 이웃이 비슷하다는 것을 어떻게 숫자로 비교하는지가 이번 주의 두 단계다.

단어 쌍을 누르면 함께 다니는 문장과 그렇지 않은 문장이 나란히 보인다. 바다가 와 푸르다 는 같은 문장 안에서 이웃이지만, 귤을 과 겨울 은 어느 문장에서도 만나지 못한다.

□ 창(window): 함께 다닌다는 것을 재는 방법

“함께 다닌다”의 기준이 필요하다. 이번 주에 쓰는 방법은 창(window) 이다. 기준 단어에서 왼쪽 오른쪽으로 몇 칸을 볼지 정한다. 창 1은 바로 옆 한 칸, 창 2는 옆 두 칸이다.

나무 탁자 위에 빈 카드 열한 장이 한 줄로 놓여 있고, 그 위에 빈 나무 액자가 얹혀 가운데 주황색 카드와 그 양옆 카드 몇 장만 액자 안에 들어와 있는 그림. 나머지 카드는 액자 밖에 놓여 있다. 뒤로 현무암 돌담이 흐릿하게 보인다

그림의 액자가 창이다. 가운데 주황색 카드가 기준 단어이고, 액자 안에 함께 들어온 양옆의 카드가 이웃이다. 창 2라면 양옆 두 장씩이 액자 안에 들어온다. 액자 밖의 카드는 같은 문장에 있어도 이웃으로 치지 않는다. 창은 문장 경계를 넘지 않는다. 한 문장이 끝나면 다음 문장의 단어는 이웃이 아니다.

노트북과 같은 예를 보자. “고기국수를 뜨겁게 먹었다”에서 먹었다 의 이웃은 창 1로는 뜨겁게 하나다. 창 2로 넓히면 뜨겁게 와 고기국수를 둘이 이웃이 된다. “귤밭에서 귤을 따왔다”에서 귤을 의 이웃은 창 1과 창 2가 똑같이 귤밭에서 와 따왔다 다. 문장이 짧으면 창을 넓혀도 새 이웃이 늘지 않는다.

창을 몇 칸으로 할지는 문제가 정한다. 이번 주 노트북은 창 2를 쓴다.

□ 창을 세면 행렬이 된다

이웃을 눈으로만 보지 않고 세어서 표로 만든다. 두 단어가 한 문장에서 창 안에 함께 들어온 횟수를 칸에 쓴다. 이 표가 동시발생 행렬이다. 3주차에 단어 짝을 세어 표를 만들었듯이, 이번 주는 창 안의 단어 쌍을 센다.

그림은 처음에 귤을 과 귤은 의 행을 나란히 보여 준다. 다른 단어를 누르면 그 단어의 행이 나오고, 두 단어를 고르면 두 행을 비교한다.

행렬의 한 행이 단어 하나의 기록이다. 귤을 의 행에는 귤밭에서, 깨끗이, 따왔다, 씻어 넷이 기록되고 나머지 38칸은 모두 0이다. 단어 42개 중 넷과만 함께 다녔기 때문이다. 바다가 의 행에는 여덟 단어가 기록된다. 바다가는 문장 세 개에 나와 이웃이 많다.

표를 볼 때 알아 둘 것이 세 가지 있다.

  • 표는 대각선을 기준으로 좌우가 같다. 바다가 가 푸르다 와 함께 나왔다면 푸르다 도 바다가 와 함께 나온 것이다. 그래서 [바다가, 푸르다] 칸과 [푸르다, 바다가] 칸은 같은 숫자다
  • 칸 대부분이 0이다. 5주차 단어 가방 표와 같은 모양이다. 이런 표를 희소하다고 부른다. 이번 주 행렬은 칸 1764개 중 0이 아닌 칸이 120개(6.8%)다. 단어 대부분은 행에서 두세 칸만 0이 아니다
  • 2 이상인 칸도 있다. 아주 와 푸르다 는 두 문장에서 함께 나와 칸이 2다. 한 번만 함께 나온 쌍보다 강하게 기록된다

이 행렬에서 한 행을 떼어 내면 단어 하나의 숫자 목록이 된다. 이것이 단어 벡터다. 벡터의 좌표 하나하나가 “이 이웃과 몇 번 함께 나왔나”를 뜻한다. 강의 2에서 두 단어의 벡터를 비교하는 방법을 본다.

○ 자주 나오는 단어의 착시: PMI

동시발생 행렬의 칸에는 그냥 횟수가 들어간다. 그런데 횟수에는 착시가 있다. 큰 말뭉치에서 했다 같은 말은 거의 모든 명사 옆에 나온다. 횟수만 보면 모든 명사가 했다 를 이웃으로 공유해 서로 비슷해 보인다. 반대로 해녀 와 물질 은 드물게 나오지만, 나올 때는 거의 함께 나온다.

PMI(점별 상호정보) 는 이 착시를 줄이는 점수다. 두 단어가 실제로 함께 나온 횟수를, 두 단어가 서로 상관없이 흩어져 있을 때 우연히 함께 나올 것으로 기대되는 횟수와 비교한다.

  • 기대보다 훨씬 자주 함께 나오면 점수가 높다. 해녀 와 물질 이 그렇다
  • 기대만큼만 함께 나오면 점수가 0 근처다. 어디에나 나오는 했다 가 그렇다

횟수 대신 PMI를 칸에 넣으면 “흔해서 함께 나온 쌍”은 약해지고 “특별히 함께 다니는 쌍”은 강해진다. 이번 주는 이름과 아이디어까지만 만난다. 공식은 다루지 않고, 노트북도 횟수를 그대로 쓴다. 드문 쌍이 한 번 우연히 함께 나와도 높은 PMI를 받을 수 있으므로, 이 점수만으로 관계를 확정하지 않는다.

□ 강의 1에서 꼭 가져갈 것

  1. 분포 가설은 단어의 뜻은 함께 다니는 단어에 있다는 생각이다. 이웃이 비슷하면 두 단어도 비슷하다
  2. 창은 기준 단어 주위를 몇 칸 볼지 정한 범위다. 창 1은 옆 한 칸, 창 2는 옆 두 칸이고, 문장 경계를 넘지 않는다
  3. 창 안의 동시등장을 세면 동시발생 행렬이 되고, 그 한 행이 단어 벡터다
  4. 이번 주 행렬은 42 x 42, 칸 1764개 중 0이 아닌 칸은 120개(6.8%)다. 대부분 0인 희소 행렬이다
  5. 흔한 단어는 횟수만으로 과대평가된다. PMI 는 기대보다 자주 함께 나오는지를 보는 점수다

강의 2: 코사인 유사도, 그리고 사람의 눈과 통계의 눈

Section titled “강의 2: 코사인 유사도, 그리고 사람의 눈과 통계의 눈”

□ 벡터를 화살표로 보기

단어 벡터는 좌표가 42개라 그림으로 그릴 수 없다. 그래서 먼저 좌표가 두 개인 벡터로 감을 잡는다. 좌표 두 개짜리 벡터 [2, 1]은 원점에서 오른쪽으로 2, 위로 1 간 곳을 가리키는 화살표다.

두 벡터를 비교하는 값이 코사인 유사도다. 두 화살표가 얼마나 같은 방향을 보는지 재는 값이고, 같은 방향이면 1, 직각이면 0, 반대 방향이면 -1이다.

벡터 단추를 눌러 A와 B를 바꿔 보자.

  • [2, 1]과 [1, 2]는 0.80이다. 비슷한 방향이다
  • [2, 1]과 [-1, 2]는 0.00이다. 직각이다
  • [2, 1]과 [-2, -1]은 -1.00이다. 정확히 반대 방향이다
  • [2, 1]과 [4, 2]는 1.00이다. 화살표 길이는 두 배지만 방향이 같다

단어 벡터도 좌표가 42개일 뿐 똑같다. 좌표 평면에서 잡은 감을 그대로 가져가면 된다.

□ 왜 길이가 아니라 방향인가

바다가 내려다보이는 오름 풀밭에 나무 화살표 이정표 세 개가 서 있는 그림. 이정표는 길이가 제각각이지만 모두 바다 쪽 같은 방향을 가리킨다. 풀밭 위로 아이 넷이 걷거나 놀고 있고, 현무암 돌담과 산이 보인다

이정표 세 개는 길이가 다르지만 가리키는 곳은 같다. 코사인 유사도는 이정표의 길이를 보지 않고 가리키는 방향만 본다. 단어 벡터에서 이것이 왜 중요한가.

  • 자주 나오는 단어는 칸 숫자가 크다. 화살표가 길다
  • 드물게 나오는 단어는 칸 숫자가 작다. 화살표가 짧다
  • 길이로 비교하면 흔한 단어끼리만 비슷해 보인다. 어떤 이웃과 다니는지가 아니라 얼마나 많이 나왔는지를 비교하는 셈이 된다

방향은 어떤 이웃들과 어떤 비율로 함께 다니는지만 담는다. 말뭉치에 열 번 나온 단어와 한 번 나온 단어라도, 같은 이웃들과 같은 비율로 다니면 유사도가 1이다. 분포 가설이 묻는 것이 바로 이것이다.

□ 0.41은 어디서 오는가

단어 벡터의 코사인 유사도는 겹치는 이웃에서 나온다. 이번 주처럼 0 이상의 횟수 벡터에서는 겹치는 좌표가 하나도 없으면 0이다. 이웃과 각 횟수의 비율까지 같으면 1이다. 중간값은 겹친 이웃의 수뿐 아니라 각 이웃과 함께 나온 횟수에도 영향받는다.

단어 쌍각자의 이웃 수겹친 이웃유사도
고기국수를 ~ 갈치조림을2개, 2개먹었다0.50
바다가 ~ 하늘이8개, 3개아주, 푸르다0.41
귤을 ~ 귤은4개, 3개없음0.00

바다가와 하늘이는 겹친 이웃이 둘로 더 많은데도 고기국수를과 갈치조림을보다 값이 낮다. 바다가가 문장 세 개에 나와 겹치지 않는 이웃을 여섯 개나 더 가졌기 때문이다. 겹친 수만이 아니라 겹친 좌표의 횟수와 벡터의 방향을 함께 보아야 하는 이유다. 계산은 노트북이 한다. 여기서는 이 감만 가져간다.

□ 사람의 눈과 통계의 눈

분포 가설이 맞다면 사람에게 비슷한 단어가 숫자로도 비슷하게 나와야 한다. 그럴까. 노트북과 같은 말뭉치의 다섯 쌍을 두 눈으로 비교해 보자.

단어 쌍사람의 눈통계의 눈두 눈
고기국수를 ~ 갈치조림을둘 다 음식0.50, 먹었다 공유같다
바다가 ~ 하늘이같은 자리에 쓰이는 말0.41, 아주·푸르다 공유같다
귤을 ~ 귤은같은 과일0.00, 겹치는 이웃 없음다르다
귤을 ~ 감귤같은 과일0.00다르다
맑다 ~ 우도관련 없음1.00다르다

사람에게 비슷한 단어가 숫자로도 비슷하게 나오는 경우와 그렇지 않은 경우가 같은 말뭉치 안에 함께 있다. 어긋남은 두 방향으로 일어난다.

  • 사람은 비슷한데 통계는 0. 귤을 과 귤은 이 0.00인 이유는 뜻이 달라서가 아니다. 귤을은 귤밭에서, 따왔다, 깨끗이, 씻어 와, 귤은은 겨울, 과즙이, 달고 와만 함께 다녀 겹치는 이웃이 없다. 같은 대상을 가리켜도 조사가 갈라 놓으면 통계는 알아보지 못한다. 4주차에서 형태소 분석기로 조각을 나눈 이유가 여기서 다시 나타난다
  • 사람은 무관한데 통계는 1.00. 다음 절에서 본다

반대로 두 눈이 같은 경우도 있다. 바다가 와 하늘이 는 “제주 바다가 아주 푸르다”, “가을 하늘이 아주 푸르다”처럼 같은 자리에 끼어 들었다. 뜻은 다르지만 쓰이는 자리가 같다. 분포 가설이 말하는 비슷함은 이런 비슷함이다. 사전의 동의어라기보다 같은 자리에 들어갈 수 있는 말이다.

□ 적은 자료의 함정: 1.00이 같은 뜻은 아니다

노트북 1-5는 말뭉치 전체에서 유사도가 가장 높은 쌍도 보여 준다. 1위는 맑다 ~ 우도 1.00, 2위는 감귤 ~ 선물했다 1.00이다. 사람에게 섬 이름과 날씨 말은 비슷하지 않다.

이유는 한 문장에 있다. “우도 바다가 더 맑다”에서 우도의 창 2 이웃은 바다가, 더 이고, 맑다의 창 2 이웃도 바다가, 더 다. 두 단어는 이 문장에만 나와서 이웃이 똑같다. 그래서 방향이 같고 1.00이 된다.

비슷한 일이 또 있다. 귤은 은 감귤 과는 0.00이지만 하늘에 와는 0.33이다. “겨울 귤은 달고”와 “겨울 하늘에 별이”에서 둘 다 겨울 을 이웃으로 가졌기 때문이다.

5주차에서 본 적은 자료의 함정과 같은 모양이다. 문장이 13개뿐이면 한두 문장이 유사도를 통째로 정한다. 다양한 문장이 충분히 늘어나면 이 한 문장의 영향이 줄어들 수 있다. 다만 같은 틀의 문장만 반복해서 늘리면 잘못된 유사성이 그대로 남을 수 있다. 실제 임베딩이 큰 말뭉치로 만들어지는 이유가 이것이다.

□ 창을 넓히면

창을 넓히면 함께 세어지는 쌍이 늘어난다. 행렬의 0이 아닌 칸이 창 1에서 72개(4.1%), 창 2에서 120개(6.8%), 창 3에서 142개(8.0%)로 늘어난다. 그러면 유사도는 어떻게 될까.

단어 쌍창 1창 2창 3
고기국수를 ~ 갈치조림을0.000.500.50
바다가 ~ 하늘이0.290.410.41
귤을 ~ 귤은0.000.000.00
귤은 ~ 하늘에0.500.330.25
  • 오르는 쌍. 고기국수를 과 갈치조림을 은 서로 다른 문장에서 각각 먹었다 와 두 칸 떨어져 있다. 창 1로는 먹었다가 이웃에 들어오지 않아 0.00이다. 창 2부터 먹었다가 함께 세어져 0.50이 된다. 바다가 와 하늘이 도 창 2부터 푸르다 가 더해져 0.29에서 0.41로 오른다
  • 그대로인 쌍. 귤을 과 귤은 은 창을 3까지 넓혀도 0.00이다. 두 단어는 같은 문장에 나온 적도 없고 이웃도 겹치지 않는다. 원인은 창이 아니라 말뭉치와 자르기에 있다
  • 내려가는 쌍. 창 1에서 귤은 의 이웃은 겨울, 달고 이고 하늘에 의 이웃은 겨울, 별이 다. 이웃 둘 중 겨울 하나를 공유해 0.50이다. 창을 넓히면 과즙이, 잔뜩 (창 2), 많다, 있다 (창 3)처럼 겹치지 않는 이웃만 새로 들어와 겹친 비율이 떨어진다

창을 넓힌다고 유사도가 늘 오르는 것은 아니다. 넓은 창은 멀리 있는 관계를 잡는 대신 관계없는 이웃도 함께 끌어온다.

□ 5주차의 한계를 잇는 방법

5주차의 마지막 문장을 다시 보자. “예쁘고 감성적인 숙소였다”의 세 단어는 가방에 없어 판단에 아무것도 더하지 못했고, 판정은 부정이었다.

단어를 벡터로 두면 처음 보는 단어도 이미 본 단어와 가까운 자리에 놓일 수 있다. 예쁘고 가 좋았다 근처에 있으면 좋았다의 근거를 빌려 쓴다. 가방에 없던 단어가 판단에 끼지 못했던 한계가 줄어드는 방향이다.

토글을 바꿔도 문장은 같다. 달라지는 것은 단어를 가방의 칸으로 보느냐, 벡터의 자리로 보느냐다. 이 그림의 단어 자리는 개념 그림이다. 이번 주 말뭉치의 측정값이 아니다. 이 방향이 실제로 통하려면 예쁘고 가 들어 있는 큰 말뭉치로 벡터를 먼저 만들어 두어야 한다. 이번 주에 만드는 동시발생 행렬이 그 첫 단계다.

□ 왜 지금 이것을 배우는가

  • 단어를 벡터로 바꾸는 생각은 이후의 모든 모델이 딛고 서는 바닥이다. 검색, 추천, 번역, 큰 언어모델 모두 단어와 문장을 벡터로 바꿔 계산한다
  • 이번 주 벡터는 희소하고, 말뭉치가 작으면 우연에 크게 흔들린다. 7주차는 이 희소한 벡터 대신 좌표가 수십에서 수백 개인 밀집 벡터를 신경망으로 학습하는 방법을, 8주차는 단어 대신 문장을 벡터로 바꿔 비교하는 방법을 다룬다
  • 모델이 바뀌어도 **“이웃이 비슷하면 비슷하다”**는 분포 가설과 방향으로 비교한다는 생각은 그대로 쓰인다

□ 강의 2에서 꼭 가져갈 것

  1. 코사인 유사도는 두 벡터의 방향이 같은지 재는 값이다. 같은 방향 1, 직각 0, 반대 -1. 길이는 보지 않는다
  2. 단어 벡터의 유사도는 겹친 이웃의 비율에서 나온다. 겹친 이웃이 없으면 0.00이다
  3. 두 눈은 두 방향으로 어긋난다. 같은 과일인데 0.00(귤을 ~ 귤은), 무관한데 1.00(맑다 ~ 우도)
  4. 분포 가설이 말하는 비슷함은 같은 자리에 쓰이는 말이다. 자료가 적으면 한 문장이 유사도를 통째로 정한다
  5. 창을 넓히면 유사도가 오르기도, 그대로이기도, 내려가기도 한다. 귤을 ~ 귤은 의 0.00은 창으로 풀리지 않는다

□ 활동: “비슷한 단어” 다섯 쌍

비슷하다고 느껴지는 단어 다섯 쌍을 적고, 각 쌍마다 왜 비슷하다고 느꼈는지 한두 문장으로 서술한다.

번호단어 쌍왜 비슷하다고 느꼈나
1
2
3
4
5

사람의 눈으로 적는다. 정답을 맞히는 활동이 아니다. 뜻이 같아서일 수도 있고, 같은 자리에 쓰이는 말이라서일 수도 있고, 함께 떠오르는 말이라서일 수도 있다.

○ 사람의 기준과 분포의 기준

활동을 적을 때 쓰는 기준은 사람의 것이다. 뜻이 같아서, 감각이 비슷해서, 함께 떠올라서. 분포 가설이 쓰는 기준은 하나다. 함께 다니는 단어가 같은가다.

적어 둔 다섯 쌍을 다시 보며 스스로 물어 본다.

  • 이 두 단어는 같은 문장 자리에 바꿔 넣을 수 있는가. “바다가 아주 푸르다”의 바다가 자리에 하늘이가 들어가듯이
  • 이 두 단어는 조사나 어미만 다른가. 그렇다면 띄어쓰기로 자른 통계는 다른 단어로 볼 것이다
  • 이 두 단어는 반대말인가. 반대말도 같은 자리에 쓰이므로 분포로는 비슷하게 나오기 쉽다

두 기준이 어디서 같고 어디서 갈리는지가 이번 주의 출발점이다. 적어 둔 쌍은 대면 시간에 두 기준을 나란히 놓고 비교하는 재료로 쓴다.

□ 노트북에서 하는 일

문장 13개로 말뭉치를 만들고 창을 세워 동시발생 행렬을 만든 뒤, 행을 단어 벡터로 써서 코사인 유사도를 계산한다. 손대지 않아도 끝까지 돌아가고, TODO는 창 크기를 바꾸는 한 곳뿐이다.

노트북의 흐름은 다음과 같다.

  1. 문장 13개를 나란히 놓고 전체 단어 42개를 센다 (1-1)
  2. 창으로 이웃을 보인다. 먹었다 와 귤을 을 창 1, 2로 훑는다 (1-2)
  3. 동시발생 행렬을 만든다. 42 x 42, 칸 1764개, 0이 아닌 칸 120개(6.8%). 단어 여덟 개를 골라 표로 본다 (1-3)
  4. 다섯 단어의 행을 단어 벡터로 나란히 놓고 겹치는 좌표를 본다 (1-4)
  5. 코사인 유사도를 계산한다. 좌표 두 개짜리 예시, 단어 쌍 여덟 개, 귤을 과 가장 비슷한 단어 세 개, 말뭉치 전체에서 가장 비슷한 쌍 세 개 (1-5)
  6. 방언 표본으로 바당에서 와 바다에서 를 비교한다 (1-6)
  7. TODO에서 창을 1, 2, 3으로 바꾸며 유사도가 어떻게 달라지는지 본다 (2)

□ 귤을의 이웃 읽는 법

1-3과 1-4에서 귤을 의 행을 원래 문장과 나란히 놓고 확인한다.

  • 귤을의 이웃은 귤밭에서, 깨끗이, 따왔다, 씻어 넷이다. 각각 몇 번째 문장에서 왔는지 찾아 본다. 8번과 13번 문장이다
  • 귤은의 이웃은 겨울, 과즙이, 달고 셋이다. 귤을과 겹치는 단어가 하나도 없다
  • 바다가와 하늘이는 아주, 푸르다 두 단어를 겹친다. 1-5의 0.41이 바로 여기서 온다
  • 1-5의 목록에서 귤을과 가장 비슷한 단어는 먹었다 (0.41)다. 둘 다 깨끗이, 씻어 를 이웃으로 갖기 때문이다. 그다음이 따왔다 (0.35)와 귤밭에서 (0.35)다. 사람이 고르는 귤은 이나 감귤 은 목록에 없다. 두 눈의 차이를 보여 주는 가장 좋은 예다

□ 1-3의 표 읽는 법

1-3의 마지막 출력은 42 x 42 행렬에서 단어 여덟 개만 잘라 낸 표다.

  • 대각선 왼쪽 아래와 오른쪽 위가 거울처럼 같은지 확인한다
  • [아주, 푸르다] 칸이 2인 것을 찾는다. 두 문장에서 함께 나왔기 때문이다
  • 귤을의 줄은 여덟 칸이 모두 0이다. 귤을과 먹었다는 이웃 깨끗이, 씻어 를 공유해 유사도가 0.41이지만, “귤을 깨끗이 씻어 먹었다”에서 세 칸 떨어져 있어 창 2 안에 함께 들어온 적은 없다. 함께 나오는 것과 이웃이 비슷한 것은 다른 일이다

□ 1-6 방언 표본 읽는 법

1-6은 바당에서 와 바다에서 를 세 경우로 비교한다. 설명용으로 만든 표본 문장이다.

경우방언 문장표준어 문장유사도
이웃이 같다바당에서 물질을 했다바다에서 물질을 했다1.00
이웃 하나가 방언바당에서 하영 놀았다바다에서 많이 놀았다0.50
이웃도 모두 방언바당에서 하영 놀멍 쉬멍바다에서 많이 놀며 쉬며0.00

같은 뜻의 두 단어라도 주변 말이 겹치면 비슷하게, 주변 말까지 방언이면 남남으로 나온다. 여섯 문장을 한 말뭉치에 섞어도 0.375에 그친다. 자세한 해석은 [실무] 활동에서 한다.

□ TODO에서 볼 것

  • 창 1. 0이 아닌 칸이 72개(4.1%)로 줄어든다. 고기국수를 ~ 갈치조림을 이 0.00으로 내려간다. 먹었다가 이웃에서 빠지기 때문이다. 바다가~하늘이는 0.29로 낮아지지만 0이 되지는 않는다. 아주 가 아직 겹치기 때문이다
  • 창 3. 0이 아닌 칸이 142개(8.0%)로 늘어난다. 확인 쌍 네 개는 창 2와 같다. 새로 겹치는 이웃이 없다
  • 귤을 ~ 귤은 은 창을 어떻게 바꿔도 0.00이다. 두 단어의 이웃이 아예 겹치지 않는다
  • 단어 수는 창을 바꿔도 42개 그대로다. 창은 행렬 칸의 숫자를 바꾸지, 행렬의 크기를 바꾸지 않는다

□ 자주 막히는 지점

증상원인조치
ModuleNotFoundError: No module named 'pandas'설치 셀을 건너뛰었거나 런타임이 끊겼다설치 셀부터 다시 실행한다
NameError: name 'build_matrix' is not defined런타임이 다시 시작되어 위 셀의 결과가 사라졌다메뉴에서 모두 실행을 누르거나 위에서부터 다시 실행한다
TypeError: can only concatenate str (not "int") to strwindow = "2" 처럼 숫자에 따옴표를 붙였다window = 2 처럼 숫자만 쓴다
모든 유사도가 0.00이고 0이 아닌 칸이 0개다window = 0 을 넣었다. 이웃을 한 칸도 보지 않는다1 이상의 숫자를 넣는다
TODO 셀 결과가 창 2와 같다window 값을 바꾸지 않았거나 셀을 다시 실행하지 않았다window = 1 처럼 값을 바꾸고 셀을 다시 실행한다
  • 기본: 기본값 창 2의 행과 단어 쌍 하나를 골라, 공유 이웃과 사람의 판단 차이 설명
  • 심화: 같은 노트북의 TODO 한 곳에서 창 1·2·3을 비교하고, 유사도가 내려가는 반례의 이유 설명

[이론] 벡터를 좌표 평면 그림으로 먼저 이해한 뒤 수치로 이동. 사람이 느끼는 유사성과 통계적 유사도의 차이를 대조

  • 강의 2에서 좌표 평면의 [2, 1]과 [1, 2]로 방향 감을 잡은 뒤 42칸짜리 단어 벡터로 이동했다. [2, 1]과 [4, 2]가 1.00인 이유를 한 문장으로 적는다
  • 사람의 눈과 통계의 눈 그림의 다섯 쌍을 두 눈으로 각각 나열하고, 두 눈이 어느 방향으로 어긋나는지 표로 정리한다
  • 활동에서 적은 다섯 쌍 중 하나를 골라, 분포의 기준으로는 비슷하게 나올지 예상과 이유를 적는다
  • 유사도를 계산하는 것이 아니라, 두 눈의 차이를 설명했는지로 채점한다

[구현] 동시발생 행렬을 데모 따라 만들고 코사인 유사도를 계산

  • 노트북 1-1부터 1-6까지 창 보기, 행렬 만들기, 유사도 계산, 방언 표본 순서로 실행한다
  • TODO 셀에서 창을 1, 2, 3으로 바꾸고, 매번 0이 아닌 칸 수와 확인 쌍 네 개의 유사도를 기록한다
  • 고기국수를 ~ 갈치조림을 이 0.00에서 0.50으로 바뀌는 창 크기와 그 이유를 한 문장으로 적는다
  • 코드가 돌지 않아도 무엇을 확인하려 했는지 쓰면 부분 점수를 받는다

[실무] 한국어에서 분포 가설이 잘 맞는 경우와 어긋나는 경우를 수업용 표본으로 관찰. 승인된 공개 말뭉치는 확보한 경우에만 추가 관찰. 방언·표준어 대응쌍에서 “같은 뜻 다른 표기”가 분포적으로 어떻게 보이는지 확인

  • 세 경우를 눌러 본다. 제주어 바당 은 표준어 바다 다. 같은 뜻인데, 주변 말이 겹치면 1.00, 주변 말 하나가 방언이면 0.50, 주변 말까지 모두 방언이면 0.00이 나온다
  • 실제 방언 발화에서는 방언 단어가 방언 단어와 함께 나오기 쉽다. 하영 (많이), 놀멍 (놀며) 같은 말이 바당 옆에 붙는다. 그래서 대응쌍이 분포에서 서로 다른 섬으로 갈라지기 쉽다. 방언 말과 표준어 말을 한 말뭉치에 섞어도 갈라짐은 남는다. 표본 여섯 문장을 섞은 결과가 0.375다
  • 대응쌍은 한 방향으로만 어긋나지 않는다. 제주어로 감저 는 고구마, 지슬 은 감자를 가리킨다. 표기가 다른데 뜻이 같은 쌍도 있고, 비슷한 소리가 지역마다 다른 것을 가리키는 경우도 있다. 임베딩을 만들 때 방언과 표준어를 어떻게 다루는지가 결과를 좌우한다
  • 실제 관찰에 쓰는 자료의 후보는 AI Hub 「한국어 방언 발화(제주도)」의 방언·표준어 텍스트 대응쌍이다. 이 노트북에는 실제 원문이 포함되지 않는다. 이 자료는 각자 AI Hub에서 이용 승인을 받아 쓴다. 승인 뒤에는 용량이 큰 음성 파일은 받지 않고 텍스트 대응쌍만 내려받는다. 받은 자료는 공개 저장소나 수업 플랫폼에 올리지 않고 각자의 Colab 세션에만 둔다. 승인에 시간이 걸리므로 아직 신청하지 않았다면 이번 주에 바로 신청하고, 승인 전에는 노트북 1-6의 표본으로 먼저 활동한다
  • 같은 뜻이 분포에서 갈라져 보이는 이유를 설명했는지로 채점한다. 공개 자료 승인 여부를 개념 이해의 정답 조건으로 삼지 않으며, 수업용 표본과 실제 자료의 관찰을 구분한다
Q1. 유사도가 0이면 아무 관련도 없다는 뜻인가?

아니다. 0은 관련이 없다는 뜻이 아니라 이 말뭉치에서 겹치는 이웃이 하나도 없었다는 기록이다. 귤을 과 귤은 은 사람에게 같은 과일인데 0.00이 나왔다. 통계의 눈이 이 말뭉치 안에서는 관련을 발견하지 못했을 뿐이다. 말뭉치를 바꾸거나 단어를 다르게 자르면 값이 달라진다.

Q2. 유사도가 1.00이면 뜻이 같다는 뜻인가?

아니다. 1.00은 이 말뭉치에서 두 단어의 이웃이 같은 비율로 겹쳤다는 기록이다. 맑다 와 우도 는 “우도 바다가 더 맑다” 한 문장에서 이웃이 똑같아 1.00이 나왔지만, 뜻은 전혀 다르다. 문장이 적으면 이런 우연이 크게 작동한다. 다양한 문맥을 더 관찰하면 이런 우연의 영향이 줄어들 수 있지만, 크기만 늘린다고 의미 표현이 정확해지는 것은 아니다.

Q3. 창이 넓을수록 좋은 것 아닌가?

아니다. 창을 넓히면 함께 세어지는 쌍이 늘어나 고기국수를 ~ 갈치조림을 같은 경우가 잡힌다. 반대로 관계없는 이웃도 함께 끌어와 귤은 ~ 하늘에 처럼 유사도가 0.50에서 0.33, 0.25로 내려가는 쌍도 생긴다. 넓을수록 좋은 것이 아니라 문제에 맞는 창이 따로 있다. 그리고 귤을 ~ 귤은 처럼 창과 상관없이 0.00인 문제도 있다.

Q4. 귤을, 귤은, 감귤이 모두 0.00인 것은 계산이 고장 난 것인가?

고장이 아니라 말뭉치와 자르기의 문제다. 귤을 은 조사까지 붙은 통째 조각으로 세이고, 귤은, 감귤 은 다른 문장에서 다른 이웃과 나온다. 4주차에서 형태소 분석기로 조각을 나눴던 이유와 같은 뿌리다. 이런 어긋남을 줄이는 길은 말뭉치를 늘리는 것과 단어를 더 잘게 나누는 것이다. 조사를 떼어 귤 로 세면 귤을과 귤은의 이웃이 한 행으로 모인다.

Q5. 분포로 보면 반대말도 비슷하게 나오는가?

그렇다. “국물이 뜨겁다”와 “국물이 차갑다”처럼 반대말은 같은 자리에 쓰이는 경우가 많아 이웃이 겹친다. 분포 가설은 “같은 자리에 들어갈 수 있는 말”을 비슷하다고 잡아내므로, 뜻이 정반대인 말도 높은 유사도를 받을 수 있다. 통계의 눈이 말하는 비슷함은 동의어와 같지 않다는 좋은 예다.

Q6. PMI가 궁금하다. 이번 주에 계산하는가?

계산하지 않는다. PMI(점별 상호정보)는 두 단어가 함께 나온 횟수를 두 단어가 서로 상관없이 흩어져 있을 때 기대되는 횟수와 비교해 점수를 매기는 방법이다. 했다 처럼 어디에나 나오는 단어는 횟수가 커도 기대만큼이라 점수가 낮고, 해녀 와 물질 처럼 특별히 함께 다니는 쌍은 점수가 높다. 이번 주는 이름과 아이디어까지만 만난다.

Q7. 코사인 유사도가 -1이 되려면 어떤 벡터여야 하는가?

방향이 정확히 반대여야 한다. 좌표 평면에서 [2, 1]과 [-2, -1]이 -1이다. 단어 벡터의 좌표는 동시발생 횟수라 0 이상이므로, 이번 주 단어 쌍의 유사도는 0 이상으로 나온다. -1이 나오려면 음수 좌표가 있는 벡터가 필요하다. 7주차의 밀집 벡터는 음수 좌표를 가질 수 있다.

Q8. 희소하다는 무슨 뜻이고, 왜 문제가 되는가?

좌표 대부분이 0이라는 뜻이다. 이번 주 행렬은 칸 1764개 중 0이 아닌 칸이 120개(6.8%)다. 대부분 0이면 단어 쌍 대부분의 유사도가 0에 머물러, 비슷한 단어를 가리는 힘이 약하다. 게다가 실제 말뭉치는 단어가 수만 개라 행 하나가 수만 칸이 된다. 희소하고 긴 표를 좌표 수백 개짜리 밀집 벡터로 바꾸는 방법이 7주차에 나온다.

  1. 분포 가설을 한 문장으로 말하라.
  2. 창(window)이 무엇이며, 창 1과 창 2는 무엇이 다른가?
  3. 동시발생 행렬의 한 행이 단어 벡터가 되는 이유를 설명하라.
  4. 좌표 평면에서 [2, 1]과 [4, 2]의 유사도는 얼마이고, 왜 그런가?
  5. 귤을 ~ 귤은 유사도가 0.00인 이유를, 사람의 눈과 통계의 눈으로 나눠 설명하라.
  6. 고기국수를 ~ 갈치조림을 유사도가 창 1에서 0.00, 창 2에서 0.50이 되는 이유를 단어 하나로 설명하라.
  7. 맑다 ~ 우도 가 1.00인데 뜻이 같다고 할 수 없는 이유는?
  8. 바당에서 ~ 바다에서 가 1.00이 되는 경우와 0.00이 되는 경우는 무엇이 다른가?
정답 보기
  1. 단어의 뜻은 그 단어가 함께 다니는 단어에 있다. 사전 뜻이 아니라 이웃이 단어를 설명한다. 그래서 이웃이 비슷한 두 단어는 비슷하다고 본다.

  2. 기준 단어 주위를 볼 칸 수다. 창 1은 바로 옆 한 칸, 창 2는 옆 두 칸이다. 창이 넓어지면 이웃이 늘어나고 행렬의 0이 아닌 칸이 늘어난다(72개에서 120개로). 문장이 짧으면 창을 넓혀도 이웃이 늘지 않는다.

  3. 행의 칸 하나는 그 단어가 이웃과 창 안에 함께 들어온 횟수다. 행 전체를 읽으면 그 단어가 어떤 단어들과 어떻게 함께 다녔는지 기록이 된다. 두 단어를 비교할 때는 행끼리 비교하면 되므로 행을 단어 벡터로 쓴다.

  4. 1.00이다. [4, 2]는 [2, 1]과 방향이 같고 길이만 두 배다. 코사인 유사도는 길이를 보지 않고 방향만 본다. 그래서 자주 나온 단어와 드물게 나온 단어도 같은 이웃과 같은 비율로 다니면 1이 된다.

  5. 사람의 눈: 둘 다 귤이라 같은 과일이다. 통계의 눈: 귤을은 귤밭에서, 깨끗이, 따왔다, 씻어 와, 귤은은 겨울, 과즙이, 달고 와만 함께 다녀 겹치는 이웃이 없다. 같은 대상을 가리켜도 조사가 갈라 놓으면 통계는 알아보지 못한다.

  6. 먹었다 다. 두 음식은 서로 다른 문장 “고기국수를 뜨겁게 먹었다”와 “갈치조림을 뜨끈하게 먹었다”에서 각각 먹었다와 두 칸 떨어져 있다. 창 1로는 먹었다가 이웃에 들어오지 않지만, 창 2부터 함께 세어져 유사도가 0.50이 된다.

  7. 두 단어가 “우도 바다가 더 맑다” 한 문장에만 나와 이웃이 바다가, 더 로 똑같기 때문이다. 뜻이 비슷해서가 아니라 자료가 적어 한 문장이 유사도를 정했다. 다양한 문맥을 더 확보하면 이 한 문장의 영향이 줄어들 수 있다.

  8. 주변 말이 겹치느냐다. “바당에서 물질을 했다”와 “바다에서 물질을 했다”는 이웃이 같아 1.00이다. “바당에서 하영 놀멍 쉬멍”과 “바다에서 많이 놀며 쉬며”는 주변 말까지 방언이라 겹치는 이웃이 없어 0.00이다.

용어한 줄 뜻
분포 가설단어의 뜻은 그 단어가 함께 다니는 단어에 있다는 생각
말뭉치분석 대상이 되는 글의 모음. 이번 주는 제주 이야기 문장 13개
창 (window)기준 단어 주위를 몇 칸 볼지 정한 범위. 문장 경계를 넘지 않는다
문맥창 안에 함께 들어온 이웃 단어들
동시발생 행렬두 단어가 창 안에 함께 들어온 횟수를 칸에 적은 표. 대각선을 기준으로 좌우가 같다
벡터숫자 목록. 좌표 평면에서는 원점에서 한 점을 가리키는 화살표로 그린다
단어 벡터동시발생 행렬의 한 행. 단어를 숫자 목록으로 표현한 것
희소 벡터좌표 대부분이 0인 벡터. 이번 주 행은 42칸 중 대부분 두세 칸만 0이 아니다
밀집 벡터좌표 대부분이 0이 아닌 짧은 벡터. 7주차에 만난다
코사인 유사도두 벡터의 방향이 같은지 재는 값. 같은 방향 1, 직각 0, 반대 -1. 길이는 보지 않는다
PMI (점별 상호정보)함께 나온 횟수를 우연히 기대되는 횟수와 비교한 점수. 이번 주는 이름과 아이디어만
대응쌍같은 대상을 가리키는 방언 말과 표준어 말. 바당과 바다

주교재 5장 Embeddings. 6주차와 7주차에 걸쳐 읽는다. 자세한 서지 정보는 강의계획서를 참고한다.

  • 이 장은 수식이 많다. 수식이 나오는 부분은 넘어간다. 이 과목의 시험 범위가 아니다
  • 단어를 벡터로 표현하고 비슷한 단어를 찾는 부분을 찾아 읽는다. 이번 주에 본 동시발생 행렬과 코사인 유사도가 바로 그 준비다
  • 교재의 예제는 영어다. 단어를 벡터로 둔다는 아이디어는 언어와 무관하다. 한국어에서는 조사가 단어에 붙어 하나의 조각으로 세어진다는 점(귤을 과 귤은)이 영어와 다르다는 점만 떠올려 본다

Open In Colab

문장 13개로 동시발생 행렬을 만들고 행을 단어 벡터로 써서 코사인 유사도를 계산한다. 방언 표본으로 같은 뜻 다른 표기가 어떻게 보이는지도 확인한다. TODO는 창 크기를 바꾸는 한 곳이다.