상세 컨텐츠

본문 제목

형태소 분석기의 모호성 해소 성능을 평가해보자

프로그래밍/NLP

by ∫2tdt=t²+c 2022. 3. 27. 01:11

본문

문제 상황

한국어 텍스트를 기계를 통해 분석하다 보면 기계가 아직 얼마나 한국어를 모르는지 다시 한 번 느끼게 됩니다. 한국인이 봤을땐 누가봐도 명백하게 모호하지 않은 문장을 헷갈려할 때가 바로 대표적인 예일겁니다. 규칙 활용하는 동사 "묻다"와 불규칙 활용하는 동사 "묻다", 또 규칙활용하는 "물다"는 그 활용형이 서로 겹칩니다. 아래 표로 정리하면 더 명확해지죠:

  묻다 2 묻다 3 물다 1
물건을 특정 장소 속에 넣고 다른 물질로 위를 덮어서 가리다. 대답이나 설명을 요구하며 말하다. 어떤 것을 윗입술과 아랫입술 사이에 또는 윗니와 아랫니 사이에 끼워 넣고 벌어진 두 입술이나 이를 다물어 누르다.
예문 거름을 묻다, 시신을 묻다 견해를 묻다, 근황을 묻다 담배를 물다, 젖병을 물다
활용 묻어, 묻으니 물어, 물으니 물어, 물으니
활용 묻고 묻고 물고

(위 표의 내용은 한국어 기초사전을 바탕으로 하였음)

묻다2,3과 물다1은 그 기본형이 명확히 다르기 때문에 형태소 분석기를 돌리고 나면 둘이 명확하게 구분되어야합니다. 즉, "견해를 물었다"에서의 "물었다"는 묻/VV 었/EP 다/EF가 되어야하는 반면, "젖병을 물었다"에서의 "물었다"는 물/VV 었/EP 다/EF가 되어야하죠. 문제는 이 둘의 활용형이 자음이 이어지는 경우에만 다르고(묻고 vs 물고), 모음이 이어지는 경우에는 동일하다(물어, 물으니)는 것입니다. 따라서 단순히 형태를 분석하는 것만으로는 올바른 결과를 선택할 수가 없습니다. 분석기가 주변 맥락까지 모두 고려해야하는 것이죠. 

반대로 묻다2와 묻다3은 모음으로 이어지는 활용형(묻어 vs 물어)에서는 명확히 구분할 수 있으나, 자음이 이어지는 활용형(묻고, 묻다)에서는 구분할 수 없습니다. 따라서 마찬가지로 묻다2와 묻다3을 구분하는 것 역시 형태 분석뿐만 아니라 의미 분석까지 필요하지만, 이 경우는 일단 이번 포스팅에서는 다루지 않을 예정입니다. 아직 이에 대한 단어 의미 중의성 해소 관련하여 비교할 만한 오픈소스 분석기를 찾아보기 어려운 상황이기 때문입니다.

또 다른 사례도 있습니다. 한국어에는 의미는 전혀 다르지만 형태만 동일한 동사와 형용사가 있습니다. 

  낫다 1 (동사) 낫다 2 (형용사)
병이나 상처 등이 없어져 본래대로 되다. 어떤 것이 다른 것보다 더 좋다.
예문 감기가 낫다, 다리가 낫다 다른 사람보다 낫다, 친구보다 낫다

대표적인 사례로 '낫다'가 있는데요, 동사인 낫다와 형용사인 낫다가 의미상으로 전혀 다르다보니 한국어 화자는 절대 헷갈리지 않지만 분석기는 이를 자주 헷갈립니다. 

혹은 일부 명사가 마치 조사가 붙은 것처럼 생겨서 헷갈리는 경우도 있습니다. '종이'라는 형태는 맥락에 따라 종이/NNG로 분석되어야하기도 하고, 조사 '이'가 붙은 걸로 보아 종/NNG 이/JKS로 분석되어야하기도 합니다.

  종이 종 3
나무를 원료로 하여 얇게 만든, 글씨를 쓰고 그림을 그리고 인쇄를 하는 등 여러 가지 일에 쓰는 물건. 금속을 깊고 둥근 그릇처럼 만들어 거꾸로 매어 달고 안에는 추를 달아, 치거나 흔들어 소리를 내는 물건.
예문 여기 있는 종이 좀 복사기에 넣어줘 여기 있는 종이 시끄럽게 울린다

