Skip to content
딥러닝 NLP

4주차: 숨겨진 마르코프 모델(HMM)과 시퀀스 태깅

숨겨진 마르코프 모델(HMM)과 시퀀스 태깅.

□ 이번 주에 하는 일

  • 단어마다 품사라는 이름표를 붙이는 문제를 본다
  • 보이는 글자와 보이지 않는 품사라는 두 층 구조를 본다
  • 분석기를 돌려 결과를 읽고 틀린 곳을 찾는다
제주 바다 위에 둥근 주황색 부표 다섯 개가 한 줄로 떠 있고, 수면 바로 아래에 물질하는 사람들의 흐릿한 형체가 얇은 줄로 각 부표와 이어져 있는 그림. 부표는 또렷하게 보이지만 물속 형체는 윤곽만 겨우 보인다. 멀리 현무암 해안과 낮은 오름이 있다

□ 3주차에서 가져오는 것

  • 앞 한 칸만 본다. 3주차에서 단어에 쓴 그 약속을 이번 주에는 품사에 쓴다
  • 세어서 표를 만든다. 이번 주에 나오는 표 두 장도 3주차처럼 글을 세어서 만든다

□ 이 문서를 읽는 법

  • 수식은 한 개도 나오지 않는다
  • 표에 적힌 숫자는 전부 설명용 예시다
  • 알고리즘을 손으로 돌리지 않는다. 이번 주에 요구하는 것은 계산이 아니라 결과를 읽는 능력이다

강의 1: 단어마다 이름표를 붙이는 일

Section titled “강의 1: 단어마다 이름표를 붙이는 일”

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

3주차에서 제주에서 먹고 싶은 것은 ___ 의 다음 말을 고를 때 바로 앞 한 단어만 봤다. 앞을 다 보면 셀 거리가 마르기 때문이었다.

위쪽에는 나, 는, 성산, 으로, 갔다 다섯 단어 상자가 화살표로 이어져 있고 아래쪽에는 명사, 조사, 명사, 조사, 동사 다섯 품사 상자가 똑같은 모양의 화살표로 이어져 있는 그림. 두 줄 사이에 아래를 가리키는 굵은 화살표가 있고 같은 생각을 그대로 옮긴다는 설명이 붙어 있다. 각 화살표에는 앞 한 칸이라는 표시가 달려 있다

이번 주에는 같은 약속을 품사에 쓴다. 어떤 품사 다음에 어떤 품사가 오는지를 볼 때도 바로 앞 하나만 본다. 3주차를 이해했다면 이번 주의 절반은 이미 아는 셈이다.

□ 품사란 무엇인가

품사는 단어를 문장에서 하는 일에 따라 묶어 붙인 이름표다.

뜻으로 묶은 것이 아니라는 점이 중요하다. “바다”와 “산”은 뜻이 전혀 다르지만 둘 다 명사다. 문장에서 하는 일이 같기 때문이다.

이 수업에서는 결과를 읽기 위한 태그를 여섯 범주로 단순화한다. 어미는 학교 문법의 품사 자체가 아니라 문법 기능을 가진 형태소이므로, 아래 표는 학교 품사 여섯 가지의 목록이 아니다.

태그한 줄 설명예
명사사람, 물건, 장소의 이름 자리에 오는 말성산, 오름, 나
조사명사 뒤에 붙어 자리를 정해 주는 말이, 가, 을, 로
동사움직임을 나타내는 말가, 오, 타
형용사성질이나 상태를 나타내는 말빠르, 높
부사뒤에 오는 말을 꾸미는 말아주, 못
어미동사와 형용사 뒤에 붙는 꼬리다, 았다, 는

학교 문법은 아홉 가지로 나누는데 여기서는 대명사를 따로 두지 않고 명사에 넣었다. 실제 분석기는 이보다 훨씬 잘게 나눈 표를 쓴다. 어느 목록이 옳은지를 다투는 문제가 아니라 무엇을 하려는지에 따라 나누는 기준이 달라지는 것이다.

왜 목록을 여섯 개로 줄였는지도 말해 두자. 이름표가 많아질수록 붙이기는 정확해지지만 헷갈리는 자리도 함께 늘어난다. 대명사와 명사를 갈라 두면 “나”를 볼 때마다 한 번 더 고민해야 하는데, 이번 주에 확인하려는 것은 그 구분이 아니다. 목록을 줄이면 활동이 빨리 끝나고 정작 봐야 할 것, 즉 앞뒤가 이름표를 갈라 준다는 사실에 집중할 수 있다.

실제 작업에서도 같은 판단을 한다. 후기가 만족인지 불만인지만 보려는 일에 품사를 마흔 가지로 나눌 이유가 없다. 목록의 크기는 목적이 정한다.

□ 같은 글자인데 품사가 갈린다

두 문장을 보자.

문장“나는”의 정체조각내면
나는 성산으로 갔다명사 + 조사나 / 는
하늘을 나는 새가 아주 빠르다동사 + 어미나 / 는
가운데 놓인 똑같은 빈 카드 한 장에서 선 두 개가 갈라져 나가 두 장면으로 이어지는 그림. 왼쪽은 현무암 돌담 사이 길을 걸어가는 학생이고 오른쪽은 바다 위를 날아가는 새다. 두 장면의 크기가 같다

글자가 완전히 같고 조각 나누는 자리까지 같다. 갈라 주는 것은 앞뒤에 무엇이 있었는지뿐이다.

1주차의 “배” 예제와 무엇이 다른지 짚어 두자. 그때는 세 문장의 “배”가 모두 명사였고 뜻만 갈렸다. 이번에는 품사 자체가 갈린다. 앞의 것은 뜻을 고르는 문제이고 이번 것은 이름표를 고르는 문제다.

다른 예를 하나 더 보자.

