상세 컨텐츠

본문 제목

형태소 분석기 Kiwi에 사투리 분석 기능 추가!

프로그래밍/NLP

by ∫2tdt=t²+c 2025. 12. 30. 00:30

본문

드디어 Kiwi v0.22.0에서부터 아주 기초적이긴 하지만 그래도 한국어 사투리들을 분석할 수 있는 기능이 추가되었습니다. 이번 포스팅에서는 Kiwi에 방언 분석 기능을 추가한 방법과 그 과정을 간략하게 설명하고 현재 모델의 성능을 소개하고자 합니다.

CoNg의 장점을 부각시키기 위한 도전

사투리에 대한 형태소 분석을 시도한 것은 사실 Kiwi에 최근 적용된 신경망 기반의 CoNg 모델의 유연성을 입증하기 위함이었습니다. 신경망 모델은 고전적인 통계 모델보다 노이즈에 강건하고 학습 때 배우지 않았던 패턴에 대해서도 더 잘 작동하기 때문에 학습 데이터가 사실상 전무한 한국어 사투리에 대해서도 잘 작동할 수 있을 것이라고 추정해볼 수 있습니다.

즉 CoNg 모델이 기존의 통계 모델보다 사투리 분석에서 실제로 높은 성능을 보인다면 통계 모델에서 신경망 모델로 갈아탄 게 정말로 좋은 선택이었다는 걸 다시 한번 입증할 수 있는 것이지요. 그래서 제가 비록 한국어 사투리 0개국어 구사자이지만, 아무리 사투리라도 한국어인만큼 얼마나 어렵겠냐며 방언 형태소 분석기에 도전하게 되었습니다.

아무리 사투리라도 한국어다

그런데 도대체 사투리는 얼마나 표준어와 어떤 점이 얼마나 유사한 것이고 과연 언어 모델이 이 유사성을 활용할 수 있을까요? 일단 언어학에서 방언을 정의하는 데에 흔히 사용되는 기준은 상호 의사 소통성입니다. 즉 A언어와 B언어를 쓰는 화자가 별다른 노력 없이도 서로 의사소통을 하는데에 문제가 없다면 A와 B는 같은 언어에 속한 방언으로 묶어서 보는 것입니다. 정말 모호한 기준이지요. A언어 화자와 B언어 화자가 서로 의사소통을 하는데 지장이 없는 이유를 좀더 분석해보면 보통 다음과 같이 여러 언어학적 층위에서 유사성이 있기 때문입니다.

  • 음운 체계: 두 언어에서 사용하는 음운들이 동일. 다만 음운이 실제 음성으로 실현되는 과정에서 나타나는 변이음의 양상이 다를 수 있음.
  • 형태론: 형태소를 다루는 규칙이 대체로 동일. 차이점이 있다면 일부 형태소의 표면형이 다르거나 종종 같은 대상을 가리키는 형태소가 아예 다른 경우가 있음.
  • 통사론(문법): 문장을 구성하는 방법이 거의 동일. 어순을 비롯한 문법 시스템은 대체로 거의 동일함.
  • 핵심 어휘: 일상에서 자주 쓰이는 단어들이 거의 동일.

형태론에서 일부 이질적인 표면형을 가진 형태소들과 음운 체계의 실현 양상 때문에 표준어와 사투리가 가장 크게 구분된다는 걸 알 수 있습니다. 반면 핵심 어휘와 통사론에서는 표준어와 사투리 간의 차이가 거의 없기 때문에 사투리를 쓰는 화자와도 서로 의사 소통을 하는데에 문제가 없다고 볼 수 있습니다. 음운 체계의 실현 양상 차이는 입말로 소통할때 큰 장애물이 되긴 하지만, 다행히도 형태소 분석기는 글로 적힌 텍스트를 분석하는 게 목적이므로 음운 실현 양상 차이는 잠시 접어둘 수 있습니다. 그럼 남은 차이는 형태론 정도가 되겠네요. 근데 이 형태소 차이가 생각보다 극복하기 어려울 때도 있습니다. 실제로 예를 들어볼까요? 다음은 제주 사투리로 쓰인 문장입니다.