형태소 분석기가 각 형태소의 세부적인 의미번호까지 분류는 못해준다고 해도, 위의 사례처럼 명확하게 품사나 형태소 배열이 달라지는 경우는 제대로 분석해주는게 맞겠지요. 그래야 이 분석기 결과를 바탕으로 하는 상위 작업들에 오류를 덜 전파할테니깐요. 그래서 이런 저런 텍스트 분석 결과를 보다가 문득 궁금해졌습니다: "과연 공개된 형태소 분석기들은 이런 모호한 문장을 얼마나 정확하게 분석하고 있을까?"

데이터 구축 & 평가 척도

평가를 위해서 간단하게 데이터를 구축해보았습니다. 헷갈릴법한 형태소 목록을 몇개 선정하여 그 형태소가 들어간 예문을 생성하는 식으로 진행했습니다. 총 207개의 예문을 생성했으며 전체 데이터셋은 여기에서 볼 수 있으며, 일부 예시를 뽑자면 다음과 같습니다:

형태소 예문
걷/VV
  • 4km 구간을 아주 오래 걸었다.
  • 걸어서 5분 거리에 있음
  • 칼날 위를 걸어야 했던 모든 사람들
걸/VV
  • 이 번호로 전화를 걸어.
  • 금메달을 목에 걸었다.
  • 약속을 지켜야한다는 조건을 걸었는데.
적/VV
  • 자세한 건 여기에 적어주세요.
  • 지금까지 적은 걸 그대로 제출하십시오.
  • "그러면 못 써"라고 적었다.
적/VA
  • 협회의 우려가 적지 않다.
  • 운이 좋았는지 피해가 적었다.
  • 액수가 너무 적어, 더 늘려줘!
화가/NNG
  • 19세기 독일 화가 작품이다.
  • 르네상스 시기의 대표적인 화가 다빈치
  • 그는 취미라고 했지만 화가 수준의 그림을 그렸다.
화/NNG
  • 스트레스를 받거나 화가 날 때는?
  • 화가 치밀어 올라서 밖으로 나갔다.
  • 그것 때문에 화가 많이 났다고 한다.

평가 방법은 아주 단순합니다. 특정 형태소 분석기에 예문을 입력하고, 그 예문의 분석 결과에서 원하던 형태소가 등장하면 맞힌 걸로, 그렇지 않으면 틀린 걸로 평가합니다. 전체 평가 문장 개수 대비 맞힌 개수의 비율을 계산하여 정확도를 산출합니다. 참 쉽죠?

평가 결과

평가에는 최근 릴리즈된 Kiwi 0.11.0와 konlpy에 등록된 형태소 분석기 중 Komoran, Mecab, Kkma를 사용했습니다. (나머지 Hannanum이나 Okt의 경우 동사/형용사를 구분하여 분석하는 기능이 없어서 아예 평가에서 배제했습니다.) 실험용 코드는 여기 공개되어 있구요, 일단 최종 결과부터 공유드리면 아래와 같습니다.

자체 구축한 평가 데이터로 각종 형태소 분석기의 모호성 해소 정확도를 평가한 결과

Kiwi가 압도적인 점수 차이로 1등을 했네요. 0.11.0 기준으로 평균 약 80%의 정확도를 달성했습니다. 나머지 형태소 분석기들이 40~50%대에 머무르고 있는 걸 보면 크게 우수하다는 걸 알 수 있습니다. 실제 분석 결과를 일부 살펴볼까요? 먼저 불규칙 활용을 해서 헷갈리는 동사들입니다.

  Kiwi Komoran Mecab Kkma