문장“못”의 품사뜻
벽에 못을 박았다명사박는 물건
비가 와서 한라산에 못 갔다부사하지 못했다

판별 단서가 있다. 뒤에 조사가 붙으면 명사, 뒤에 동사가 오면 부사다. 이 단서가 다음 이야기로 이어진다.

□ 낱개가 아니라 줄줄이 붙인다

앞의 판별 단서를 다시 보면, 우리는 “못”만 보고 판단한 것이 아니라 그 뒤에 무엇이 오는지를 보고 판단했다. 품사는 단어 하나만 떼어 놓고는 정할 수 없다.

이렇게 줄줄이 늘어선 것 전체에 차례로 이름표를 붙이는 일을 시퀀스 태깅이라고 한다.

한국어에서 자주 나타나는 이어짐을 정리하면 이렇다. 아래는 설명용 예시다.

앞 품사뒤에 자주 오는 것거의 안 오는 것
명사조사어미
조사명사, 동사, 부사조사
부사동사, 형용사조사
동사어미조사

이 표를 알고 있으면 애매한 자리를 좁힐 수 있다. 비가 와서 한라산에 못 갔다 에서 “못” 뒤에 “갔다”가 온다. 동사 앞이니 부사 쪽이 유력하다. 앞뒤가 서로를 돕는다.

이 “서로 돕는다”가 이번 주 문제의 성격을 정한다. 만약 조각 하나하나를 따로 판단할 수 있다면 일은 훨씬 쉽다. 사전을 찾아 이름표를 붙이면 끝이다. 그런데 실제로는 그렇지 않다.

  • 한 자리의 답이 옆자리의 답에 달려 있다
  • 옆자리의 답도 그 옆자리에 달려 있다
  • 그래서 줄 전체를 한꺼번에 봐야 한다

낱개로 풀면 안 되는 문제라는 점이 시퀀스 태깅이라는 이름에 담겨 있다. 그리고 줄 전체를 한꺼번에 보려고 하면 따져 볼 경우의 수가 폭발하는데, 그 문제를 푸는 것이 강의 2의 내용이다.

한 문장 안에서 같은 글자가 갈리는 경우도 보자. 위 문장에는 “가”가 두 번 나온다. 비가 의 “가”는 조사이고 갔다 의 “가”는 동사다. 한 글자짜리라 단서가 적은데, 앞이 명사면 조사이고 뒤에 어미가 붙으면 동사다.

□ 한국어는 한 덩어리가 너무 크다

2주차에서 띄어쓰기로 자르면 조사가 붙어 온다는 것을 봤다. 품사를 붙이려면 그 덩어리를 더 잘게 나눠야 한다.

뜻을 가진 가장 작은 조각을 형태소라고 한다. 띄어쓰기로 자른 덩어리는 어절이고, 어절을 더 나눈 것이 형태소다.

위아래 두 줄로 한국어와 영어를 나란히 놓은 그림. 한국어 줄은 성산으로라는 한 덩어리가 성산과 으로 두 조각으로 나뉘고 명사 더하기 조사라는 이름표가 붙는 순서로 이어진다. 영어 줄은 walked라는 한 덩어리가 walk와 ed로 나뉘고 동사 더하기 꼬리라는 이름표가 붙는 순서로 이어진다

영어도 같은 일을 한다. walked 는 walk 와 ed 로 나뉘고 각각 동사와 꼬리다. 다만 영어는 덩어리가 작아서 띄어쓰기만으로도 꽤 맞아떨어지는 반면, 한국어는 조사와 어미가 붙어 있어 나누는 일이 훨씬 자주 필요하다.

이 일을 자동으로 해 주는 도구가 형태소 분석기다. 대면 시간에 직접 돌려 본다.

□ 강의 1에서 꼭 가져갈 것

  1. 품사는 뜻이 아니라 문장에서 하는 일로 묶은 이름표다
  2. 같은 글자도 자리에 따라 품사가 갈리고, 앞뒤가 그것을 갈라 준다
  3. 한국어는 어절을 형태소로 더 나눠야 이름표를 붙일 수 있다

강의 2: 숨겨진 마르코프 모델과 비터비

Section titled “강의 2: 숨겨진 마르코프 모델과 비터비”

□ 무엇이 숨겨졌는가

바다에 떠 있는 테왁을 떠올려 보자. 물 위의 테왁은 보인다. 물속의 해녀는 보이지 않는다. 우리는 테왁이 지나간 자리만 보고 해녀가 어디로 갔는지 짐작한다.

품사 태깅이 정확히 이 구조다.

바다에서문장에서
물 위의 테왁글자 조각. 눈에 보인다
물속의 해녀품사. 보이지 않는다
해녀는 순간이동을 못 한다앞 품사가 다음 품사를 좌우한다

여기서 가장 자주 하는 오해를 미리 막아 두자. “숨겨진”은 모델이 무언가를 감춘다는 뜻이 아니다. 원래 보이지 않는 것이다. 글에는 글자만 적혀 있고 품사는 어디에도 쓰여 있지 않다. 사람은 읽으면서 머릿속으로 품사를 붙이지만 그 이름표가 종이에 있는 것은 아니다.

□ 두 층으로 그리면 이렇게 된다

위아래 두 줄로 나뉜 그림. 윗줄은 보이는 것이라는 이름이 붙어 있고 나, 는, 성산, 으로, 갔다 다섯 조각이 놓여 있다. 아랫줄은 숨은 것이라는 이름이 붙어 있고 명사, 조사, 명사, 조사, 동사 다섯 품사가 놓여 있다. 아랫줄의 품사끼리는 앞 한 칸이라고 적힌 화살표로 옆으로 이어지고, 각 품사에서 바로 위 조각으로는 내놓는다고 적힌 점선 화살표가 올라간다