벳복지를 두드리는 거 보난 하영 먹어진 셍이라.

제주 사투리를 모르는 사람은 거의 이해할 수가 없습니다. 문법 구조나 조사, 어미 등의 핵심 어휘는 모두 동일하지만 사용하는 형태소가 너무 달라서 제주어 사전이 있지 않는 한 알수가 없죠. 그런데 다음과 같이 사전을 제공해준다면 한국어를 아는 사람은 이 문장을 쉽게 해석해낼 수 있게 됩니다.

벳복지: 배때기
-난: -니
하영: 많이
셍: 모양
벳복지를 두드리는 거 보 하영 먹어진 이라.
배때기를 두드리는 거 보 많이 먹은 모양이야.

짜잔~ 외계어마냥 정체를 알 수 없던 문장이 이제는 명확하게 이해가 됩니다. 그저 형태소 몇 개만을 교체했을 뿐인데요. 이런 점에서 한국어 사투리는 한국어 표준어와 매우 닮았습니다. 형태소 일부를 교체하면 거의 일대일로 대응하는 표준어 문장으로 변환될 수 있기 때문입니다. (물론 완벽하게 대응되지는 않습니다. 위의 예시에서 '먹어진'이 대표적인 사례죠. 표준어에서 '먹은'이라고 쓰는 맥락에서 제주 사투리에서는 특이하게도 '먹어진'이라고 피동형을 쓰고 있습니다.) 그렇기에 표준어를 충분히 잘 이해하는 모델이 있고, 사투리에서 쓰이는 형태소들을 표준어로 연결해주는 사전이 있다면 표준어 모델이 사투리를 이해하는데에도 쓰일 수 있습니다.

이 특성을 이용하면 방언별 형태 분석 말뭉치가 전혀 없는 상황에서도 형태소 분석기를 만드는게 가능합니다. 잘 아시다시피 한국어의 경우 공개된 말뭉치의 규모가 크지 않고, 사투리로 들어가면 사실상 존재하는 말뭉치가 없다고 볼 수 있죠. 사투리용 형태소 분석기를 만들기 위해 방언 말뭉치를 대량으로 구축하는 건 개인이 감당할 수도 없고 배보다 배꼽이 훨씬 더 커지는 일입니다. 따라서 표준어를 기반으로 학습한 모델에 사투리 사전을 통해 사투리와 표준어 사이에 연결 다리를 놓아주는게 가장 현실적인 방안일 것입니다.

이미 Kiwi에는 표준어를 위한 언어 모델이 내장되어 있고, 사투리 - 표준어 연결다리는 국립국어원에서 편찬하고 있는 사전을 통해 확보할 수 있으니 일단 필요한 재료는 다 구할 수 있습니다. 이 정도면 충분히 도전해볼법한 과제라고 생각되지 않나요?

생성 모델의 이점

판별 모델(Discriminative Model) 다른 형태소 분석기들과는 다르게 Kiwi는 생성 모델(Generative Model)에 기반하고 있습니다. 두 모델은 사실 역할이 아예 다릅니다. 판별 모델의 경우 주어진 입력 데이터가 어떤 분류에 속할지 레이블을 매기는데에 집중한다면 생성 모델은 주어진 데이터가 어떤 분포를 따르는지 찾고 그 분포를 최대한 비슷하게 학습하는 것이 목표입니다. 형태소 분석기는 결국 주어진 문자열에 어떤 품사 태그(→ 레이블)가 붙어야하는지를 판단하는 것이므로 전통적으로는 판별 모델(CRF를 주로 사용)을 이용해 구축했습니다. 그렇지만 생성 모델로도 형태소 분석을 풀 수 있습니다. 닭 잡는 데 소 칼을 쓰는 느낌이라서 다들 시도하지 않았던 것 뿐이지요.

판별 모델을 사용한 형태소 분석 과정
생성 모델을 사용한 형태소 분석 과정