걷/VV 즐기/VV 는/E 여행/N ,/S 걷/VV 으면서/E 보/VV 고/E 듣/VV 은/E 것/N !/S 즐기/VV 는/E 여행/N ,/S 걷/VV 으면서/E 보/VV 고/E 들/VV 은/E 것/N !/S 즐기/VV 는/E 여행/N ,/S 걷/VV 으면서/E 보/VX 고/E 들/VV 은/E 것/N !/S 즐기/VV 는/E 여행/N ,/S 걷/VV 으면서/E 보/VV 고/E 듣/VV 은/E 것/N !/S
조금/N 만/J 걷/VV 어도/E 다리/N 가/J 아프/VA 어요/E 조금/N 만/J 걷/VV 어도/E 다리/N 가/J 아프/VA 아요/E 조금/M 만/J 걷/VV 어도/E 다리/N 가/J 아프/VA 아요/E 조금/N 만/J 걷/VV 어도/E 다리/N 가/J 아프/VA 아요/E
사막/N 을/J 걷/VV 어/E 다니/VV 는/E 배/N 이/VC ᆫ/E 낙타/N 는/J ~/S 사막/N 을/J 걷/VV 어/E 다니/VV 는/E 배/N 이/VC ㄴ/E 낙타는~/N 사막/N 을/J 걸/VV 어/E 다니/VV 는/E 배/N 이/VC ᆫ/E 낙타/N 는/J ~/S 사막/N 을/J 걷/VV 어/E 다니/VV 는/E 배/N 이/VC ㄴ/E 낙타/N 는/J ~/S
걸/VV 다시/M 시동/N 을/J 걸/VV 었/E 다/E ./S 다시/M 시동/N 을/J 걷/VV 었/E 다/E ./S 다시/M 시동/N 을/J 걸/VV 었/E 다/E ./S 다시/M 시동/N 을/J 걷/VV 었/E 다/E ./S
입학/N 사정관/N 제/X 에/J 제동/N 을/J 걸/VV 었/E 던/E 정부/N 의/J 법안/N 입학/N 사정관/N 제/X 에/J 제동/N 을/J 걷/VV 었/E 던/E 정부/N 의/J 법안/N 입학/N 사정/N 관제/N 에/J 제동/N 을/J 걸/VV 었/E 던/E 정부/N 의/J 법안/N 입학/N 사정/N 관제/N 에/J 제동/N 을/J 걷/VV 었/E 더/E ㄴ/E 정부/N 의/J 법안/N
이/M 번호/N 로/J 전화/N 를/J 걸/VV 어/E ./S 이/M 번호/N 로/J 전화/N 를/J 걷/VV 어/E ./S 이/M 번호/N 로/J 전화/N 를/J 걸/VV 어/E ./S 이/M 번호/N 로/J 전화/N 를/J 걷/VV 어/E ./S
금메달/N 을/J 목/N 에/J 걸/VV 었/E 다/E ./S 금메달/N 을/J 목/N 에/J 걷/VV 었/E 다/E ./S 금메달/N 을/J 목/N 에/J 걸/VV 었/E 다/E ./S 금메달/N 을/J 목/N 에/J 걷/VV 었/E 다/E ./S
묻/VV 외압/N 유무/N 를/J 묻/VV 어/E 보/VX ᆫ다/E 외압/N 유무/N 를/J 묻/VV 어/E 보/VV ㄴ다/E 외압/N 유무/N 를/J 물/VV 어/E 보/VV ᆫ다/E 외압/N 유무/N 를/J 묻/VV 어/E 보/VV ㄴ다/E
그것/N 에/J 대하/VV 어/E 묻/VV 을/E 때/N 부터/J 이/M 고민/N 은/J 시작/N 되/X ᆫ다/E ./S 그것/N 에/J 대하/VV 아/E 물/N 을/J 때/N 부터/J 이/M 고민/N 은/J 시작/N 되/X ㄴ다/E ./S 그것/N 에/J 대하/VV 아/E 물/N 을/J 때/N 부터/J 이/M 고민/N 은/J 시작/N 되/X ᆫ다/E ./S 그것/N 에/J 대하/VV 어/E 묻/VV 을/E 때/N 부터/J 이/M 고민/N 은/J 시작/N 되/X ㄴ다/E ./S
그것/N 이/J 가능/N 하/X ᆫ지/E 를/J 묻/VV 어/E !/S 그/N 게/E 가능/X 하/X ㄴ지/E 를/J 묻/VV 어/E !/S 그것/N 이/J 가능/N 하/X ㄴ지/E 를/J 물/VV 어/E !/S 그/VV 게/E 가능/N 하/X ㄴ/E 지/N 를/J 묻/VV 어/E !/S
물/VV 아주/M 비싸/VA ᆫ/E 이자/N 를/J 물/VV 었/E 다/E 아주/M 비싸/VA ㄴ/E 이자/N 를/J 묻/VV 었/E 다/E 아주/M 비싸/VA ᆫ/E 이자/N 를/J 물/VV 었/E 다/E 아주/M 비싸/VA ㄴ/E 이자/N 를/J 묻/VV 었/E 다/E
세금/N 을/J 많이/M 묻/VV 었/E 다/E ./S 세금/N 을/J 많이/M 묻/VV 었/E 다/E ./S 세금/N 을/J 많이/M 물/VV 었/E 다/E ./S 세금/N 을/J 많이/M 묻/VV 었/E 다/E ./S
사과/N 하/X 며/E 치료비/N 를/J 물/VV 어/E 주/VX 겠/E 다고/E 하/VV 었/E 다/E ./S 사과/N 하/X 며/E 치료비/N 를/J 묻/VV 어/E 주/VX 겠/E 다고/E 하/VV 았/E 다/E ./S 사과/N 하/X 며/E 치료비/N 를/J 물/VV 어/E 주/VX 겠/E 다고/E 하/VX 았/E 다/E ./S 사과/N 하/X 며/E 치료비/N 를/J 묻/VV 어/E 주/VX 겠/E 다고/E 하/VV 었/E 다/E ./S
새끼/N 를/J 입/N 으로/J 묻/VV 어서/E 옮기/VV ᆫ다/E ./S 새끼/N 를/J 입/N 으로/J 묻/VV 어서/E 옮기/VV ㄴ다/E ./S 새끼/N 를/J 입/N 으로/J 물/VV 어서/E 옮기/VV ᆫ다/E ./S 새끼/N 를/J 입/N 으로/J 묻/VV 어서/E 옮기/VV ㄴ다/E ./S

