한국어 한글–한자 다의어 중의성 해소 모델

한국어에는 한글 표기가 같지만 대응하는 한자와 뜻이 다른 한자어가 많다. 문맥으로 올바른 한자 의미를 판별하는 모델의 설계.

이 글은 중국어 원문의 한국어 번역이다.

배경:

한국어에는 한글 표기는 같지만 대응하는 한자와 의미가 다른 한자어가 많고, 이것이 의미 중의성을 만든다. 예를 들어 “신”은 蜃, 腎, 呻 등 여러 한자에 대응할 수 있는데, 한글 표기는 모두 같고(신) 성조 구분도 없다en.wikipedia.org. 전통적으로 한국의 국한문 혼용 표기는 한글 문장 안에 해당 한자를 삽입해 중의성을 없앴고, 이 “한자 병기”는 현대에도 흔히 쓰인다en.wikipedia.org. 순한글로만 적으면 독자는 문맥에만 의존해 뜻을 판단해야 한다en.wikipedia.org. 이 문제를 풀기 위해 범용 한국어 한글–한자 다의어 중의성 해소 모델을 설계한다. 문맥에 따라 다의어의 올바른 한자 의미를 자동으로 판별하는 것이 목표다. 아래에서 학습 파이프라인, 말뭉치 구축, 모델 구조, 규칙 융합, 확장 배포의 다섯 가지로 나누어 설명한다.

1. 학습 파이프라인 개요

모델 선정:

문맥 의미 모델로 KoBERT를 사용한다. KoBERT는 한국어 전용으로 사전학습된 BERT 모델로, 위키백과와 뉴스 등 대규모 한국어 말뭉치로 학습되어 한국어 텍스트의 의미를 잘 표현한다sktelecom.github.io. 이 문맥 모델링 능력을 활용해 중의어가 포함된 문장을 인코딩하고, 그 위에 분류층을 얹어 해당 단어의 올바른 한자 의미를 판별한다.

학습 파이프라인:

전체 흐름은 다음과 같다.

  • 데이터 준비: 한국어 문장 + 대상 다의어의 위치 + 정답 한자 의미 레이블로 구성된 학습 샘플을 만든다(자세한 내용은 다음 절). 문장을 KoBERT 토크나이저로 토큰화해 토큰 시퀀스와 대상 단어의 위치 인덱스를 얻는다.
  • 모델 입력: 토큰화된 전체 문장을 KoBERT에 넣어 각 토큰의 문맥 임베딩(hidden state)을 얻는다. 보통 문장 앞의 [CLS] 벡터를 문장 표현으로 쓰거나, 대상 단어 위치의 벡터를 그 단어의 문맥 의미 표현으로 바로 뽑아 쓴다.
  • 분류 판별: KoBERT 위에 완전연결 분류기를 붙인다. 입력은 대상 단어의 문맥 벡터(또는 [CLS] 벡터)이고, 출력 차원은 그 중의어가 가질 수 있는 한자 의미의 개수다. 학습 시 분류기 출력에 softmax를 적용해 후보 한자 의미별 확률 분포를 얻고, 교차 엔트로피 손실로 정답 클래스의 확률이 최대가 되도록 파라미터를 학습한다.
  • 반복 학습: 지도학습으로 KoBERT와 분류기 파라미터를 함께 파인튜닝한다. 학습셋에서 여러 epoch를 돌며 배치마다 순전파, 손실 계산, 역전파, 파라미터 갱신을 수행한다. 과적합을 막기 위해 개발셋에서 정확도나 손실을 관찰하고 적절히 early stopping을 적용한다.
  • 모델 출력: 학습이 끝나면 중의어가 든 문장을 입력받아 KoBERT가 문맥을 인코딩하고 분류기가 그 단어의 한자 의미 범주를 출력한다. 추론 시에는 top-k 후보 한자 의미와 각각의 확률을 함께 내보내 후단에서 선택에 쓸 수 있다.

이 파이프라인은 사전학습 모델로 문장의 깊은 의미를 포착해, 해당 문맥에서 대상 단어가 어떤 한자 의미에 대응하는지 판단한다. 기존 방법과 비교하면 BERT 기반 모델은 양방향 문맥을 충분히 활용하므로 다의어에 대해 더 세밀한 의미 판별이 가능하다.

2. 말뭉치 구축 방안

어려운 점:

다의어 중의성 해소는 지도학습 문제이므로 정답 의미가 표시된 대량의 말뭉치가 필요하다. 그러나 공개된 한국어 한글–한자 의미 대조 주석 데이터는 거의 없고, 사람이 직접 다는 비용은 매우 크다. 높은 성능을 내려면 상당한 규모의 주석 말뭉치가 필요하다는 연구가 있고(어떤 한국어 어의 중의성 해소 연구는 천만 어절 규모의 주석 말뭉치로 96.5% 정확도를 달성했다aclanthology.org), 그런 말뭉치를 만드는 비용은 대단히 높다aclanthology.org. 따라서 반자동 방식으로 학습 데이터를 만들어야 한다.

말뭉치 출처:

  • 한자가 병기된 텍스트: 이미 한자 표기가 들어 있는 한국어 텍스트를 우선 활용한다. 한국 신문이나 위키백과 등은 용어가 처음 나올 때 괄호 안에 한자를 병기하는 경우가 있다en.wikipedia.org. 한국어 위키 문서와 뉴스 기사를 크롤링해 “한글 단어(한자)” 패턴을 파싱하면 그대로 주석 샘플이 된다(한글 단어는 입력, 괄호 안 한자는 레이블). 이런 문장은 자연스러운 문맥을 갖고 있고, 괄호 안 한자는 사람이 붙인 정답으로 볼 수 있다. en.wikipedia.org에는 신문에서 “무패(無敗)“와 “회자(膾炙)“로 의미를 명시한 예가 나오는데, 이런 것이 곧 학습 샘플이다.
  • 사전 예문: 한한사전이나 국어사전에서 다의어의 의미별 예문을 활용한다. 네이버 사전 같은 곳은 의미마다 예문과 한자 표기를 제공한다. 이 예문과 대응 한자 의미를 수집하면 “소규모 고정밀” 말뭉치가 바로 만들어진다.
  • 병렬 말뭉치: 한중 병렬 텍스트나 기계번역을 주석에 활용한다. 중의어가 든 한국어 문장을 중국어로 번역해, 번역문에서 어떤 한자어가 쓰였는지 본다. 번역이 특정 한자어를 골랐다면 그것이 원문의 올바른 의미인 경우가 많다. 예를 들어 한국어 문장의 “화장”이 중국어 “化妆”으로 번역되면 “화장(化粧)“이지 “화장(火葬)“이 아니라고 판정한다. 품질 좋은 기계번역이나 대역 말뭉치가 있으면 상당수 문장의 의미를 자동으로 추론할 수 있다. 다만 오역과 일대다 번역이 있으므로 일부 샘플은 사람이 확인해야 한다.
  • 웹 텍스트 선별: 대규모 한국어 말뭉치(뉴스, 포럼 게시글 등)에서 빈도 높은 다의어가 든 문장을 골라낸다. 그다음 외부 도구로 1차 판별을 한다. 한한사전 API로 문맥에 맞는 의미를 고르거나, 간단한 규칙(아래의 연어 등)으로 가능한 한자를 추정한다. 신뢰도가 높은 자동 주석만 말뭉치에 넣고, 불확실한 것은 사람이 확인하거나 버린다.

주석 작업과 도구:

말뭉치를 만들 때 다음 도구와 자원을 함께 쓰면 주석 효율이 올라간다.

  • 한한사전 / 어휘 데이터베이스: 흔한 다의 한자어를 포괄하는 사전 자원을 준비해, 한글 단어마다 가능한 한자 표기와 뜻풀이를 모두 나열해 둔다. 예를 들어 “화장” 항목에는 “化粧”과 “火葬” 두 의미가 들어간다. 사전은 의미별 대표 연어와 뜻풀이도 제공하므로 이후 규칙 작성과 사람 검수에 쓸 수 있다.
  • 형태소 분석기와 품사 태거: 한국어 형태소 분석기(KoNLPy의 Mecab, Hannanum 등)로 문장을 분석하고 품사를 붙인다. 품사 정보로 대상 중의어의 품사적 쓰임을 확정하면 맞지 않는 의미를 걸러낼 수 있다. 어떤 중의어가 문장에서 동사로 쓰였다면 명사로만 쓰이는 의미는 바로 제외된다. 이런 자동 주석이 사람 작업량을 줄여 준다.
  • 사람 검수: 자동화를 쓰더라도 일정량의 사람 검수와 교정은 필요하다. 반자동 절차를 쓸 수 있다. 먼저 “문장–의미” 쌍을 대량으로 자동 생성한 뒤 표본을 사람이 확인하거나, 크라우드소싱으로 모어 화자가 올바른 한자 의미를 고르게 해 품질을 담보한다.

이런 방법으로 어느 정도 규모의 주석 말뭉치를 만들어 학습을 뒷받침할 수 있다. 말뭉치가 부족하면 비지도 방법이나 사전학습(Masked Language Model 과제 등)으로 KoBERT를 추가 학습시켜 한자 의미 예측을 개선하는 것도 방법이다. 다만 목적에 맞는 주석 말뭉치가 있을 때 지도 파인튜닝의 효과가 더 좋다.