구체적인 예시를 통해 살펴봅시다. 판별 모델을 기반으로 형태소 분석을 수행하는 건 간단히 보면 "아버지가방에들어..."라는 입력 문자열이 있을 때 각 글자별로 품사 태그가 무엇일지(NNG, JKS, JKB, VV, EC 등), 형태소의 시작과 끝은 어디일지(B, I, O 등)를 판별하는 것과 동일합니다. 모델은 아버지라는 글자를 보고 이런 글자 패턴이 있을때는 주로 NNG로 판별했다는 걸 학습했단 사실을 떠올리고, 그 뒤에 있는 '가'는 JKS였다는 걸 떠올리는 식으로 본인이 배웠던 패턴을 바탕으로 각 글자에 알맞은 태그를 부여해줍니다.

생성 모델은 전혀 다른 과정으로 형태소 분석을 수행합니다. 일단 누군가가 입력된 문자열 "아버지가방에들어..."를 잘게 쪼개어 형태소 배열로 가능한 조합들을 모두 찾아줍니다(보통은 사람이 직접 작성한 한국어 문법 규칙이 이 역할을 수행합니다). 생성 모델은 자신이 학습했던 한국어의 형태소 배열 분포를 바탕으로 각 후보들이 한국어에서 얼마나 자연스러운지(한국어에서 해당 형태소 배열이 나올 확률이 얼마나 높은지) 순위를 매깁니다. 그리고 가장 자연스러운 배열이 되는 형태소 조합 1위를 찾아 최종 결과로 선택합니다. 설명을 들으면 알 수 있다시피 생성 모델을 사용하는 쪽이 분석 절차도 더 복잡하고 모든 후보 조합에 대해 확률 계산을 해야하므로 연산량도 많습니다. 그렇기에 초창기의 형태소 분석기들은 판별 모델 방식을 주로 사용했던 것이죠.

그러나 사투리 분석 시나리오에서는 전세가 뒤집힙니다. 판별 모델에서는 사투리를 분석하려면 모델을 새로 학습해야만 합니다. 애초에 모델이 형태소 분석이라는 판별 작업에만 특화되어 있고, 특히 그 판별은 표준어만을 중심으로 학습되었기 때문입니다. 그래서 '벳복지' 같은 단어가 나오면 이게 NNG라는 걸 알수가 없기에 모델이 이를 추가로 학습하지 않는 이상에는 제대로 분석하는게 어렵습니다.

반면에 애초에 형태소 분석에 특화된게 아니라는 생성 모델의 특성은 이 상황에서 오히려 장점이 됩니다. 일단 한국어 문법 규칙에 의해 형태소 조합으로 분해를 하고, '벳복지'라는 형태소는 모르지만 이게 '배때기'와 동일한 의미라는 걸 알려주면 이에 대해서도 생성 모델은 자연스럽게 확률을 계산할 수가 있거든요. 따라서 '배때기' 뒤에 '두드리다/부르다'가 자주 나온다는걸 알고 있는 생성 모델은 '벳복지' 뒤에도 당연히 '두드리다/부르다' 등의 단어가 쓰일 수 있다는 걸 알 수 있습니다. 이런 모델의 지식은 사투리를 분석할 때 큰 도움이 됩니다.

(참고) 사투리 사전 데이터 확보

다양한 한국어 방언에서 쓰이는 형태소들과 그 형태소의 의미 정보를 확보하기 위해서 국립국어원에서 관리 중인 우리말샘 사전을 활용했습니다. 사전 전체의 데이터는 여기에서 JSON 혹은 XML 포맷으로 다운로드가 가능합니다. 

우리말샘에서 제공하는 Raw 사전 데이터 예시

위와 같이 JSON 타입으로 친절하게 데이터를 제공 중이므로 여기에서 사투리 형태소와 그에 대응하는 표준어 형태소를 추출하는 것은 아주 식은 죽 먹기죠.

Kiwi의 방언 분석 기능 구현 방법