Kiwi에서는 맥락을 반영해 걷/걸, 묻/물 등을 비교적 잘 맞히는 반면, 나머지 분석기에서는 주로 한쪽으로 쏠리는 모양을 보입니다. 동사와 형용사의 구분 결과도 살펴볼까요?

  Kiwi Komoran Mecab Kkma
낫/VV 잘못/M 되/X 면/E 환자/N 가/J 낫/VV 지/E 못하/VX ᆫ다/E ./S 잘못/N 되/X 면/E 환자/N 가/J 낫/VA 지/E 못하/VX ㄴ다/E ./S 잘못/M 되/VV 면/E 환자/N 가/J 낫/VA 지/E 못하/VX ᆫ다/E ./S 잘못되/VV 면/E 환자/N 가/J 낫/VA 지/E 못하/VX ㄴ다/E ./S
기적/N 처럼/J 병/N 이/J 낫/VV 다/E ./S 기적처럼/N 병/N 이/J 낫/VA 다/E ./S 기적/N 처럼/J 병/N 이/J 낫/VA 다/E ./S 기적/N 처럼/J 병/N 이/J 낫/VA 다/E ./S
낫/VA 나/N 가/J 너/N 보다/J 는/J 낫/VA 지/E ./S 내/N 가/J 너/N 보다/J 는/J 낫/VA 지/E ./S 내/N 가/J 너/N 보다/J 는/J 낫/VA 지/E ./S 내가/N 너/N 보다/J 는/J 낫/VV 지/E ./S
포기/N 하/X 는/E 것/N 이/J 훨씬/M 낫/VA 다/E ./S 포기/N 하/X 는/E 게/E 훨씬/M 낫/VA 다/E ./S 포기/N 하/X 는/E 것/N 이/J 훨씬/M 낫/VA 다/E ./S 포기/N 하/X 는/E 것/N 이/J 훨씬/M 낫/VA 다/E ./S
적/VV 자세/X 하/X ᆫ/E 거/N ᆫ/J 여기/N 에/J 적/VV 어/E 주/VX 시/E 어요/E ./S 자세/X 하/X ㄴ/E 건/N 여기/N 에/J 적/VA 어/E 주/VX 시/E 어요/E ./S 자세/X 하/X ᆫ/E 것/N ᆫ/J 여기/N 에/J 적/VV 어/E 주/VX 시/E 어요/E ./S 자세/N 하/X ㄴ/E 것/N 은/J 여기/N 에/J 적/VV 어/E 주/VX 세요/E ./S
지금/N 까지/J 적/VV 은/E 거/N ᆯ/J 그대로/M 제출/N 하/X 시/E ᆸ시오/E ./S 지금/N 까지/J 적/VA 은/E 걸/VV ㄹ/E 그대로/M 제출/N 하/X 시/E ㅂ시오/E ./S 지금/N 까지/J 적/VA 은/E 것/N ᆯ/J 그대로/M 제출/N 하/X 시/E ᄇ시오/E ./S 지금/N 까지/J 적/VA 은/E 것/N 을/J 그대로/M 제출/N 하/X 시/E ㅂ시오/E ./S
"/S 그러면/M 못/M 쓰/VV 어/E "/S 라고/J 적/VV 었/E 다/E ./S "/S 그러면/M 못/M 쓰/VV 어/E "/S 라고/J 적/VA 었/E 다/E ./S "/S 그러면/M 못/M 쓰/VV 어/E "/S 라고/J 적/VA 었/E 다/E ./S "/S 그러/VV 면/E 못/M 쓰/VV 어/E "/S 라고/J 적/VA 었/E 다/E ./S
적/VA 협회/N 의/J 우려/N 가/J 적/VA 지/E 않/VX 다/E ./S 협회/N 의/J 우려/N 가/J 적/VA 지/E 않/VX 다/E ./S 협회/N 의/J 우려/N 가/J 적/VA 지/E 않/VX 다/E ./S 협회/N 의/J 우려/N 가/J 적/VA 지/E 않/VX 다/E ./S
운/N 이/J 좋/VA 었/E 는지/E 피해/N 가/J 적/VA 었/E 다/E ./S 운/N 이/J 좋/VA 았/E 는지/E 피해/N 가/J 적/VA 었/E 다/E ./S 운/N 이/J 좋/VA 았/E 는지/E 피해/N 가/J 적/VA 었/E 다/E ./S 운/N 이/J 좋/VA 았/E 는지/E 피해/N 가/J 적/VA 었/E 다/E ./S
액수/N 가/J 너무/M 적/VA 어/E ,/S 더/M 늘리/VV 어/E 주/VX 어/E !/S 액수/N 가/J 너무/M 적/VA 어/E ,/S 더/M 늘리/VV 어/E 주/VX 어/E !/S 액수/N 가/J 너무/M 적/VA 어/E ,/S 더/M 늘리/VV 어/E 주/VX ㅓ/E !/S 액수/N 가/J 너무/M 적/VV 어/E ,/S 더/M 늘리/VV 어/E 주/VX 어/E !/S
차/VV 발/N 로/J 힘껏/M 차/VV 었/E 다/E ./S 발/N 로/J 힘껏/M 차/VV 았/E 다/E ./S 발/N 로/J 힘껏/M 차/VV 았/E 다/E ./S 발/N 로/J 힘껏/M 차/VV 었/E 다/E ./S
허리/N 에/J 차/VV 지/E 말/VX 고/E 어깨/N 에/J 묶/VV 어/E 허리/N 에/J 차지/N 말/VX 고/E 어깨/N 에/J 묶/VV 어/E 허리/N 에/J 차/VV 지/E 말/VX 고/E 어깨/N 에/J 묶/VV 어/E 허리/N 에/J 차지/N 말/VV 고/E 어깨/N 에/J 묶/VV 어/E
차/VA 북서쪽/N 에서/J 내려오/VV ᆫ/E 차/VA ᆫ/E 공기/N 의/J 영향/N 북서쪽/N 에서/J 내려오/VV ㄴ/E 차/VV ㄴ/E 공기/N 의/J 영향/N 북서쪽/N 에서/J 내려오/VV ᆫ/E 차/VA ᆫ/E 공기/N 의/J 영향/N 북서쪽/N 에서/J 내려오/VV ㄴ/E 찬/N 공기/N 의/J 영향/N
차/VA 고/E 건조/N 하/X ᆫ/E 시베리아/N 고/X 기압/N 차고/N 건조/N 하/X ㄴ/E 시베리아/N 고기압/N 차고/N 건조/N 하/X ᆫ/E 시베리아/N 고기압/N 차/VV 고/E 건조/N 하/X ㄴ/E 시베리아/N 고기압/N
삶/N 은/J 면/N 은/J 차/VA ᆫ/E 물/N 에/J 넣/VV 어/E 주/VX 시/E 어요/E !/S 삶/N 은/J 면/N 은/J 차/VV ㄴ/E 물/N 에/J 넣/VV 어/E 주/VX 시/E 어요/E !/S 삶/VV 은/E 면/N 은/J 차/VA ᆫ/E 물/N 에/J 넣/VV 어/E 주/VX 시/E 어요/E !/S 삶/N 은/J 면/N 은/J 차/VV ㄴ/E 물/N 에/J 넣/VV 어/E 주/VX 세요/E !/S

