논문판은 arXiv(cs.CL)에 제출했고 DOI는 공개 후 적는다. 전재 시 저자 Qifeng Xu(ORCID 0009-0009-1584-1519)와 출처 shan.ink를 밝혀야 한다.
현황
작년에 한글–한자 중의성 해소 모델의 설계를 썼고, 설계안에서 멈춰 있었다. 이번에는 그것을 실제로 돌아가는 변환기로 만들었다. 순한글 한국어 문장을 넣으면 국한혼용 문장이 나온다.
정부는 발전소 건설과 경제 발전을 위해 공사를 시작했다.
政府는 發電所 建設과 經濟 發展을 위해 工事를 始作했다.

시연 페이지에 넣은 현대 신문 기사 한 토막이다. 11문장, GPU에서 248 ms. 기계→機械, 결제→決濟, 직원→職員 같은 현대 상용어는 맞았고, 거리→巨里는 틀렸다. 街는 1920–1962년 신문에서 거리로 거의 나타나지 않는다. 구간에 마우스를 올리면 후보와 확률이 보인다.

만들기 전에 문제의 크기부터 쟀다. 1920–1962년 국한혼용 신문 텍스트에서 두 음절 이상의 한자어 토큰은 9,597만 개이고, 그 가운데 3분의 1이 중의적인 한글 형태(같은 한글 표기가 여러 한자어에 대응)에 놓인다. 이 토큰들에 대해 가장 흔한 한자만 고르면 정확도 89.1%다. 다시 “100회 이상 나타나고 최빈 한자 정확도가 90% 이하”인 난어로 좁히면 1,565개 형태, 전체 토큰의 10.8%이고 기준선은 70.8%다. 발전(發展/發電) 0.58, 공사(工事/公使/公社) 0.48, 부인(婦人/否認/夫人) 0.37. 모델의 가치는 이 1할의 토큰에 집중된다.
| 지표 | 값 |
|---|---|
| 두 음절 이상 한자어 토큰 | 95,972,811 |
| 중의적 한글 형태에 놓인 비율 | 33.4% |
| 최빈 한자 기준선(중의 토큰) | 89.1% |
| 난어(100회 이상, 기준선 90% 이하) | 1,565 형태, 토큰의 10.8% |
| 난어 기준선 | 70.8% |
목표
순한글 문단을 넣으면 국한혼용 문단이 나오고, 한자 선택은 문맥이 결정하며, 고유어는 한글로 남긴다. 평가는 보류해 둔 신문 문장을 기준으로 한다. 구간 단위 P/R/F1(시작·끝 위치와 한자가 모두 맞아야 정답)을 재고, “한자를 잘못 고른” 비율은 따로 보고한다. 그것이 모델 자체를 반영하기 때문이다.
세 가지 제약이 이후의 모든 선택을 결정했다. 첫째, 국립국어원의 어휘 의미 분석 말뭉치를 받을 수 없다. 신청서는 제출되지만 한국 신분이 필요하므로 주석 데이터는 전부 직접 만들었다. 둘째, 공개된 대규모 자연 주석 텍스트는 1962년 이전 신문뿐이다. 1963년 이후 본문은 저작권 때문에 제거되어 있어 학습 데이터의 언어가 현대 한국어보다 반세기 오래되었다. 셋째, 이 주제를 보는 사람은 누구나 “왜 LLM을 바로 쓰지 않는가”부터 묻는다. LLM은 같은 표에 기준선으로 들어가야 했다.
문제 정의
작년 설계안은 이것을 다의어 중의성 해소로 다루었다. 실제로 한자 변환에 필요한 것은 동형이의어의 구별, 즉 서로 다른 한자어가 우연히 같은 표기를 갖는 경우의 구별이다. 한 한자어 안의 의미 항목은 구별할 필요가 없다. 레이블 공간은 “한글 형태 → 후보 한자 집합”으로 줄고, 주석도 “의미”에서 “어느 한자로 쓰였는가”로 내려간다. 뒤에서 혼용 텍스트로 학습 데이터를 자동 생성할 수 있었던 전제가 이것이다.
후보 집합에는 “변환하지 않음”도 있어야 한다. 신은 神일 수도 腎일 수도 있지만 고유어 신(신발)일 수도 있다. 변환기는 고유어를 한글로 남길 수 있어야 하고, 그렇지 않으면 모든 음절에 한자를 붙이게 된다.
데이터
| 출처 | 규모 | 용도 |
|---|---|---|
Open Korean Historical Corpus, newslibrary 부분집합 | 1920–1962년 혼용 신문, 여과 후 10,046,459 문장 | 학습과 평가의 본체 |
| 한국어 위키백과 “한글(漢字)” 괄호 주석 | 835,825건 | 현대 텍스트 보강 학습과 평가 |
| 나무위키 괄호 주석 | 303,743건 | 위와 같음 |
| gongu(퍼블릭 도메인 문학), 잡지 | 139,052 + 28,227건 | 보강 학습 |
| kaikki(영어 위키낱말사전 추출) + 한국어 위키낱말사전 | 검증된 한글–한자 대응 41,519쌍 | 사전 씨앗 |
Unihan kHangul + kaikki 단일 한자 항목 | 8,525 + 7,727자의 음 | 음 생성과 검증 |
혼용 텍스트는 그 자체가 주석이다. 각 한자어의 한글 음은 자모 음 표에서 생성할 수 있고, 규칙은 어두 두음법칙(ㄹ→ㄴ/ㅇ, ㄴ+i/y 모음→ㅇ)과 어중 렬/률→열/율뿐이다. 검증된 사전 대응 41,518쌍으로 시험하면 규칙 정확도 98.95%이고, 나머지 오류는 거의 북한식 표기다. 거꾸로 혼용 문장의 한자를 모두 생성된 음으로 바꾸면 순한글 문장과 정답 구간이 나온다. 학습 레코드는 2,147만 건이고, 각 레코드는 “문장, 대상 단어 위치, 정답 한자, 후보 목록”이다.
사전은 세 층을 겹쳐 만들었다. 음 검증을 거친 위키낱말사전 대응, 신문에서 캔 183만 개 한자열(3회 이상 출현)에 생성된 음을 붙인 것, 그리고 각 괄호 주석의 학습 페이지 부분. 합치면 한글 형태 231만 개, 그중 14만 개가 중의적이다. 음 검증 단계에서 오대응 5,219쌍이 걸러졌고, 그중에는 위키낱말사전 항목 설명에서 온 朝鮮→고려 같은 오류도 있었다.
이체자는 통일해야 한다. 같은 단어가 신문에서 塲과 場, 决과 決, 糓과 穀으로 적혀 있는데, 합치지 않으면 서로 경쟁하는 후보가 되어 모델이 표준 표기를 골라도 오답 처리된다. 대응표는 Unihan의 kZVariant에 수작업을 더했고, 방향은 현대 사전의 용자를 기준으로 했다. 첫 판은 “어느 글자가 사전에서 흔한가”로 방향을 정했는데, 그러면 성씨 朴이 樸으로 합쳐져 박씨 인명이 전부 틀린다. 지금 규칙은 두 글자가 모두 한국어 단어에 쓰인 적이 있으면 합치지 않는 것이다.
위키백과와 나무위키의 괄호 주석에는 뚜렷한 선택 편향이 있다. 필자가 중의적이라고 느낀 곳에만 괄호를 달고, 대부분이 지명, 간지 연호, 왕조, 인명이다. 나무위키 주석에서 최빈 한자 기준선은 36.9%에 불과하다. 이 두 출처는 어려운 평가 집합으로는 적합하고, 단독 학습 데이터로 쓰면 모델을 고유명사 쪽으로 치우치게 한다.
후보 생성
순한글 문장에서 먼저 어떤 구간이 한자어일 수 있는지 찾아야 한다. Kiwi로 형태소 분석을 한 뒤 한글 연쇄 안의 2~8음절 부분 문자열을 모두 사전에서 찾고, 있는 것을 후보 구간으로 삼는다. 겹침은 뒤의 선택 단계에 맡긴다. 이 층의 지표는 재현율, 즉 정답 한자가 후보 집합 안에 있는 비율이다. 보류 신문 문장에서 90.6%이고, 글자 단위 조합 대체 경로(각 음절을 가능한 한자로 되찾고, 신문 한자열로 학습한 글자 바이그램 언어모델로 빔 탐색해 상위 10개)를 더하면 97.8%다.
Kiwi의 명사 경계만 쓰면 재현율이 60%에 그친다. Kiwi는 완전히를 부사로 표지하고, 옛 표기에서는 형태소 분석 자체가 부정확하다. 놓친 단어의 절반이 이런 경우였다. 경계를 전혀 보지 않고 한글 연쇄 전체에서 부분 문자열을 세면 재현율은 오르지만 1920년대 텍스트에서 어절 경계를 가로지르는 오매칭이 대량으로 생긴다. 파견책에서 견책을, 그리하야에서 리하→以下를 잡아낸다. 최종 규칙은 구간이 Kiwi 형태소의 시작에서 시작해 형태소의 끝에서 끝나야 하되 품사는 제한하지 않고, 다만 구간이 덮는 모든 형태소가 명사류여야 한다는 것이다. 뒷조건은 시연 중에 건설과가 통째로 建設課로, 위해가 危害로 바뀌는 것을 보고 추가했다. 조사와 어미가 구간 안에 들어가면 안 된다.
위키백과 평가 집합에서 재현율은 81%에 머문다. 나머지는 어떤 사전에도 없는 인명과 지명이고, 글자 조합이 그중 4분의 1을 건진다.
채점 모델
구조는 cross-encoder다. “대상 단어를 표시한 문장” 와 “후보 한자 하나” 를 함께 넣으면 모델이 그 조합에 점수 를 주고, 같은 레코드의 후보 집합 에 softmax를 적용해 교차 엔트로피로 학습한다.
후보 한자가 텍스트로 들어가므로 보지 못한 한자열에도 점수를 줄 수 있다. 한자 자체가 의미를 지니기 때문이다.
이 설계는 인코더가 한자를 알아야 성립한다. XLM-R의 토크나이저는 사전 한자 가운데 0.54%만 미지 문자로 처리하고, 化粧은 化와 粧으로, 發電은 한 단위로 나눈다. KLUE-RoBERTa는 한국어 전용 모델이라 토크나이저가 한자를 거의 모르고, 후보가 미지 문자가 되면 모델은 단어 형태로 답을 외우는 수밖에 없다. 결과는 난어에서 0.513으로 최빈 한자 기준선보다 낮다.
학습은 V100 8장에서 데이터 병렬로 했다. V100은 16 GB뿐이라 large 모델은 장당 레코드 4건 × 후보 12개도 들어가지 않고, gradient checkpointing을 켜서 장당 13.8 GB로 맞췄다. DDP는 모든 파라미터가 loss에 참여하기를 요구하는데 인코더에 딸린 pooler는 쓰이지 않으므로 로드 시 꺼야 한다. 프로세스 8개가 각각 800만 건을 통째로 읽으면 160 GB 메모리가 바닥나므로 각 프로세스가 자기 분할만 읽게 했다. 분할 길이가 한두 건 다르면 프로세스마다 스텝 수가 달라져, 먼저 끝난 쪽은 barrier에서, 아직 도는 쪽은 all-reduce에서 서로 기다리다가 NCCL 시간 초과로 학습 프로세스는 죽고 torchrun은 남아 작업이 RUNNING에 걸린다. 분할 길이의 최솟값을 all-reduce로 맞춰 해결했다.
난어 평가 집합(7,263 구간) 결과:
| 시스템 | 정확도 |
|---|---|
| 최빈 한자 | 0.708 |
| KLUE-RoBERTa base, 200만 건 | 0.513 |
| XLM-R base, 200만 건 | 0.815 |
| XLM-R large, 200만 건 | 0.872 |
| XLM-R base, 800만 건 | 0.892 |
| XLM-R large, 200만 건 + 현대 주석 ×2 | 0.892 |
| claude-sonnet-4-6(후보 집합 내 선택) | 0.920 |
| XLM-R large, 400만 건 + 현대 주석 ×2 | 0.908 |
| XLM-R base, 2,150만 건(전량) + 현대 주석 ×2 | 0.947 |
데이터 양이 모델 크기보다 중요하다. base는 200만, 800만, 전량 2,150만 건으로 가면서 난어에서 0.815 → 0.892 → 0.947로 올라 400만 건의 large(0.908)와 LLM 기준선을 모두 넘었다. 현대 주석은 역사 난어에는 영향이 없고 현대 텍스트에는 크게 작용해, 위키백과 평가 집합이 0.528에서 0.817로, 나무위키가 0.574에서 0.789로 올랐다. 역사 데이터를 더 넣으면 현대 텍스트는 오히려 조금 내려가, 전량 base는 위키백과에서 0.772다.
LLM 기준선은 같은 후보 집합과 같은 표본으로 모델 6개를 하나씩 돌렸고, 모델당 150건이다. 신문의 보통명사에서 LLM은 최빈 한자 기준선과 같은 수준(0.92 대 0.89~0.94)이고 난어에서만 차이가 난다. 기준선을 돌리며 얻은 경험: 게이트웨이는 동시 요청에 민감해 프로세스 16개를 한꺼번에 보내면 전부 429였고, 모델 하나씩 동시성 3에 지수 백오프로 바꿨다. 추론형 모델은 출력 상한을 2048 토큰으로 올리고 응답의 마지막 숫자를 취해야 한다.
변환 여부
채점 모델은 “이 구간이 어느 한자인가”에만 답하고 “이 구간을 변환해야 하는가”에는 답하지 못한다. 후보가 하나뿐이면 softmax는 반드시 1.0이고, 아침은 사전의 쓰레기 항목 俄枕에 잡힌다.
여기에 한자화 사전확률을 썼다. 한글 형태 에 대해 혼용 신문에서 한자로 적힌 횟수 와 한글로 적힌 횟수 를 센다.
필자가 변환을 택한 경험적 확률로, 고유어는 0에 가깝고 한자어는 1에 가깝다. 이것이 게이트로 작동해 인 구간은 선택에 참여하지 못한다. 구간 선택은 동적 계획법으로, 후보 구간 집합 에서 겹치지 않는 부분집합 를 골라 다음을 최대화한다.
는 그 구간의 최선 후보의 softmax 확률이다. 긴 구간과 높은 신뢰도가 우대되고, 인 구간은 한글로 남는다.
이 매개변수들은 종단간 F1로 절제 실험을 했고, 모두 보류 신문 1,000문장(정답 구간 8,313개)에서다.
| 설정 | P | R | F1 |
|---|---|---|---|
| 명사 영역, 게이트 없음 | 0.650 | 0.601 | 0.625 |
| 명사 영역, 게이트 0.1 | 0.694 | 0.601 | 0.644 |
| 연쇄 전체 부분 문자열, 게이트 0.3, τ 0.7 | 0.670 | 0.810 | 0.734 |
| 형태소 정렬, 게이트 0.3, τ 0.7 | 0.763 | 0.823 | 0.792 |
| 형태소 정렬 + 구간 안에 비명사 형태소 없음 | 0.810 | 0.802 | 0.806 |
게이트를 높이면 재현율까지 오른다. 사전확률이 낮은 쓰레기 구간이 빠지면 동적 계획법이 그것들에 밀려 올바른 긴 구간을 놓치는 일이 없어진다. 단음절 접사(的, 側, 黨)와 숫자·날짜 규칙은 이 평가 집합에서 이득이 없었다. 날짜열이 한글 연쇄 가운데 끼어 있어 규칙의 경계 조건이 잡지 못한다.
사전확률은 1920–1962년 말뭉치에서 왔기 때문에 현대 고유명사에는 너무 엄격하다. 함안군 0.24, 갑자 0.07로 모두 0.3 아래다. 현대 텍스트는 게이트 0.05, τ 0.5로 바꾸었고 위키백과 재현율이 0.615에서 0.741로 올랐다. 변환기는 --preset historical|modern 두 가지 기본값을 제공한다.
종단간 결과
| 평가 집합 | 프리셋 | P | R | F1 | 한자 오선택 |
|---|---|---|---|---|---|
| 신문 1920–62, 완전 정답(large, 200만 + 현대) | historical | 0.810 | 0.802 | 0.806 | 2.4% |
| 신문 1920–62, 완전 정답(base, 전량 + 현대) | historical | 0.766 | 0.866 | 0.813 | ≈2% |
| 위키백과, 괄호 정답 | modern | — | 0.741 | — | 12.8% |
| 나무위키, 괄호 정답 | modern | — | 0.691 | — | 15.6% |
신문에서 19%의 과잉 변환은 사전확률로 나눠 보면 절반 이상이 말뭉치에서 대개 한자로 적히던 형태다. 당시 필자가 한글로 남기기로 한 단어들이다. 1950년대 이후 신문의 한글화 경향이 뚜렷해 같은 단어가 두 기사에서 하나는 변환되고 하나는 되지 않으며, 이 부분의 precision은 평가의 하한이다. 위키백과에서는 precision을 잴 수 없다. 괄호는 필자가 중의적이라고 느낀 단어에만 달려 있다.
현대 텍스트에서 잘못 고른 것은 인명과 지명에 몰려 있다. 金泳三 대 金永三은 문맥으로 풀 수 없다.
시연 서비스는 sto에서 돌아간다. CPU는 문장당 약 320 ms, V100은 문장당 24 ms이고 정확도는 같다.
모델 내려받기
두 체크포인트를 사전, 사전확률 계수, 변환기 코드와 함께 Hugging Face에 올렸다. LinkinShan/hanja-wsd-base(전량 base, 역사 텍스트와 속도 우선), LinkinShan/hanja-wsd-large(현대 텍스트에 조금 더 낫다). 가중치는 CC BY-NC-SA 4.0이며, 학습 데이터 중 나무위키의 NC-SA 조건이 가중치에 이어진다.
아직 하지 않은 것
- 200문장 수작업 검토. 특히 “과잉” 부류는 그 단어가 당시에 한자로 적혔을지를 사람이 판단해야 한다.
- 국립국어원 말뭉치가 승인되면 현대 텍스트 평가에 비로소 정답이 생긴다.
- 인명과 지명은 지식 출처가 필요하고 문맥 모델로는 안 된다.
- 숫자와 날짜 규칙 모듈을 현대 텍스트에서 다시 검증한다.
참고
- Open Korean Historical Corpus, 데이터셋: 1920–1962년 혼용 신문의 출처. 저작권 제거에 관한 설명 포함.
- HanjaBridge: 모든 후보 한자를 모델에 제시하는 발상. 이 글의 후보 채점 설계와 대비된다.
- Don’t Just Scratch the Surface: Enhancing Word Representations for Korean with Hanja: 한자가 한국어 단어 표현에 미치는 효과.
- Beyond Distribution: Investigating Language Models’ Understanding of Sino-Korean Morphemes: 순한글로 학습한 모델의 한자어 형태소 이해가 제한적이라는 결과. 다국어 인코더를 고른 근거.
- Unsupervised Cross-lingual Representation Learning at Scale: XLM-R.
- Kiwi: 형태소 분석과 형태소 경계.
- Unihan Database:
kHangul음과kZVariant이체 관계. - kaikki.org 위키낱말사전 추출, 한국어 위키낱말사전 한자어 분류: 사전 씨앗.
- UTagger: 울산대학교의 형태소 분석·동형이의어 표지기. 2011년에 이것을 중심으로 한자 자동 변환을 만든 바 있어, 이 글과 가장 직접 이어지는 선행 시스템이다.