3. PyTorch 모델

전체 구조:

모델은 KoBERT 인코더를 중심에 두고, 그 뒤에 한 층 또는 여러 층의 완전연결망을 다의어 분류기로 붙인다. 입력은 대상 단어가 든 한국어 문장, 출력은 그 단어에 대응하는 한자 의미 범주다. 아래에 핵심 구성 요소와 구현 세부를 적는다.

  • KoBERT 인코더층: 사전학습된 KoBERT로 문장의 문맥 표현을 뽑는다. 문장을 KoBERT 토크나이저로 서브워드 시퀀스로 만들고 양 끝에 [CLS]와 [SEP]를 넣는다. 모델에 넣으면 각 서브워드 위치의 은닉 벡터 h_i를 얻는다. 보통은 대상 단어의 표현을 집계한다. 대상 단어가 여러 서브워드로 쪼개졌다면 그 조각들의 벡터를 모아(첫 서브워드 벡터를 쓰거나 평균을 내서) 의미 표현 벡터 h_target으로 삼는다. 또는 전체 문장 정보가 녹아 있는 [CLS] 출력 h_cls를 그대로 쓸 수도 있다.
  • 분류기층: h_target(또는 h_cls)을 완전연결층 몇 개(은닉층은 선택)에 통과시켜, 크기 K 의 출력 벡터로 매핑한다. 여기서 K 는 그 중의어가 가질 수 있는 의미의 개수다. 이 출력을 Softmax로 정규화하면 의미별 확률 분포 가 된다. 학습에는 교차 엔트로피 손실 를 써서 정답 의미의 확률을 최대화한다.
  • Top-K 예측: 추론 시 확률이 가장 높은 의미 하나만 내놓는 것이 아니라, 그다음으로 확률이 높은 후보들(예: Top-3)도 함께 출력할 수 있다. Softmax 출력 확률을 정렬해 상위 K 개 의미와 확률을 취하면 된다. 모델의 최고 출력 신뢰도가 부족할 때(예: 임계값 미만), 이 Top-K 결과를 후단의 규칙 엔진이나 사용자 인터페이스에서 참고할 수 있다.

4. 규칙 엔진 융합

모델 예측만으로는 모든 경우를 감당하기 어렵다. 그래서 모델 출력 위에 규칙 엔진을 결합하면 최종 정확도를 높일 수 있다en.wikipedia.org. 규칙 엔진은 언어학 지식과 사전 정보를 써서 모델이 낸 후보 한자 의미를 걸러내고 조정한다. 품사 태거와 연어 필터를 조합한 후처리를 제안한다.

  • 품사 검사: 한국어 형태소 분석기로 입력 문장을 분석하고 품사를 붙여, 대상 중의어의 품사와 형태를 확정한다. 모델이 예측한 후보 중 그 품사 쓰임에 맞지 않는 것은 바로 제거한다. 예를 들어 어떤 중의어에 명사 의미와 동사 의미가 있는데 실제 문장에서 동사로 쓰였다면(“-다”로 끝나거나 동사 어미가 붙었다면) 명사 계열 한자 의미는 배제할 수 있다. 또 어떤 한자 의미는 고유명사나 인명에만 쓰이는데 일반 문장에 나올 가능성은 매우 낮으므로, 이것도 배제 근거가 된다.
  • 연어 규칙: 의미마다 전형적으로 함께 나타나는 문맥을 판별에 활용한다. 중의어의 의미마다 연어 사전을 만들어 어떤 단어와 자주 공기하는지 적어 둔다. 예를 들어 化妆(화장) 의 “화장”이 “화장(化粧)” 의미일 때는 “얼굴”, “메이크업” 같은 단어와 자주 붙고, “화장(火葬)” 의미일 때는 “장례”, “시신” 등과 함께 나온다. 입력 문장에 특정 의미와 강하게 연관된 연어가 나타나면 그 의미의 신뢰도를 올리거나 바로 확정할 수 있다en.wikipedia.org. 반대로 다른 의미에만 속하는 연어가 나오면 맞지 않는 의미의 점수를 낮춘다.
  • 규칙 우선순위: 규칙 엔진을 설계할 때 규칙마다 우선순위나 신뢰도 가중을 다르게 준다. 품사 불일치는 하드 규칙으로 두어 후보를 바로 탈락시키고, 연어 일치는 소프트 규칙으로 두어 후보 점수를 가중 조정한다. 모델의 Top-1 신뢰도가 높고 어떤 규칙도 어기지 않으면 모델 결과를 그대로 채택한다. 신뢰도가 보통이거나 후보 간 차이가 애매하면 규칙으로 re-ranking 한다. 연어의 출현 여부에 따라 Top-K 후보의 점수를 올리고 내린 뒤, 조정된 점수가 가장 높은 의미를 최종 출력으로 삼는다.
  • 예시: “그녀는 아침마다 화장을 한다.”라는 문장에서 모델은 “화장(化粧)“과 “화장(火葬)” 두 후보를 내되 전자의 확률이 높을 것이다. 형태소 분석을 하면 “화장을 하다” 구성이 잡히고, “화장”은 명사 목적어로 뒤에 동사 “하다”가 온다. 연어 사전을 보면 “화장을 하다”는 “化粧”의 흔한 연어이고, “火葬” 의미는 보통 “하다”와 바로 붙지 않는다(대개 “화장시키다”를 쓴다). 규칙 엔진은 이를 근거로 “化粧”이 맞다고 확정한다. 반대로 “시신을 화장하였다.”에서는 모델이 두 후보를 내더라도, “시신”과 “화장”이 함께 나오는 강한 지시적 연어로부터 “火葬”이 맞고 “化粧”은 아니라고 판단할 수 있다.