화살표가 두 종류라는 점을 눈여겨보자.

  • 가로 화살표는 품사에서 품사로 이어진다. 명사 다음에 조사가 오는 식이다. 3주차의 “앞 한 칸만 본다”가 여기 쓰인다
  • 세로 화살표는 품사에서 글자로 내려온다. 명사가 “성산”이라는 글자를 내놓는다는 뜻이다

우리가 보는 것은 윗줄뿐이다. 아랫줄을 짐작해 내는 것이 이번 주의 문제다.

□ HMM이 가진 부품 세 가지

윗줄에 모델이 가진 것으로 품사 목록, 이어질 표, 내놓을 표 세 상자가 차례로 놓여 있고 각각 상태, 품사에서 품사로, 품사에서 글자로라는 설명이 붙어 있는 그림. 아랫줄에는 보이는 문장 상자가 있고 두 줄이 만나 숨은 품사열 상자로 이어진다

첫째, 품사 목록이다. 앞에서 정한 여섯 가지가 그것이다. 숨어 있는 것이 어떤 것들인지 미리 정해 두어야 짐작할 수 있다.

둘째, 품사에서 품사로 이어질 가능성을 적은 표다. 명사 다음에 조사가 올 가능성이 높고 조사 다음에 조사가 올 가능성은 낮다. 강의 1의 이어짐 표가 이것의 간단한 형태다.

셋째, 품사가 그 글자를 내놓을 가능성을 적은 표다. 명사 자리에서 “성산”이 나올 가능성, 조사 자리에서 “으로”가 나올 가능성을 적어 둔다.

첫 품사가 무엇일 가능성이 높은지 나타내는 시작 확률도 필요하다. 여기서는 시작 표시에서 첫 품사로 이어지는 가능성으로 생각하면 된다. 위 그림은 직관을 위한 단순화이며, 시작 확률까지 포함해야 완전한 HMM 설명이 된다.

두 표는 어디서 올까. 3주차와 똑같이 세어서 만든다. 사람이 품사를 붙여 둔 글을 잔뜩 모아 놓고, 명사 다음에 조사가 몇 번 왔는지 세고 나누면 첫 번째 표가 나온다. 3주차에서 단어 짝을 셌던 것과 같은 일을 품사 짝으로 하는 것이다.

여기서 중요한 차이가 하나 있다. 3주차에서는 그냥 글만 있으면 셀 수 있었다. 이번에는 품사가 이미 붙어 있는 글이 필요하다. 사람이 하나하나 이름표를 달아 둔 자료가 있어야 한다는 뜻이다.

  • 그런 자료를 만드는 데는 사람의 손이 많이 들어간다. 그래서 양이 제한된다
  • 표준어 중심 자료로 만든 분석기는 제주 지명과 지역어에 대한 단서가 부족할 수 있다
  • 다만 실제 분석기의 학습 자료와 사전을 직접 확인하지 않았다면, 특정 표현이 없다는 사실은 출력만으로 확정할 수 없다

대면 시간에 분석기가 제주 말에서 자주 틀리는 것을 보게 되는데, 가능한 이유를 이 구조와 연결해 본다. 자료·사전의 범위, 나누는 기준, 문맥 점수가 원인 후보이며 출력만으로 특정 원인을 확정하지 않는다. 대면의 형태소 분석기가 교재의 HMM을 그대로 구현한다는 뜻도 아니다.

이 두 표로 무엇을 계산하는지는 이 과목에서 다루지 않는다. 표가 있다는 것과 그것이 세어서 만들어진다는 것까지가 이번 주의 범위다.

□ 길이 너무 많다

이제 문제가 하나 생긴다. 조각마다 품사 후보가 여러 개이니 가능한 조합이 아주 많아진다.

조각 수가 1에서 6으로 늘어날 때 가능한 품사 조합은 3, 9, 27, 81, 243, 729로 치솟고 비터비가 적어 두는 칸은 3, 6, 9, 12, 15, 18로 완만하게 느는 것을 나란히 보여 주는 묶은 막대그래프. 오른쪽 막대들은 왼쪽 막대에 비해 거의 바닥에 붙어 보인다

품사 후보가 세 개뿐이라고 해도 이렇다.

조각 수가능한 품사 조합
13
29
327
5243
6729

조각이 하나 늘 때마다 세 배가 된다. 실제 분석기는 품사 후보가 수십 개이므로 문장 하나에도 조합이 천문학적으로 늘어난다. 전부 따져 보는 방법은 쓸 수 없다.

□ 비터비: 칸마다 가장 좋은 길 하나만 남긴다

가로로 나, 는, 성산, 으로, 갔다 다섯 자리가 놓이고 세로로 명사, 동사, 조사 세 품사가 놓인 격자 그림 두 개. 왼쪽 격자는 칸과 칸을 잇는 선이 전부 그려져 그물처럼 얽혀 있고 길이 243가지라는 설명이 붙어 있다. 오른쪽 격자는 칸마다 들어오는 선이 하나씩만 남아 있고 칸 자체는 모두 그대로 있으며, 명사에서 조사, 명사, 조사, 동사로 이어지는 굵은 파란 선 하나가 끝에서 되짚은 길로 표시돼 있다

가로에 조각을, 세로에 품사를 놓으면 칸들의 판이 만들어진다. 이것을 격자라고 부른다. 품사를 붙이는 일은 이 격자를 왼쪽에서 오른쪽으로 가로지르는 길 하나를 고르는 일이다.

갈림목마다 쪽지를 붙인다고 생각하면 쉽다.

  1. 각 칸에 도착할 때, 그 칸까지 오는 길 중 가장 좋은 것 하나만 쪽지에 적어 둔다
  2. 나머지 길은 지운다
  3. 끝에 도착한 다음 쪽지를 거꾸로 되짚으면 전체 길이 나온다

