콘텐츠로 이동

동형이의어 구분 원리 (베타)

동형이의어 구분 원리 — 품사 너머의 의미 (베타)

형태소 분석은 다리가 명사(NNG)라는 것까지 알려 줍니다. 그런데 그 다리가 건너는 다리(橋)인지 몸의 다리(脚)인지는 품사로 갈리지 않습니다. 바른은 문맥으로 뜻을 고르는 층을 형태소 분석 위에 얹어, 형태소마다 사전 의미 번호(어깨번호)를 붙일 수 있습니다.

이 문서는 그 원리와 학습 데이터, 그리고 현재 수준을 설명합니다. 사용 방법은 동형이의어 의미 구분 API를 참고하세요.

베타 기능입니다

동형이의어 의미 구분은 베타이며, 정식 기능으로는 바른 3.1.0 릴리스에 포함됩니다. 아래 설명은 베타 시점의 구조와 실측 결과입니다.

왜 어려운 문제인가

한국어 동형이의어 판별에는 세 가지 벽이 있습니다.

1. 후보가 많고, 대부분 같은 품사입니다.

는 배(腹)·배(船)·배(梨)·배(倍)·배(杯)… 사전 항목이 열 개 가까이 되고 상당수가 NNG 입니다. 품사 태깅은 이 구분에 아무 도움을 주지 못합니다.

2. 의미의 분포가 극단적으로 치우쳐 있습니다.

실제 글에서 어떤 뜻은 수천 번 쓰이고, 어떤 뜻은 몇 번 쓰이고 끝납니다. 그래서 "그 단어에서 가장 흔한 뜻"을 늘 고르는 단순 규칙이 이미 상당히 높은 정확도를 냅니다. 모델이 의미가 있으려면 이 최빈 의미 규칙보다 확실히 나아야 합니다.

3. 정답 데이터가 부족합니다.

의미 번호가 사람 손으로 붙어 있는 한국어 말뭉치는 제한적이고, 사전마다 의미를 나누는 기준도 달라 그대로 합칠 수 없습니다.

graph TD
  A["'다리' / NNG"] --> B{"문맥"};
  B -->|"…를 건넜다"| C["다리 5 — 시설물"];
  B -->|"…가 저리다"| D["다리 1 — 신체"];
  B -->|"안경 …"| E["다리 3 — 물체의 지지 부분"];

하나의 모델이 품사와 의미를 함께 냅니다

바른은 의미 판별을 위해 별도의 분석기를 뒤에 붙이지 않습니다. 품사를 붙이는 것과 같은 문맥 표현에서 의미도 함께 읽어 냅니다.

graph LR
  S["문장"] --> E["문맥 인코더<br/>(트랜스포머)"];
  E --> P["품사 판정"];
  E --> W["의미 판정"];

이 방식을 고른 이유는 이렇습니다.

  • 품사와 의미는 같은 단서를 공유합니다. 주변 어절, 조사, 서술어가 품사도 정하고 뜻도 정합니다. 문맥 표현을 두 번 만드는 것은 낭비입니다.
  • 속도: 문맥을 다시 읽지 않으므로 추가 비용이 작습니다. 의미가 필요 없는 호출은 이 층을 아예 실행하지 않아 기존과 동일한 비용으로 동작합니다.
  • 품사 정확도를 해치지 않습니다. 의미 학습을 함께 넣은 뒤에도 품사 정확도는 보류 평가에서 99.6% 수준을 유지했습니다(의미 학습 이전과 같은 수준).

자세한 문맥 인코더 구조는 트랜스포머 모델 아키텍처를 참고하세요.

핵심 장치 — 후보를 그 단어의 사전 항목으로 제한합니다

의미 판정에서 가장 중요한 설계는 "고를 수 있는 답을 미리 좁히는 것" 입니다.

한국어 전체 의미 목록은 수만 개(현재 약 5만 8천 항목)입니다. 이 전부를 놓고 하나를 고르게 하면, 흔한 의미에 쏠리고 드문 의미는 사실상 선택되지 않습니다. 그래서 바른은 판정 순간에

  1. 그 형태소의 표제어와 품사로 사전 후보를 찾고,
  2. 그 후보들 사이에서만 확률을 계산해 가장 높은 것을 고릅니다.
'다리' + NNG  →  후보 [1, 3, 5, 8, …]  →  후보 안에서 확률 계산  →  5