Kiwi 0.11.0에서 가장 정확한 결과를 보인 부류입니다. 나머지 분석기에서는 동사와 형용사를 제대로 구분하지 못하거나, 혹은 아예 엉뚱하게 명사로 분석하는 경우도 보입니다. 마지막으로 명사 부류입니다.

  Kiwi Komoran Mecab Kkma
종이/N 여기/N 있/VV 는/E 종이/N 복사기/N 에/J 넣/VV 어/E 주/VX 어/E ./S 여기/N 있/VV 는/E 종이/N 복사기/N 에/J 넣/VV 어/E 주/VX 어/E ./S 여기/N 있/VA 는/E 종이/N 복사기/N 에/J 넣/VV 어/E 주/VX ㅓ/E ./S 여기/N 있/VV 는/E 종이/N 복사기/N 에/J 넣/VV 어/E 주/VX 어/E ./S
시험/N 점수/N 가/J 적히/VV ᆫ/E 종이/N ,/S 절대/M 잃어버리/VV 지/E 마/VX 라/E !/S 시험/N 점수/N 가/J 적히/VV ㄴ/E 종이/N ,/S 절대/N 잃어버리/VV 지/E 말/VV 라/E !/S 시험/N 점수/N 가/J 적히/VV ᆫ/E 종이/N ,/S 절대/M 잃/VV 어/E 버리/VX 지/E 말/VX 라/E !/S 시험/N 점수/N 가/J 적히/VV ㄴ/E 종이/N ,/S 절대/M 잃어버리/VV 지/E 마라/N !/S
종/N 여기/N 있/VV 는/E 종/N 이/J 시끄럽/VA 게/E 울리/VV ᆫ다/E ./S 여기/N 있/VV 는/E 종이/N 시끄럽/VA 게/E 울리/VV ㄴ다/E ./S 여기/N 있/VA 는/E 종/N 이/J 시끄럽/VA 게/E 울리/VV ᆫ다/E ./S 여기/N 있/VV 는/E 종이/N 시끄럽/VA 게/E 울리/VV ㄴ다/E ./S
혼혈/N 이/J 없이/M 두/M 종/N 이/J 완전히/M 분리/N 되/X 면/E 혼혈/N 이/J 없이/M 두/M 종이/N 완전히/M 분리/N 되/X 면/E 혼혈/N 이/J 없이/M 두/M 종이/N 완전히/M 분리/N 되/X 면/E 혼혈/N 이/J 없이/M 두/M 종/N 이/J 완전히/M 분리/N 되/X 면/E
길이/N 그거/N 다듬/VV 을/E 때/N 길/N 이라든가/J 모양/N 을/J 좀/M 맞추/VV 어서/E 예쁘/VA 게/E 하/VV 어/E ./S 그것/N 다듬/VV 을/E 때/N 길/N 이/VC 라든가/E 모양/N 을/J 좀/M 맞추/VV 어서/E 예쁘/VA 게/E 하/VX 아/E ./S 그것/N 다듬/VV 을/E 때/N 길/N 이라든가/J 모양/N 을/J 좀/M 맞추/VV 어서/E 예쁘/VA 게/E 하/VX ㅕ/E ./S 그/M 거/N 다듬/VV 을/E 때/N 길/N 이/VC 라/E 들/VA ㄴ가/E 모양/N 을/J 좀/M 맞추/VV 어서/E 예쁘/VA 게/E 하/VV 어/E ./S
길/N 대전/N 으로/J 가/VV 는/E 길/N 이/VC 다/E ./S 대전/N 으로/J 가/VV 는/E 길/N 이/VC 다/E ./S 대전/N 으로/J 가/VV 는/E 길/N 이/VC 다/E ./S 대전/N 으로/J 가/VV 는/E 길/N 이/VC 다/E ./S
화가/N 19/S 세기/N 독일/N 화가/N 작품/N 이/VC 다/E ./S 19세기/N 독일/N 화가/N 작품/N 이/VC 다/E ./S 19/S 세기/N 독일/N 화/N 가/J 작품/N 이/VC 다/E ./S 19/N 세기/N 독일/N 화가/N 작품/N 이/VC 다/E ./S
르네상스/N 시기/N 의/J 대표/N 적/X 이/VC ᆫ/E 화가/N 다빈치/N 르네상스/N 시기/N 의/J 대표/N 적/X 이/VC ㄴ/E 화가/N 다빈치/N 르네상스/N 시기/N 의/J 대표/N 적/X 이/VC ᆫ/E 화/N 가/J 다빈치/N 르네상스/N 시기/N 의/J 대표적/N 이/VC ㄴ/E 화가/N 다빈치/N
그/N 는/J 취미/N 이/VC 라고/E 하/VV 었/E 지만/E 화가/N 수준/N 의/J 그림/N 을/J 그리/VV 었/E 다/E ./S 그/N 는/J 취미/N 이/VC 라고/E 하/VV 았/E 지만/E 화가/N 수준/N 의/J 그림/N 을/J 그리/VV 었/E 다/E ./S 그/N 는/J 취미/N 이/VC 라고/E 하/VX 았/E 지만/E 화/N 가/J 수준/N 의/J 그림/N 을/J 그리/VV 었/E 다/E ./S 그/VV 는/E 취미/N 라고/J 하/VV 었/E 지만/E 화가/N 수준/N 의/J 그림/N 을/J 그리/VV 었/E 다/E ./S
화/N 스트레스/N 를/J 받/VV 거나/E 화/N 가/J 나/VV ᆯ/E 때/N 는/J ?/S 스트레스/N 를/J 받/VV 거나/E 화가/N 날/N 때/N 는/J ?/S 스트레스/N 를/J 받/VV 거나/E 화/N 가/J 날/N 때/N 는/J ?/S 스트레스/N 를/J 받/VV 거나/E 화가/N 낳/VV ㄹ/E 때/N 는/J ?/S
화/N 가/J 치밀/VV 어/E 오르/VV 어서/E 밖/N 으로/J 나가/VV 었/E 다/E ./S 화가/N 치밀/VV 어/E 오르/VV 아서/E 밖/N 으로/J 나가/VV 았/E 다/E ./S 화/N 가/J 치밀/VV 어/E 오르/VV 아서/E 밖/N 으로/J 나가/VV 았/E 다/E ./S 화/N 가/J 치밀/VV 어/E 오르/VV 아서/E 밖/N 으로/J 나가/VV 었/E 다/E ./S
그것/N 때문/N 에/J 화/N 가/J 많이/M 나/VV 었/E 다고/E 하/VV ᆫ다/E ./S 그것/N 때문/N 에/J 화가/N 많이/M 나/VV 았/E 다고/E 하/VX ㄴ다/E ./S 그것/N 때문/N 에/J 화/N 가/J 많이/M 나/VV 았/E 다고/E 하/VX ᆫ다/E ./S 그것/N 때문/N 에/J 화가/N 많이/M 나/VV 었/E 다고/E 하/VV ㄴ다/E ./S
성의/N 성의/N 있/VA 는/E 협조/N 를/J 부탁/N 드리/VV ᆸ니다/E ./S 성의/N 있/VV 는/E 협조/N 를/J 부탁/N 드리/VV ㅂ니다/E ./S 성/N 의/J 있/VA 는/E 협조/N 를/J 부탁드리/VV ᄇ니다/E ./S 성의/N 있/VV 는/E 협조/N 를/J 부탁/N 드리/VV ㅂ니다/E ./S
성/N 이/M 성/N 의/J 꼭대기/N 에/J 는/J 비밀/N 스럽/X 은/E 공간/N 이/J 있/VV 다/E ./S 이/M 성의/N 꼭대기/N 에/J 는/J 비밀/N 스럽/X ㄴ/E 공간/N 이/J 있/VX 다/E ./S 이/M 성/N 의/J 꼭대기/N 에/J 는/J 비밀/N 스럽/X ᆫ/E 공간/N 이/J 있/VA 다/E ./S 이/M 성의/N 꼭대기/N 에/J 는/J 비밀/N 스럽/X ㄴ/E 공간/N 이/J 있/VV 다/E ./S
성/N 의/J 역할/N 과/J 능력/N 은/J 사회/N 에/J 의하/VV 어/E 결정/N 되/X 는가/E ?/S 성의/N 역할/N 과/J 능력/N 은/J 사회/N 에/J 의하/VV 아/E 결정/N 되/X 는가/E ?/S 성/N 의/J 역할/N 과/J 능력/N 은/J 사회/N 에/J 의하/VV 아/E 결정/N 되/X 는가/E ?/S 성의/N 역할/N 과/J 능력/N 은/J 사회/N 에/J 의하/VV 어/E 결정/N 되/X 는가/E ?/S