구체적으로 Kiwi에서 방언 분석 기능을 구현하기 위해 사용한 방법은 다음과 같습니다.

  1. 표준어 형태분석 말뭉치 데이터를 이용하여 형태소 기반의 언어 모델을 확보
  2. 사투리 사전 데이터 확보
  3. 표준어 형태소의 임베딩 값을 가져와서 각 표준어에 대응하는 사투리 형태소들의 임베딩에 그대로 대입
  4. 사투리 전용 형태소 결합 규칙 추가 기술

1번은 사실 기존에 표준어 기반 형태소 분석기를 개발할 때 한 것과 완전하게 동일한 작업입니다. 여기에 사투리 사전 데이터를 모으는 추가적인 작업을 수행한 것이구요, 가장 핵심적인 부분은 3번입니다. CoNg 모델에서 각 형태소의 의미를 표현하기 위해 적당한 크기의 벡터(여러 개의 숫자로 이뤄진 묶음)를 사용합니다. 이를 임베딩(Embedding)이라고 합니다. 의미적으로 유사한 단어들의 임베딩은 벡터 공간 상에서도 서로 가까이 위치하는 특징이 있죠. 사투리 형태소는 우리가 1번에서 모델을 학습시킬 때 데이터 내에 들어가 있지 않아 모델이 전혀 학습한 적이 없지만, 대응하는 표준어 형태소의 임베딩 값을 그대로 사투리 형태소에 부여해준다면 우리 모델은 배우지도 않고 사투리 형태소의 의미를 깨닫게 되는 셈입니다.

사투리 형태소들의 너무 많아서 모델이 기억해야할 용량이 너무 커지진 않을까 걱정할 필요도 없습니다. 사실 표준어 형태소와 임베딩을 완전히 공유하기 때문에 사투리 형태소의 임베딩을 굳이 저장하지 않고 표준어를 참조하도록 시스템을 구현할 수 있습니다. 이렇게 하면 모델 크기를 전혀 키우지 않고도 사투리 분석 능력을 갖출 수 있습니다.

물론 이것만으로 모든게 해결되면 좋겠지만 사투리에 따라 독특한 어법 규칙을 가지는 경우가 있습니다. 이는 사람이 직접 기술해주는 게 빠르고 정확하죠. 그래서 마지막으로 4번에서 결합 규칙을 수작업으로 추가하는 과정이 필요합니다. 사투리별 결합규칙에는 다음과 같은게 있습니다.

<경상 방언> + -> (ex: 뭐라고 + 했는데 -> 뭐라캤는데)
<충청 방언> + -> (ex: 하 + 었슈 -> 혔)
<제주 방언> [ㅅㅈㅊ] + -> [시지치] (ex: 하 + 엄ㅅ + 으니 -> 햄시니)

이 규칙은 주어진 입력 텍스트에서 사투리에 알맞는 형태소 조합 후보를 찾는데에 쓰입니다. 모델에게 애초에 부적절한 후보를 순위에 넣지 않도록 할 수 있으므로 모델을 수정하지도 않고 분석 품질을 개선하는데에도 효과가 있죠. 전체 규칙 목록은 GitHub 저장소에서 살펴볼 수 있습니다.

방언 분석 정확도 평가

자 그래서 이렇게 구축한 사투리 분석 기능이 얼마나 정확한지 평가하는 게 필요하겠죠? 그래서 최첨단 Human Intelligence를 투입하여 9개 지역 방언에 대한 형태소 분석 평가 데이터를 구축했습니다. (사투리 하나도 모르는 와중에 데이터를 구축하려다 보니 나무위키 한국어 지역 방언 관련 문서도 여러 번 정독하고 사전도 열심히 찾으면서 공부했네요...) 사투리 정보와 마찬가지로 예문 역시 우리말샘에서 제공하는 데이터에서 추출하였습니다. 평가 데이터가 구축된 방언 목록은 다음과 같고 데이터 전체는 GitHub 저장소에서 살펴볼 수 있습니다. 가능하면 다 같은 개수로 분포를 맞추고 싶었으나 경기, 황해, 평안 방언은 예문이 적어서 살짝 평가 데이터의 크기가 작습니다.

  • chungcheong: 충청, 충남, 충북 (140문장)
  • gangwon: 강원 (140문장)
  • gyeonggi: 경기 (37문장)
  • gyeongsang: 경상, 경북, 경남 (140문장)
  • hamgyeong: 함경, 함남, 함북 (140문장)
  • hwanghae: 황해 (105문장)
  • jeolla: 전라, 전북, 전남 (140문장)
  • jeju: 제주 (140문장)
  • pyeongan: 평안, 평남, 평북 (41문장)