왜 지워도 되는가. 어떤 칸에 도착하는 길이 여럿일 때, 그 칸에서 앞으로 어떻게 가든 조건은 똑같기 때문이다. 그 칸까지 뒤처진 길은 뒤에서 무엇을 해도 같은 칸에서 출발한 더 좋은 길을 앞설 수 없다. 그러니 남길 이유가 없다.

여기서 아주 중요한 단서가 붙는다. 지우는 것은 같은 칸에 도착하는 길끼리다. 칸 자체를 지우는 것이 아니다.

  • 첫 자리의 “나”를 명사로 본 길과 동사로 본 길은 도착한 칸이 다르다. 그래서 둘 다 살아남는다
  • 지금 뒤처져 보이는 동사 쪽 길도 뒤에서 앞설 수 있다. 이어지는 품사가 달라 그 뒤의 가능성이 달라지기 때문이다
  • 그래서 격자의 모든 칸이 끝까지 남는다. 각 칸이 자기에게 들어오는 길 중 하나씩만 붙들고 있을 뿐이다

가장 좋은 길은 끝에 도착한 뒤에 정해진다. 마지막 자리에서 가장 좋은 칸을 고르고, 거기서 쪽지를 거꾸로 되짚어 오면 그것이 답이다. 중간에 “이 갈래는 가망 없다”고 미리 잘라 내는 방식이 아니다.

이 방법을 비터비라고 한다. 앞의 표에서 본 것처럼, 조각이 여섯 개일 때 조합은 729가지인데 비터비가 최적 경로와 점수를 저장하는 칸은 18개다. 각 칸에 오는 여러 연결의 점수는 비교해야 하므로, 18칸이 계산 횟수 18번이라는 뜻은 아니다.

우리가 하지 않는 것을 분명히 해 두자. 칸마다 숫자를 적어 넣고 계산하는 일은 이 과목에서 하지 않는다. 시험에도 나오지 않는다. 이번 주에 요구하는 것은 격자 위에 길이 하나 지나간다는 그림을 읽는 것까지다.

그림에서 읽어 둘 것이 두 가지 있다.

  • 왼쪽과 오른쪽의 선 개수 차이. 왼쪽은 모든 조합을 그려 그물처럼 얽혀 있고 오른쪽은 칸마다 하나씩만 남아 훨씬 단순하다. 그런데 두 방법이 찾아내는 답은 같다
  • 칸은 하나도 사라지지 않았다. 오른쪽에도 열다섯 칸이 그대로 있다. 줄어든 것은 칸이 아니라 칸으로 들어오는 선의 개수다. 어느 품사 갈래도 중간에 포기되지 않는다

한 가지 덧붙이면, 비터비는 품사 태깅에만 쓰는 방법이 아니다. 줄줄이 이어진 것 중에서 가장 좋은 하나를 고르는 문제면 어디에나 같은 방식이 쓰인다. 음성을 글자로 옮기는 일이나 통신에서 신호를 복원하는 일에도 같은 생각이 들어간다.

□ 왜 지금 이것을 배우는가

요즘 모델은 이 두 표를 손으로 세지 않는다. 9주차 이후에 다루는 방식은 표를 만드는 대신 다른 방법을 쓴다.

그래도 이 주차가 필요한 이유는 보이는 것에서 보이지 않는 것을 짐작한다는 구조가 계속 반복되기 때문이다. 나중에 배울 모델들도 결국 같은 문제를 다른 방법으로 푼다. 구조를 여기서 한 번 제대로 봐 두면 뒤가 수월하다.

□ 강의 2에서 꼭 가져갈 것

  1. 보이는 것은 글자이고 품사는 원래 보이지 않는다
  2. 모델은 품사 목록과 표 두 장을 가지고 있으며 두 표는 세어서 만든다
  3. 가능한 조합은 조각이 늘 때마다 폭발하지만 칸은 완만하게 는다
  4. 비터비는 칸마다 가장 좋은 길 하나만 남기며 나아가고, 그래도 답은 같다

□ 활동 A: 품사를 직접 붙여 보기

조각은 미리 나눠 두었다. 여러분은 태그만 고르면 된다. 앞의 여섯 가지 중에서 고른다.

문장 A 나는 성산으로 갔다

조각나는성산으로가았다
내 답

문장 B 하늘을 나는 새가 아주 빠르다

조각하늘을나는새가아주빠르다
내 답

문장 C는 선택이다. 비가 와서 한라산에 못 갔다

붙이면서 애매하다고 느낀 자리에 표시를 해 둔다. 이 표시가 대면 시간의 재료가 된다. 어디서 망설였는지가 분석기가 틀리는 자리와 겹치는 경우가 많다.

○ 망설이게 되는 자리들

미리 귀띔해 두면 아래 다섯 곳에서 많이 멈춘다. 답을 보기 전에 스스로 먼저 판단해 보라.

지점왜 애매한가무엇이 갈라 주는가
A의 “나 / 는” 과 B의 “나 / 는”조각 모양이 완전히 같다A는 뒤에 “성산으로 갔다”가 오고 B는 앞에 “하늘을”이 있다
C의 “가”가 두 번한 글자짜리라 단서가 적다앞이 명사면 조사, 뒤에 어미가 붙으면 동사
C의 “못”명사로도 부사로도 읽힌다뒤에 조사가 없고 동사가 온다
B의 “빠르”동사인지 형용사인지 헷갈린다움직임이 아니라 상태다
A와 C의 “았다”한 조각인지 두 조각인지이번 주는 한 조각으로 본다

마지막 줄을 눈여겨보자. 정답이 하나가 아닐 수 있다. 분석기는 “가 / 았다” 대신 “갔 / 다”처럼 다른 자리에서 나눌 수도 있는데 그것도 틀린 것이 아니다. 대면 시간에 “내 답이 분석기와 다른데 틀린 것이냐”는 질문이 나오면 이 줄을 떠올리면 된다. 나누는 기준이 다를 뿐이다.