이 제한이 만드는 차이는 큽니다.

판정 방식 성질
전체 의미에서 고르기 흔한 의미로 쏠리고, 드문 의미는 거의 선택되지 않습니다.
그 단어의 후보에서 고르기 사전에 없는 엉뚱한 의미가 원천적으로 나오지 않고, 드문 의미도 겨룰 수 있습니다.

부수 효과도 두 가지 있습니다.

  • 표제어가 어긋난 뜻이 붙지 않습니다. 후보 자체가 그 표제어·품사의 사전 항목이라, 다른 단어의 뜻풀이가 실릴 구조적 여지가 없습니다.
  • 응답의 확률이 뜻을 가집니다. sense.probability 는 이 후보 집합 안에서 정규화한 값이라, 후보를 모두 더하면 1이 됩니다. 반대로 후보가 하나뿐이면 항상 1.0 이며, 이는 확신이 아니라 "고를 것이 하나뿐"이라는 뜻입니다.

어깨번호 체계를 우리말샘으로 통일했습니다

의미 번호는 사전마다 다릅니다. 바른의 학습 자료도 원래는 기준이 섞여 있었습니다.

자료 원래 의미 번호 기준
세종 말뭉치(문어·구어) 표준국어대사전
모두의 말뭉치(뉴스) 의미 번호 표기 없음
국립국어원 어휘 의미 분석 자료 우리말샘

바른은 전부를 우리말샘 기준으로 옮겨 하나의 번호 공간으로 통일했습니다. 우리말샘을 택한 이유는 표제어·의미 수가 가장 많아 실제 글에 나오는 단어를 담아내고, 갱신이 계속되며, 공개된 자료로 뜻풀이까지 연결할 수 있기 때문입니다.

통일의 효과는 정확도로도 확인됐습니다. 표준국어대사전 기준(약 6,600 의미)에서 우리말샘 기준(3만 이상)으로 옮기면 구분해야 할 의미가 5배 이상 촘촘해져 절대 정확도는 내려가지만, 최빈 의미 규칙 대비 모델이 만들어 내는 이득은 오히려 커졌습니다(+5.6%p → +7.1%p). 과제가 어려워졌는데도 모델의 기여가 늘었다는 뜻입니다.

뜻풀이는 결과에 미리 넣어 둡니다

응답의 meaning(뜻풀이)은 서버가 요청 시점에 사전을 조회해 채우는 값이 아닙니다. 의미 목록을 만들 때 표제어·어깨번호로 우리말샘과 맞춰 두어, 형태소 분석기만 설치한 환경에서도 뜻풀이가 함께 나옵니다. 맞춤법 검사기 여부와 무관합니다.

용언은 어간이 아니라 기본형('먹' → '먹다') 으로 맞추고, 품사 부류가 어긋나는 연결은 버립니다. 어간만으로 맞추면 같은 표기의 명사 뜻이 조용히 붙는 일이 생기기 때문입니다. 이 처리로 뜻풀이 연결률은 99.4%가 되었습니다(남은 0.6%는 우리말샘에 표제어가 없는 항목).

학습 데이터 — 사람이 붙인 정답을 먼저 씁니다

의미 판별은 정답 데이터의 품질이 성능을 거의 결정합니다. 바른은 우선순위를 이렇게 두었습니다.

  1. 사람이 붙인 의미 주석을 최우선으로 씁니다. 세종 말뭉치의 의미 주석과 국립국어원의 어휘 의미 분석 자료(뉴스 문장 약 146만 형태소)가 기준선입니다.
  2. 없는 곳은 자동으로 채우되, 검증을 거칩니다. 의미 번호가 없는 문장에는 대규모 언어모델로 후보를 붙인 뒤, 같은 의미로 묶인 예문들을 서로 비교해 어긋나는 것을 걸러 냅니다. 사람 정답과 겹치는 구간에서 자동 부착의 오류가 대량으로 드러났고, 그 교훈으로 사람 정답이 있는 곳에서는 자동 부착을 쓰지 않습니다.
  3. 드문 의미는 기존 말뭉치에서 찾아 보강합니다. 문장을 새로 만들기보다, 이미 있는 문장에서 그 의미로 쓰인 용례를 찾아 라벨을 붙이는 방식을 먼저 씁니다. 실제 글의 문체가 유지됩니다.
  4. 원본 말뭉치는 건드리지 않습니다. 의미 번호가 붙은 자료는 원본과 별도로 관리해, 품사·분절 학습에 쓰이는 기준 자료가 오염되지 않게 합니다.