이 데이터로 평가한 결과는 다음과 같습니다.

Kiwi 및 다른 형태소 분석기의 방언별 분석 정확도

평가 척도는 F1으로 100%에 가까울수록 분석기의 분석 결과가 정답과 일치한다는 것이고 0%에 가까울수록 일치하는 게 없다는 뜻입니다. Kiwi는 두 가지 모드로 평가를 진행했습니다. 기존 버전과 동일하게 표준어만 지원하는 분석 모드와 위에서 설명한 방언 분석 기능이 추가된 모드로요.

일단 Kiwi 외의 나머지 분석기 중에서는 Khaiii의 성능이 제일 높은 것으로 나왔습니다. 그리고 Khaiii 성능은 표준어 모드인 Kiwi와 거의 유사합니다. 반면 방언 옵션이 활성화된 Kiwi의 경우 타 분석기들과 20%p 이상의 격차를 보이며 높은 정확도를 달성한 것을 확인할 수 있습니다. 사실 타 분석기들은 방언에 대한 대응이 거의 없기 때문에 아주 공정한 비교라고 볼 수는 없습니다. 사투리가 포함된 텍스트를 일반적인 형태소 분석기로 분석할 때 오류가 얼마나 발생하는지를 보여주는 결과라고 받아들이는게 더 맞을 것 같습니다. 방언 활성화 모드의 Kiwi는 평균적으로 80%를 살짝 넘는 정확도를 보였지만 표준어 텍스트의 형태소 분석 정확도가 일반적으로 95% 이상이 나온다는 점을 생각해볼 때, 방언 활성화 모드의 Kiwi도 여전히 갈 길이 멀다는 것을 알 수 있습니다.

분석 오류 사례 비교

수치만 봐서는 감이 잘 안 오죠? 실제로 분석기들이 방언을 어떻게 분석했는지 오류 사례들을 살펴봅시다. 방언별로 한 문장 씩 뽑아보았습니다. Kiwi v0.21.0은 방언 기능이 추가되기 전, v0.22.2는 방언 기능이 추가된 이후입니다. 심각하게 틀린 사례들에 대해서는 붉은 색으로 칠해보았습니다.