유의할 점 세 가지다.

  • 정답을 맞히는 것이 목적이 아니다. 망설인 자리를 찾는 것이 목적이다
  • A와 B의 “나 / 는”은 조각 모양이 완전히 같다. 같은 답을 썼다면 왜 그랬는지 적어 둔다
  • 여섯 가지 중에 딱 맞는 것이 없다고 느껴지면 그 느낌도 적어 둔다

□ 활동 B: 내가 붙인 품사에서 이어짐 세기

활동 A에서 붙인 답을 재료로 작은 표를 채운다. 3주차에서 단어 짝을 셌던 것을 품사로 옮긴 것이다.

앞 품사뒤에 온 품사횟수
명사
조사

문장 A와 B에서 명사 다음에 무엇이 왔는지 세어 보면 조사가 대부분일 것이다. 강의 2의 “이어질 표”가 바로 이렇게 만들어진다. 여러분이 방금 만든 것이 그 표의 아주 작은 판이다.

□ 분석기가 하는 일 두 가지

  1. 문장을 조각으로 나눈다 (어절을 형태소로)
  2. 각 조각에 품사를 붙인다

강의 1에서 손으로 한 일을 자동으로 하는 것이다.

□ 노트북에서 하는 일

한국어 형태소 분석 라이브러리 eKoNLPy를 불러와 문장을 넣으면 조각과 품사가 함께 나온다. 설치 셀, 설치 확인 셀, 분석 코드가 순서대로 있고 손대지 않아도 돌아간다. TODO는 문장을 바꿔 넣는 한 곳뿐이다.

%pip -q install "ekonlpy==2.2.1" "pandas>=1.5.3"
import sys
from importlib.metadata import version
import ekonlpy
import fugashi
import numpy
import scipy
import pandas
print("Python:", sys.version.split()[0])
print("eKoNLPy:", getattr(ekonlpy, "__version__", "알 수 없음"))
print("NumPy:", numpy.__version__)
print("SciPy:", scipy.__version__)
print("pandas:", pandas.__version__)
print("fugashi:", version("fugashi"))
from ekonlpy.tag import Mecab
tagger = Mecab()
print(tagger.pos("나는 성산으로 갔다"))

확인 셀에는 Python, eKoNLPy, NumPy, SciPy, pandas, fugashi 버전이 차례로 나온다. 설치나 확인 셀에서 오류가 나면 다음 셀로 넘어가지 않는다. 설치 후 가져오기 오류가 계속되면 런타임을 다시 시작하고 설치 셀부터 다시 실행한다.

eKoNLPy 2.2.1에서 분석 셀의 출력은 [('나', 'NP'), ('는', 'JX'), ('성산', 'NNG'), ('으로', 'JKB'), ('갔', 'VV'), ('다', 'EC')] 이다. 다른 버전이나 런타임에서는 결과가 달라질 수 있다.

□ 출력을 읽는 법

출력은 조각과 태그가 짝을 이룬 목록으로 나온다. 한 가지 미리 알아 둘 것이 있다.

태그 이름이 낯선 약자로 나온다. 우리가 쓴 여섯 가지와 이름이 다르고 훨씬 잘게 나뉘어 있다. 노트북에 대응표를 넣어 두었으니 그것을 보면 된다. 약자를 외울 필요는 없다.

□ 자주 막히는 지점

증상원인조치
설치 셀에서 오래 걸린다라이브러리와 사전 파일을 내려받는 중이다끝날 때까지 기다린다
ModuleNotFoundError: No module named 'ekonlpy'설치 셀을 건너뛰었거나 런타임이 끊겨 설치가 사라졌다노트북 맨 위의 설치 셀부터 다시 실행한다
설치 뒤 가져오기 오류가 난다런타임에 남은 이전 라이브러리와 새 라이브러리가 섞였다런타임을 다시 시작하고 설치 셀부터 다시 실행한다
출력이 비어 있다문장을 넣는 칸이 비었다따옴표 안에 문장이 들어 있는지 확인한다

□ 사람이 붙인 것과 나란히 놓는다

새별오름에서 쇠소깍까지 갔다라는 문장을 두 줄로 나란히 놓고 비교한 그림. 윗줄은 사람이 붙인 것으로 새별오름, 에서, 쇠소깍, 까지, 가, 았다 여섯 조각이고 아랫줄은 분석기 출력으로 새별, 오름, 에서, 쇠소깍, 까지, 갔, 다 일곱 조각이다. 두 줄은 글자 위치가 맞춰져 있다. 일치하는 에서, 쇠소깍, 까지는 초록 테두리이고, 새별오름이 둘로 쪼개진 구간에는 붉은 테두리와 유형 가 표시가, 가 았다와 갔 다로 나눈 구간에는 붉은 테두리와 나누는 기준 차이 표시가 붙어 있다

새별오름에서 쇠소깍까지 갔다 를 넣어 보자. 사람은 “새별오름”을 하나로 보는데 분석기는 “새별 / 오름” 두 조각으로 쪼개고 둘 다 일반명사로 붙인다. 반면 “쇠소깍”은 통째로 고유명사로 잡는다. 이 결과는 지명을 하나로 다루는 기준과 분석기의 경계가 다른 사례다. 사전 수록 여부를 직접 조회하지 않았으므로 새별오름이 사전에 없다고 확정할 수는 없다.

조사인 “에서”와 “까지”는 양쪽이 일치한다. 사전 수록 여부는 결과를 바꿀 수 있는 원인 중 하나다. 사전에 있어도 문맥 점수나 분석 기준 때문에 다른 결과가 나올 수 있다. 흔한 말일수록 사전에 들어 있을 가능성이 크다.

두 줄을 표로 옮기면 이렇다. 아래는 노트북에서 eKoNLPy 2.2.1으로 실제로 돌린 결과이며, 분석기와 버전이 다르면 결과도 달라질 수 있다.