Komoran은 대체로 최장일치를 우선하는 걸로 보입니다. '종이'는 무조건 종이/NNG로, '화가'는 무조건 화가/NNG로 분석하네요. Mecab은 반대로 최대한 조사를 분리하려 합니다. '화가'는 화/NNG 가/JKS로, '성의'는 성/NNG 의/JKG로 분석합니다. Kkma는 양 극단의 중간쯤에 있는듯합니다. Kiwi의 경우 맥락을 반영해 비교적 정확하게 해당 형태가 조사가 붙은 명사인지, 아니면 통째로 한 명사인지 구분해내고 있습니다.

왜 잘 될까?

이는 사실 처음부터 Kiwi에게 유리한 대결이었는데요, 이는 Kiwi는 다른 형태소 분석기들과는 다르게 언어모델을 기반으로 작동하기 때문입니다. 보통 형태소 분석기는 입력 문장을 형태소가 될만한 단위로 쪼갠 뒤, 각 형태들의 품사를 결정하는 모델을 사용합니다. 특히 이는 순서에 영향을 받기 때문에 HMM이나 CRF등의 확률 모델을 자주 사용합니다. 이는 각 형태에 어떤 품사 태그를 다는게 제일 적합할지 찾는것에 주 목적이 있습니다.

반면 언어모델은 특정한 단어열(형태소열)이 등장할 확률을 계산해주는 모델로 각 형태에 대해 품사 태그를 다는 것보다 더 많은 것을 고려합니다. 특히 이 형태소 다음에는 어떤 형태소가 등장할지 등을 구체적으로 계산할 수 있습니다. Kiwi에서는 가능한 형태소 조합을 최대한 많이 구해낸 다음, 이 중에서 확률이 제일 높은 형태소 배열을 골라내는 방식을 사용합니다. 단순히 각 형태들의 품사 태그를 구하는 작업에는 어찌보면 닭 잡는데 소 잡는 칼을 쓰는 셈입니다만, 그 덕분에 형태소와 형태소 간의 관계(특정 형태소 뒤에는 어떤 형태소가 등장할 가능성이 제일 높은지 등)를 명확하게 파악하기 때문에 이와 같이 모호성 해소 작업에서는 강력한 모습을 보이는 것이죠.