<충청> 쌀이서 뉘를 골러내야 되는 겨.
(쌀에서 뉘를 골라내야 되는 거야.)
정답 쌀/N 이서/J 뉘/N 를/J 골러내/VV 어야/E 되/VV 는/E 기/N 이/VC 여/E ./S
Kiwi v0.21.0 쌀/N 이/J 서/M 뉘/N 를/J 골/VV 러/E 내/VX 어야/E 되/VV 는/E 겨/N ./S
Kiwi v0.22.2 쌀/N 이서/J 뉘/N 를/J 골러내/VV 어야/E 되/VV 는/E 기/N 이/VC 어/E ./S
Komoran 쌀/N 이서/J 뉘/N 를/J 골/N 러/N 내야/N 되/VV 는/E 겨/N ./S
Mecab 쌀/N 이/VC 서/E 뉘/N 를/J 고르/VV 어/E 내/VX 야/E 되/VV 는/E 것/N 이/VC 여/E ./S
Khaiii 쌀/N 이서/J 뉘/N 를/J 고르/VV 어/E 내/VV 어야/E 되/VV 는/E 것/N 이/VC 여/E ./S
<강원> 콩국시가 아주 걸찌한 기 맛이 참 고만이네.
(콩국수가 아주 걸쭉한 게 맛이 참 고만이네.)
정답 콩국시/N 가/J 아주/M 걸찌/X 하/X ᆫ/E 기/N 이/J 맛/N 이/J 참/M 고만/M 이/VC 네/E ./S
Kiwi v0.21.0 콩/N 국시/N 가/J 아주/M 걸찌/N 하/X ᆫ/E 기/N 맛/N 이/J 참/M 고만/M 이/VC 네/E ./S
Kiwi v0.22.2 콩국시/N 가/J 아주/M 걸찌하/VA ᆫ/E 기/N 맛/N 이/J 참/M 고만/M 이/VC 네/E ./S
Komoran 콩/N 국시/N 가/J 아주/M 걸/N 찌/N 하/X ㄴ/E 기/N 맛/N 이/J 참/M 고만/M 이/VC 네/E ./S
Mecab 콩국/N 시/N 가/J 아주/M 걸/VV ᆯ/E 찌/N 하/X ᆫ/E 기/N 맛/N 이/J 참/M 고만/N 이/VC 네/E ./S
Khaiii 콩국시/N 가/J 아주/M 걸찌/M 하/VV ㄴ/E 기/N 맛/N 이/J 참/M 고만/N 이/VC 네/E ./S
<경상> 공빼기 좋아하면 머리 버진다 카드라.
(공짜 좋아하면 머리 벗어진다고 하더라.)
정답 공빼기/N 좋아하/VV 면/E 머리/N 버지/VV ᆫ다고/E 하/VV 드라/E ./S
Kiwi v0.21.0 공/N 빼/VV 기/E 좋아하/VV 면/E 머리/N 버진/N 다/M 카드/N 이/VC 라/E ./S
Kiwi v0.22.2 공빼기/N 좋아하/VV 면/E 머리/N 이/J 버지/VV ᆫ다고/E 하/VV 드라/E ./S
Komoran 공/N 빼기/N 좋아하/VV 면/E 머리/N 버진/N 다/J 카드/N 이/VC 라/E ./S
Mecab 공/N 빼/VV 기/E 좋/VA 아/E 하/VV 면/E 머리/N 벌/VV 지/E ᆫ다/E 카드/N 이/VC 라/E ./S
Khaiii 공빼기/N 좋아하/VV 면/E 머리/N 버/VV 진/VC 다/E 카드/N 라/E ./S
<함경> 명이 길댸닣구 따른 사름이 잇갯습지.
(명이 길지 않고 짧은 사람이 있겠지요.)
정답 명/N 이/J 길/VA 디/E 애닣/VX 구/E 따르/VA ᆫ/E 사름/N 이/J 있/VA 갯/E 습지/E ./S
Kiwi v0.21.0 명이/N 길댸닣구/N 따르/VV ᆫ/E 사르/VV ᆷ/E 이/J 잇/VV 개/VV 엇/E 습/N 지/E ./S
Kiwi v0.22.2 명/N 이/J 길/VA 디/E 애닣/VX 구/E 따르/VA ᆫ/E 사름/N 이/J 잇/VV 개/VV 엇/E 습지/E ./S
Komoran 명/N 이/J 길댸닣구/N 따르/VV ㄴ/E 사르/VV ㅁ/E 이/J 잇갯습지./N
Mecab 명/N 이/J 길/VA ᆯ/E 댸닣구/U 따르/VV ᆫ/E 사름/N 이/J 잇/N 갯/N 습지/E ./S
Khaiii 명/N 이/J 길/N 댸닣/X 구/E 따르/VV ㄴ/E 사름/N 이/J 잇갯습지/N ./S
<황해> 난 동구막질하고 싶은 마엄이 쌸도 없어야.
(난 소꿉놀이하고 싶은 마음이 조금도 없어.)
정답 나/N ᆫ/J 동구막질/N 하/X 고/E 싶/VX 은/E 마엄/N 이/J 쌸/N 도/J 없/VA 어야/E ./S
Kiwi v0.21.0 나/N ᆫ/J 동구/N 막/N 질/X 하/X 고/E 싶/VX 은/E 마엄/N 이/J 쌸/N 도/J 없/VA 어야/E ./S
Kiwi v0.22.2 나/N ᆫ/J 동구/N 막/N 질/X 하/X 고/E 싶/VX 은/E 마/M 엄/X 이/J 쌸/N 도/J 없/VA 어야/E ./S
Komoran 나/VV ㄴ/E 동구/N 막/N 질/X 하/X 고/E 싶/VX 은/E 마/N 엄/N 이/J 쌸도/N 없/VA 어야/E ./S
Mecab 나/N ᆫ/J 동구막질/N 하/X 고/E 싶/VX 은/E 마/N 엄이/N 쌸도/U 없/VA 어야/E ./S
Khaiii 나/N ㄴ/J 동구/N 막/N 질/X 하/X 고/E 싶/VX 은/E 마엄/N 이/J 쌸/N 도/J 없/VA 어야/E ./S
<제주> 항에 물 거둑고 ᄒᆞ영 지뻐 감쭈.
(항아리에 물 차고 해서 기뻐서 가지요.)
정답 항/N 에/J 물/N 거둑/VV 고/E ᄒᆞ/VX 엉/E 지쁘/VA 어/E 가/VV 어ᇝ/E 주/E ./S
Kiwi v0.21.0 항/N 에/J 물/N 거둑고/N ᄒᆞ영/N 지뻐/N 감쭈/N ./S
Kiwi v0.22.2 항/N 에/J 물/N 거둑/VV 고/E ᄒᆞ/VV 엉/E 지쁘/VA 어/E 가/VV 어ᇝ/E 주/E ./S
Komoran 항/N 에/J 물/N 거/N 둑/N 이/VC 고/E ᄒᆞ영/N 지뻐/N 감쭈./N
Mecab 항/N 에/J 물/VV ᆯ/E 거/N 둑/N 이/VC 고/E ᄒᆞ영/U 지/VX 뻐/U 가/VV ᄆ/E 쭈/U ./S
Khaiii 항/N 에/J 물/N 거둑고/N ᄒ/N ᆞ/S 영/N 지/VA 쁘/VV 어/E 감/VV 쭈/E ./S
<전라> 어지께 닥이 흑을 헤번지르고 구녁을 파드랑께.
(어저께 닭이 흙을 헤치고 구멍을 파더라니까.)
정답 어지께/N 닥/N 이/J 흑/N 을/J 헤번지르/VV 고/E 구녁/N 을/J 파/VV 드랑께/E ./S
Kiwi v0.21.0 어지께/N 닥이/N 흑/N 을/J 헤/VV 어/E 번/N 지르/VV 고/E 구녁/N 을/J 파/N 드/N 이/VC 랑께/E ./S
Kiwi v0.22.2 어지께/M 닥/N 이/J 흑/N 을/J 헤번지르/VV 고/E 구녁/N 을/J 파/VV 드라/E ᆼ께/E ./S
Komoran 어/N 지/N 께/J 다고/E 학/N 이/J 흑/N 을/J 헤/VV 벌/VV ㄴ지/E 르/N 이/VC 고/E 구녁을/N 파드랑/N 께/J ./S
Mecab 어/I 지께/N 닥/N 이/J 흑/N 을/J 하/VV 아/E 번/N 지르/VV 고/E 구녁/N 을/J 파/VV 어/E 들/VV 랑께/E ./S
Khaiii 어/N 지/N 께/M 닥/N 이/J 흑/N 을/J 헤번지르/VV 고/E 구녁/N 을/J 파/N 드/VV 랑께/E ./S
<평안> 닛못이 아푸문 고상이 막심합네다.
(잇몸이 아프면 고생이 막심합니다.)
정답 닛못/N 이/J 아푸/VA 문/E 고상/N 이/J 막심/N 하/X ᆸ네다/E ./S
Kiwi v0.21.0 닛못/N 이/J 아푸/VA 문/N 고상/N 이/J 막심/N 하/X ᆸ네/E 이/VC 다/E ./S
Kiwi v0.22.2 닛못/N 이/J 아푸/VA 문/E 고상/N 이/J 막심/N 하/X ᆸ네다/E ./S
Komoran 닛못이/N 아/I 푸/VV 물/VV ㄴ/E 고상/N 이/J 막심/N 하/X ㅂ네다/E ./S
Mecab 닛못이/U 아프/VA 우/E 물/VV ᆫ/E 고상/N 이/J 막심/N 하/X ᄇ네다/E ./S
Khaiii 닛/N 못/N 이/J 아푸/M 문/N 고상/N 이/J 막/N 심/X 하/X ㅂ네다/E ./S