조각과 품사
사람이 붙인 것새별오름/명사 · 에서/조사 · 쇠소깍/명사 · 까지/조사 · 가/동사 · 았다/어미
분석기 출력새별/명사 · 오름/명사 · 에서/조사 · 쇠소깍/명사 · 까지/조사 · 갔/동사 · 다/어미

조각 수부터 다르다. 사람은 여섯 조각으로 봤고 분석기는 일곱 조각으로 나눴다. 조각 경계가 어긋나면 그 뒤의 이름표는 비교할 수조차 없다. 그래서 틀린 곳을 찾을 때는 먼저 조각 경계가 맞는지부터 본다.

경계가 어긋난 곳은 두 군데다. 하나는 새별오름이 둘로 쪼개진 자리다. 다른 하나는 “갔다”인데, 사람은 “가 / 았다”로 나눴고 분석기는 “갔 / 다”로 나눴다. 이쪽은 틀렸다기보다 나누는 기준이 다른 것이다. 활동 A에서 “았다”를 한 조각으로 볼지 망설였던 자리가 바로 여기다.

문장을 하나 더 보자. 성산일출봉 앞에서 물질하는 걸 보난 신기했다 를 넣으면 세 군데를 눈여겨볼 수 있다.

  • 성산일출봉은 “성산”과 “일출봉” 두 고유명사로 쪼개진다
  • 보난(보니까)은 모르는 말로 빠지지 않고 “보 / 난”으로 잘려 동사와 연결 어미가 붙는다. 사전에 있는 조각 “난”에 맞춰 넣은 결과다. 쪼갠 모양은 사람 답과 비슷해 보여도, 분석기가 “-난”이 “-니까”라는 뜻임을 안다는 뜻은 아니다
  • 걸은 “것”과 “을”로 나뉘지 않고 한 조각의 의존 명사로 남는다

□ 오류 유형 다섯 가지

틀린 개수를 세는 것보다 어떤 유형으로 틀렸는지 가려내는 것이 중요하다.

코드유형무엇이 일어나는가왜 생기는가
가고유명사 쪼개짐지명 하나가 여러 조각이 된다사전 수록 여부 또는 분석 단위·점수의 차이 의심
나고유명사를 일반명사로장소 이름을 보통 명사로 본다같은 글자가 일반명사로도 쓰인다
다미등록어 의심 분해익숙한 표현이 잘게 쪼개져 기대와 다른 이름표를 받는다자료·사전에서 적게 다뤘을 가능성. 실제 수록 여부는 별도 확인
라조사 잘못 나눔조사가 아닌데 떼어 내거나 붙여 둔다같은 글자가 조사로도 쓰인다
마품사 헷갈림조각은 맞는데 이름표가 틀렸다앞뒤 단서가 학습 자료의 경향과 다르다

□ 방언을 넣으면 무슨 일이 생기는가

서랍이 많은 나무 서랍장 하나가 열려 있고 그 안에 빈 카드들이 가지런히 꽂혀 있는 그림. 카드 한 장만 서랍 밖에서 비스듬히 떠 있어 안으로 들어가지 못하고 튕겨 나온 모습이다. 뒤로는 현무암 돌담과 감귤 몇 개가 놓인 탁자가 보인다

혼저 옵서예 를 넣어 보자. 1주차부터 계속 나온 그 인사말이다.

사람은 “혼저”를 부사로, “옵서예”를 동사와 어미로 본다. 분석기는 “혼 / 저 / 옵 / 서 / 예” 다섯 조각으로 쪼개고 혼/명사 · 저/동사 · 옵/어미 · 서/어미 · 예/명사를 붙인다. 모르는 말이라는 표시는 어디에도 없다. 익숙한 인사 표현이 기대와 다르게 분해된 관찰 결과다. 사전·학습 자료 부족은 가능한 이유지만 그 내용을 직접 확인하지 않았으므로 미등록어로 확정하지 않는다.

여기서 눈여겨볼 점이 있다. 이 분석기는 모르는 말을 만나도 “모른다”고 표시하지 않는다. 그래서 출력만 보고는 틀렸는지 알 수 없고, 사람이 붙인 답과 나란히 놓아야 드러난다. 조각이 유난히 잘게 쪼개진 자리가 미등록어를 의심할 첫 번째 신호다.

서랍장 그림이 이 상황이다. 서랍에는 자리가 정해진 카드들만 들어가고, 목록에 없는 카드는 제자리를 찾지 못한다. 이 분석기는 그 카드를 밖에 두는 대신 잘게 찢어 비슷해 보이는 서랍들에 나눠 넣는다.

○ 아래아 표기

옛 표기와 일부 방언 기록에는 아래아(ㆍ)가 쓰인다. 입력 방식과 분석기의 사전·토큰 처리 방식에 따라 결과가 달라질 수 있다. 표기 종류를 확인하고 실제 출력을 관찰해야 하며, 모든 자판과 사전이 이를 지원하지 않는다고 단정하지 않는다. 이 표기를 어떻게 맞춰 줄 것인지는 이 과목에서 다루지 않는다. 여기서는 이런 일이 있다는 것까지만 본다.

□ 오늘 확인할 것

  • 지정 문장 세 개를 분석기에 넣고 출력을 기록했다
  • 사람이 붙인 것과 다른 자리에 표시했다
  • 다른 자리마다 오류 유형 코드를 붙였다

□ 기본·심화 학습 경로

  • 기본: 지정 문장의 조각·태그를 사람이 붙인 것과 대조. TODO 문장 한 곳만 변경
  • 심화: 같은 출력에서 분석 기준 차이·명백한 불일치·원인 미확인을 구분. 형태소 경계와 태그 중 무엇부터 비교해야 하는지 설명
  • 두 경로 모두 제공 코드를 실행한 결과 해석 중심. 추가 구현이나 별도 TODO 요구 없음