현재 Kiwi의 모호성 해소 한계

그러나 Kiwi의 모호성 해소에도 큰 약점이 있습니다. Kiwi 0.11.0 버전에서 사용하는 언어모델은 3+1-gram 기반의 Kneser-ney LM입니다. 즉 하나의 형태소를 결정할때 앞의 형태소 두개와 그 앞의 품사 태그 하나를 고려한다는 것입니다. 따라서 한 형태소는 앞으로 2개, 뒤로 2개의 형태소들에만 의해 그 확률이 결정됩니다. 따라서 모호한 형태소와 그 모호성을 해소시켜줄 단서 형태소가 2 단어 이상 떨어져 있으면 모델이 이를 잡아낼 수 없다는 것입니다.

  거리가 짧은 경우 거리가 긴 경우
종이/NNG 여기/N 있/VV 는/E 종이/N 복사기/N 에/J 넣/VV 어/E 주/VX 어/E 여기/N 있/VV 는/E 종/N 이/J 저기/N 에/J 있/VA 는/E 복사기/N 에/J 넣/VV 어/E 주/VX 어/E
걸/VV 이/M 번호/N 로/J 전화/N 를/J 걸/VV 어/E 이/M 번호/N 로/J 전화/N 를/J 이따가/M 꼭/M 반드시/M 걷/VV 어/E
적/VV 지금/N 까지/J 적/VV 은/E 거/N ᆯ/J 그대로/M 제출/N 하/X 시/E ᆸ시오/E 지금/N 까지/J 음/I ~/S 적/VA 은/E 거/N ᆯ/J 그대로/M 제출/N 하/X 시/E ᆸ시오/E