확실히 표준어 중심의 형태소 분석기들은 사투리에서만 쓰이는 형태소들을 거의 인식하지 못하고 엉뚱하게 오분석하는 경우가 많다는 것을 확인할 수 있습니다. 제주 사투리의 경우 아래아와 ㅯ 받침에 대한 처리도 추가로 필요한데 이는 시스템 차원에서 지원이 필요한 부분입니다. 다행히도 Kiwi에서는 옛한글 지원이 추가되었기 때문에 이런 문자열도 문제 없이 분석해낼 수 있습니다. 

Kiwi v0.22.2 셀마다 데모 페이지 링크를 걸어두었으니 들어가서 더 자세한 분석 결과를 살펴보실 수 있습니다.

앞으로 나아가야할 길

Kiwi는 0.22.0버전에서 방언 분석 기능을 추가하면서 표준어 언어 모델과 사투리 사전, 사투리 전용 형태소 결합 규칙만을 통해 실제로 사투리 분석이 어느 정도 가능하다는 것을 입증했습니다. 물론 아직 정확도가 80% 정도 밖에 되지 않아서 믿고 사용하기에는 부족한 점이 있습니다. 현재 Kiwi의 사투리 분석 오류는 크게 세 가지 요인에 의해 발생합니다.

  1. 사투리는 표준화된 맞춤법이 없기에 같은 형태소라도 사람마다 적는 방식이 다양함
  2. 사투리 전용 형태소 결합 규칙이 아직 완전하지 못함
  3. 아직 사전에 등재되지 않은 사투리 단어들이 제법 있음