[이론] 알고리즘 내부 구현은 다루지 않고 동작 결과 해석에 집중. 사람이 애매하다고 느낀 지점과 모델이 틀린 지점을 대조

  • 활동 A에서 표시한 애매 지점과 분석기가 틀린 지점을 표로 대조한다
  • 겹친 곳과 안 겹친 곳을 각각 하나씩 골라 설명한다
  • 틀린 개수가 아니라 유형을 맞게 붙였는지로 채점한다

[구현] 형태소 분석 라이브러리를 적용해 결과를 뽑고, 자신이 붙인 품사와 비교

  • 지정 문장 세 개를 노트북에 넣고 출력을 그대로 옮긴다
  • 자기 답과 다른 칸에 표시한다
  • 코드가 끝내 돌지 않아도 무엇을 확인하려 했는지 쓰면 부분 점수를 받는다

[실무] 한국어 형태소 분석의 난점을 실제 오류 사례로 확인. 방언 표현을 넣어 어떻게 처리되는지 관찰하고, 아래아 같은 표기 문제는 현상 소개까지만 다룸

  • 방언 문장 두 개를 넣고 결과를 기록한다
  • 오류 유형표의 코드를 붙인다
  • 아래아 표기는 그런 일이 있다는 기록까지만 하고 고치는 방법은 찾지 않는다
Q1. 국어 시간에 배운 품사와 같은 것인가?

뿌리는 같지만 쓰는 목록이 다르다. 학교 문법은 아홉 가지로 나누고 이 수업에서는 결과를 읽기 위한 태그를 여섯 범주로 단순화한다. 어미는 학교 문법의 품사 자체가 아니라 문법 기능을 가진 형태소이므로, 아래 표는 학교 품사 여섯 가지의 목록이 아니다. 형태소 분석 라이브러리는 또 다른 목록을 쓰는데 훨씬 잘게 나뉘어 있고 이름도 낯선 약자로 나온다. 어느 목록이 옳은지를 다투는 문제가 아니라 무엇을 하려는지에 따라 나누는 기준이 달라지는 것이다. 이번 주에 중요한 것은 목록을 외우는 것이 아니라 같은 글자에 다른 이름표가 붙을 수 있다는 사실이다.

Q2. 숨겨진 마르코프 모델에서 무엇이 숨겨졌다는 것인가? 모델이 무언가를 감추는가?

감추는 것이 아니다. 원래 보이지 않는 것이다. 우리가 문장에서 볼 수 있는 것은 글자뿐이고 각 조각의 품사는 글에 적혀 있지 않다. 사람은 읽으면서 머릿속으로 품사를 붙이지만 그 이름표가 종이에 쓰여 있지는 않다. 물 위에 뜬 부표는 보이고 물속에서 움직이는 사람은 보이지 않는 것과 같다. 모델이 하는 일은 보이는 것만 가지고 보이지 않는 것을 짐작하는 일이고, 그래서 숨겨졌다는 말이 이름에 들어갔다.

Q3. 비터비는 모든 길을 다 따져 보지 않는데 가장 좋은 길을 놓칠 수 있지 않은가?

놓치지 않는다. 지우는 것은 길 전체가 아니라 같은 칸에 도착하는 길들 중 뒤처진 것뿐이다. 어떤 칸에 도착하는 길이 여러 개일 때, 그 칸에서 앞으로 어떻게 가든 조건은 똑같다. 그러니 그 칸까지 오는 길 중 제일 좋은 것 하나만 남겨 두면 나머지는 뒤에서 어떻게 해도 앞설 수 없다. 남긴 하나만 들고 다음 칸으로 가면 되고, 이것을 칸마다 반복하면 끝에 가서 전체에서 가장 좋은 길이 나온다.

Q4. 형태소 분석기가 제주 지명과 방언을 틀리면 그 도구가 잘못 만들어진 것인가?

출력 오류와 그 원인은 구분한다. 자료·사전의 범위가 맞지 않거나, 분석 기준·문맥 점수·프로그램의 결함 때문에 달라졌을 수 있다. 학습 자료와 사전의 실제 내용을 확인하지 않았다면 “본 적 없는 말이 원인”이라고 확정할 수 없다. 그래서 틀린 결과 자체보다 어떤 유형으로 틀렸는지가 더 많은 것을 알려 준다. 쪼개짐인지, 미등록어를 억지로 나눈 것인지, 이름표만 틀린 것인지 가려내는 것이 이번 주 대면 활동이다.

Q5. 형태소 분석 실습은 HMM의 내부 계산을 확인하는 것인가?

교재 모델과 실습 도구의 구분. HMM은 품사 태깅의 두 층 구조와 경로 찾기를 이해하기 위한 예시. 이 노트북은 형태소 분석 라이브러리의 출력을 관찰하는 활동이며, 그 도구가 교재의 단순 HMM과 같은 방식으로 동작한다는 검증은 아님.

Q6. 비터비가 18칸을 저장하면 계산도 18번인가?

저장하는 칸 수와 연결 비교 횟수의 구분. 조각 6개와 후보 3개이면 격자는 18칸. 각 칸까지의 최적 경로를 구하려면 이전 칸들에서 들어오는 점수를 비교해야 하므로 계산 횟수가 18번이라는 뜻은 아님. 모든 완성 경로를 따로 펼쳐 저장하지 않는다는 것이 요점.

Q7. 사람이 나눈 것과 다르면 모두 오류인가?

분석 기준 차이와 오류의 구분. 가 / 았다와 갔 / 다처럼 출력 형식의 기준이 다를 수 있음. 먼저 원문 구간을 맞추고 수업에서 정한 단위와 태그로 비교. 지명이 쪼개졌더라도 목적에 따라 허용 여부가 다르므로 판정 기준의 명시 필요.