'거리가 짧은 경우' 열에 있는 굵은 표시는 모호한 형태소와 그 모호성을 해소시켜줄 단서인데요, 이 사이에 '거리가 긴 경우' 열의 하늘색 형태소가 끼어들게 되면 위와 같이 분석 결과가 틀어지게 됩니다. 이 때문에 문장이 길고 꾸밈이 잦은 문체라든가, 중간에 잉여표현(감탄사) 등이 자주 끼어드는 구어체에서는 모호성 해소의 정확도가 떨어질 수 있습니다.

안타깝게도 현재의 n-gram 기반 모델로는 사실상 이를 해결하기 어렵습니다. 더 긴 거리의 정보를 포착하기 위해서는 n-gram 모델의 n값을 키워야하는데 이를 키울수록 모델 크기와 메모리 사용량이 기하급수적으로 늘어나기 때문이죠. 이에 대한 대안으로 skip n-gram을 사용하거나 Neural LM을 사용하는 방법이 있겠습니다. 물론 둘 다 현재 방법에 비해 크게 느릴 것이기 때문에 속도와 정확도 사이에서 저울질을 해야할 때가 다시 온 듯하네요.

관련글 더보기

댓글 영역

  • 프로필 사진
    2022.04.06 05:08
    비밀댓글입니다
    • 프로필 사진
      2022.04.06 18:29 신고
      안녕하세요~ 좋은 의견 감사합니다.
      일단 모호성에서 많은 비중하는게 동/형용사이니만큼 충분히 시도해봄직한 방법이라고 생각되네요. 2-pass로 수행하게 되면 최적화 측면에서는 불리한 점이 있겠지만 유지보수 측면에서는 훨씬 용이하기도 할듯하구요ㅎㅎ.
      좋은 방법이 있는지 앞으로도 고민해보도록 하겠습니다!
  • 프로필 사진
    2022.05.01 22:07
    라틴어 공부하다가 들어오게 된 블로그인데 가끔 보면서 공부 자극받고 가요ㅎㅎㅎ...! 잘 모르는 내용이지만 흥미롭게 읽고 있습니당ㅋㅋ 화이팅-!