1번 요인은 오타 교정과도 어느 정도 맞닿아있는 부분이 있습니다. 표준화된 표기법이 없기 때문에 발음을 소리나는 대로 적는 경우가 제법 많아서 오타 교정 기능을 통해 어느 정도 개선이 가능할 것으로 예상하고 있습니다. 다만 현재 Kiwi 분석기 구조 상 오타 교정을 모든 방언 형태소에 적용하면 메모리 사용량이 너무 커지는 문제가 있어서 시스템이 메모리를 효율적으로 사용하면서 오타 교정을 할 수 있도록 개선하는 작업이 선행되어야 합니다.

2번은 결합 규칙 자체가 다양한 사투리 문장들을 제가 대충 살펴보면서 주먹구구식으로 만든 것이기에 발생하는 현상입니다. 체계적으로 사투리 문장들을 모으고 거기서 발생하는 표면형의 변동 & 결합 현상을 기술하는 작업이 필요한데 이 작업에는 방언을 전문적으로 연구하는 언어학자가 필요할 것 같아서 일단은 미뤄두고 있습니다.

마지막으로 3번은 몇 명의 개인이 해결할 수 있는 수준의 문제는 아니라서 실제 사투리를 구사하는 화자분들이나 연구자들의 집단적인 도움이 필요한 상황입니다. 이렇게 세 가지 문제가 해결이 된다면 Kiwi의 사투리 분석 정확도도 90% 이상으로 개선되어 다양한 분야에서 유용하게 쓰일 수 있겠죠~! 저는 1번 문제를 열심히 해결하고 있을테니 전국의 방언학 연구자, 그리고 다양한 (네이티브) 사투리 구사자 분들께서는 2, 3번 문제를 맡아주시면 정말 좋겠네요.

앞으로도 Kiwi에 대해 많은 관심과 사랑 부탁드리고 또 이렇게 두서 없는 포스팅 읽어주셔서 감사합니다! 새해복 많이 받으세요! 2026년에도 다양한 업데이트를 들고 돌아오도록 하겠습니다.

관련글 더보기

댓글 영역