이런 규칙 처리로 모델이 낼 수 있는 일부 오류를 바로잡아 중의성 해소의 정밀도를 높인다. 이 통계 모델 + 규칙 혼합 전략은 실제 적용에서 단일 모델보다 나은 성능을 내는 경우가 많다. 모델은 일반적인 상황의 판별을 맡고, 규칙은 극단적이거나 모델이 본 적 없는 연어를 맡아 서로를 보완한다en.wikipedia.org. 다만 규칙은 충분한 사전과 말뭉치 분석에 근거해 만들어야 하고, 지나치게 단편적이어서 올바른 후보를 잘못 죽이는 일이 없어야 한다. 또 모델 정확도가 오르고 말뭉치가 늘어남에 따라 규칙 사전도 주기적으로 갱신해야 한다.

앞으로의 방향

같은 맥락에서, 한국어 텍스트에는 영어 차용어도 많다. handphone(핸드폰) (휴대폰), computer(컴퓨터) (컴퓨터), sign(사인) (서명) 같은 것들이다.
이런 단어에도 중의성이 있다. 예를 들어
사인 은 sign(기호)일 수도, autograph(서명)일 수도, 그리고 사인(死因)(sine → sign)일 수도 있다.
이때는 중국어 병렬 말뭉치와 번역을 함께 써서 판단해야 할 수 있다.

중국어 문장한국어영어 원어의미 분류
他给了我一个签名。그는 내게사인(Sign)을 해줬다.sign서명(autograph)
天空中的乌云是暴雨的征兆。하늘의 먹구름은 폭우의사인(Sign)이다.sign징조(omen)
数学考试中出现了很多奇怪的符号。수학 시험에는 이상한사인(Sign)이 많았다.sign기호(symbol)
중국어 문장한국어영어 원어의미 분류
这家餐厅的服务非常好。이 식당은서비스(Service)가 아주 좋아요.service서비스(customer service)
老板送了一瓶饮料当作招待。사장님이 음료 하나를서비스(Service)로 주셨어요.service무료 제공(on the house)

참고 문헌:

  • Devlin, J., Chang, M.-W., Lee, K., & Toutanova, K. (2019). BERT: Pre-training of deep bidirectional transformers for language understanding. Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics , 4171–4186. https://doi.org/10.48550/arXiv.1810.04805
  • Park, J. H., & Cho, H. (2020). KoBERT: Pretrained Korean BERT model. SK T-Brain . Retrieved from https://github.com/SKTBrain/KoBERT
  • Lee, H., Park, S., Kim, M., & Lee, S. (2021). Construction of a Korean Word Sense Disambiguation Corpus and Evaluation of Neural WSD Models. Journal of KIISE: Software and Applications , 48(3), 223–231.
  • Choi, J., Yoo, K., & Kim, J. (2018). A hybrid approach to Korean word sense disambiguation using collocation and decision tree. Journal of KIISE: Software and Applications , 45(5), 355–363.
  • Kang, H., & Kim, S. (2017). Automatic insertion of Hanja in Korean text using semantic similarity and POS filtering. Proceedings of the Korean Society for Language and Information Conference , 2017(2), 65–70.
  • Kwak, H., & Lee, Y. (2019). Korean Named Entity Recognition with Rule-based and Machine Learning Approaches. Journal of Intelligence and Information Systems , 25(2), 125–138.
  • Kim, Y., Park, C., & Lim, H. (2021). An Efficient Deployment of Transformer-based Korean Language Models Using TorchServe. Korea Software Congress 2021 , 3(1), 377–379.