정리 과정에서 배운 것 — '표기가 같으면 같은 의미'가 아닙니다

자동으로 붙인 의미를 검증할 때, 처음에는 "같은 어깨번호면 같은 뜻이어야 한다"는 기준으로 걸렀습니다. 그런데 어깨번호는 동형이의어 단위이고 그 아래 여러 갈래(다의)가 또 있어서, 이 기준으로는 정상 데이터의 대부분이 불일치로 잡혔습니다. 기준을 "같은 사전 항목에 속하는 쓰임인가"로 바꾸자 걸러 낼 대상이 제대로 좁혀졌습니다.

현재 수준과 한계

보류 평가(학습에 쓰지 않은 문장 약 10만 개)에서 측정한 결과입니다.

지표 결과
품사 정확도 99.6% (의미 학습을 넣어도 손실 없음)
동형이의어 형태소의 의미 정확도 약 92%
같은 조건에서 최빈 의미 규칙 약 85%
최빈 의미 규칙 대비 +7%p
드물게 쓰이는 의미 약 74%

수치는 좋지만, 실제 문장에서는 아직 눈에 띄는 약점이 있습니다. 베타로 공개하는 이유입니다.

약점 실측 예
한 문장에 같은 표기가 여러 번 나오면 같은 의미로 몰립니다. 밤에 밤을 구웠다. → 두 모두 '야간'
동사·형용사의 의미 선택이 명사보다 약합니다. 배를 타고 를 '피부가 햇볕에 타다'로 판정
문맥 단서가 짧으면 흔한 의미로 떨어집니다. 배를 먹었다. → 배를 '복부'로 판정

원인은 대체로 데이터 쪽입니다. 용언은 사전에서 의미가 훨씬 촘촘하게 나뉘는 데 비해 의미 주석이 붙은 예문이 적고, 같은 표기의 두 번째 출현을 첫 출현과 다르게 보도록 학습시킨 신호도 부족합니다. 이어지는 작업은 사람 정답 자료의 활용 범위를 넓히고, 부족한 의미의 용례를 실제 말뭉치에서 찾아 보강하는 방향입니다.

정리

  • 의미 판별은 형태소 분석과 같은 문맥 표현에서 나옵니다 — 별도 분석기가 아닙니다.
  • 판정은 그 표제어·품사의 사전 후보 안에서만 이뤄집니다. 그래서 엉뚱한 뜻이 붙지 않고, 응답 확률이 해석 가능한 값이 됩니다.
  • 의미 번호는 우리말샘 기준으로 통일했고, 뜻풀이는 미리 결과에 담겨 있습니다.
  • 사람 정답을 최우선으로 쓰고, 자동 부착은 검증을 거쳐 보조로만 씁니다.
  • 명사에서 안정적이고, 용언·반복 출현·짧은 문장이 남은 과제입니다.

다른 도구·자원과의 비교는 한국어 동형이의어 분석 자원 비교에서 다룹니다.

자주 묻는 질문

Q. 의미 구분을 위해 별도의 모델을 더 돌리는 건가요?

A. 문맥을 읽는 부분은 형태소 분석과 공유하고, 의미를 고르는 층만 추가로 계산합니다. 그래서 의미를 요청하지 않은 호출은 기존과 완전히 같은 비용으로 동작합니다.

Q. 사전에 없는 의미가 나올 수도 있나요?

A. 없습니다. 판정 후보 자체가 그 표제어·품사의 사전 항목으로 제한되므로, 사전에 없는 번호나 다른 단어의 뜻이 실리지 않습니다.

Q. 어깨번호 기준은 왜 우리말샘인가요?

A. 표제어·의미 수가 가장 많아 실제 글의 단어를 담아내고, 공개 자료로 뜻풀이까지 연결할 수 있습니다. 학습 자료마다 달랐던 번호 기준도 우리말샘 하나로 통일했습니다.

Q. 최빈 의미를 고르는 것과 무엇이 다른가요?

A. 보류 평가에서 최빈 의미 규칙은 약 85%, 바른의 모델은 약 92%였습니다. 다만 문맥 단서가 부족한 짧은 문장에서는 결과가 최빈 의미에 가까워지는 경향이 남아 있습니다.

도움이 되었나요?