Q8. 자주 틀리는 제주 표현만 보면 원인을 알 수 있는가?

관찰과 원인 가설의 구분. 분해·태그 차이는 출력에서 관찰 가능. 학습 자료 부족, 사전 수록, 문맥 점수는 추가 확인이 필요한 원인 후보. 실행 환경·버전·입력 문장을 함께 기록해 다른 설정에서 재현되는지 비교하는 절차 필요.

  1. 다음 중 문장에서 눈으로 직접 볼 수 있는 것은 무엇이고, 보이지 않아 짐작해야 하는 것은 무엇인가? (가) 글자 조각 (나) 각 조각의 품사
  2. 나는 성산으로 갔다 와 하늘을 나는 새가 아주 빠르다 에서 “나는”의 품사가 서로 다르다. 무엇을 보고 갈라낼 수 있는가?
  3. 품사 후보가 3개이고 조각이 4개인 문장이 있다. 품사를 붙이는 방법은 모두 몇 가지인가? 비터비의 격자에서 점수를 저장하는 칸은 몇 개인가? 이 칸 수가 실제 연결 비교 횟수와 같은가?
  4. 비터비가 격자의 각 칸에 남겨 두는 것은 무엇인가? (가) 그 칸까지 오는 모든 길 (나) 그 칸까지 오는 가장 좋은 길 하나 (다) 그 칸에서 앞으로 갈 수 있는 길 전부
  5. 분석기가 새별오름 을 새별 + 오름 두 조각으로 쪼갰다. 오류 유형표의 어느 유형이며 왜 이런 일이 생기는가?
정답 보기
  1. 볼 수 있는 것은 (가) 글자 조각이고, 보이지 않는 것은 (나) 품사다. 글에는 글자만 적혀 있고 품사는 어디에도 쓰여 있지 않다. 이 구조 때문에 모델 이름에 “숨겨진”이 들어간다.

  2. 앞뒤에 무엇이 놓였는지를 본다. 앞 문장에서는 “나는” 뒤에 “성산으로 갔다”가 와서 누가 갔다는 이야기가 되므로 명사와 조사다. 뒤 문장에서는 앞에 “하늘을”이 있고 뒤에 “새”가 와서 새를 꾸미는 자리가 되므로 동사와 어미다. 글자만으로는 절대 갈리지 않고 옆자리가 갈라 준다.

  3. 모두 81가지이고 비터비의 격자는 12칸이다. 각 칸에 들어오는 연결을 따로 비교하므로 계산이 12번으로 끝난다는 뜻은 아니다. 조각마다 3갈래이니 3을 네 번 곱해 81이 되고, 격자는 품사 3줄 곱하기 조각 4자리로 12칸이다. 조각이 늘면 앞의 수는 세 배씩 뛰지만 칸은 셋씩만 는다.

  4. (나)이다. 같은 칸에 도착하는 길이 여럿이면 그중 가장 좋은 것 하나만 남기고 나머지는 지운다. 그 칸부터 앞으로 가는 조건은 어느 길로 왔든 똑같기 때문에 뒤처진 길은 뒤에서도 앞설 수 없다.

  5. 유형 가, 고유명사 쪼개짐이다. 두 조각이 모두 일반명사로 붙었으니 유형 나로 함께 적어도 맞다. 관찰한 것은 조각 경계와 이름표의 차이다. 사전 수록 여부, 지명을 나누는 기준, 문맥 점수 등이 원인 후보다. 사전이나 학습 자료를 직접 확인하지 않았으므로 원인은 확정할 수 없다.

용어한 줄 뜻
품사단어를 문장에서 하는 일에 따라 묶어 붙인 이름표
품사 태깅문장의 각 조각에 품사 이름표를 붙이는 일
시퀀스 태깅줄줄이 늘어선 것 전체에 차례로 이름표를 붙이는 일
어절띄어쓰기로 잘라 낸 한 덩어리
형태소뜻을 가진 가장 작은 조각. 어절을 더 잘게 나눈 것
형태소 분석기문장을 형태소로 나누고 각 조각에 품사를 붙여 주는 도구
태그 집합쓰기로 정해 둔 품사 이름의 목록. 목적에 따라 달라진다
관측우리가 실제로 볼 수 있는 것. 여기서는 글자 조각
상태보이지 않아 짐작해야 하는 것. 여기서는 품사
숨겨진 마르코프 모델 (HMM)보이는 것만 가지고 보이지 않는 것의 줄을 짐작하는 모델
이어질 가능성어떤 품사 다음에 어떤 품사가 올 가능성
내놓을 가능성어떤 품사가 그 글자를 내놓을 가능성
격자가로에 조각을, 세로에 품사를 놓아 만든 칸들의 판
비터비칸마다 가장 좋은 길 하나만 남기며 나아가 전체에서 가장 좋은 길을 찾는 방법
미등록어분석기가 가진 사전에 없는 말. 아는 조각들로 억지로 쪼개지기 쉽다
품사 중의성같은 글자가 자리에 따라 다른 품사로 읽히는 성질

주교재 17장의 품사 태깅 절과 HMM 품사 태깅 절. 자세한 서지 정보는 강의계획서를 참고한다.

  • 교재의 예제는 영어이고 태그 이름도 영어 약자다. 태그 이름을 외우려 하지 말고 두 층 구조가 같은지만 확인한다
  • 교재에 나오는 격자 그림을 찾아보고 이 노트의 격자 그림과 같은 모양인지 맞춰 본다. 그림 하나만 대조해도 충분하다
  • 수식이 나오는 부분은 넘어간다. 이 과목의 시험 범위가 아니다

Open In Colab

형태소 분석기로 지정 문장 세 개에 품사를 붙이고, 사람이 붙인 것과 다른 자리를 찾는다. TODO는 문장을 바꿔 넣는 한 곳이다.