| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 제주환상자전거길
- DJI
- 드론 사진
- misakax
- 드론 비행승인
- 제주도 자전거 일주
- 구글 픽셀
- 로갈리
- 제주도 자전거
- 로그 엘라이
- UX튜토리얼
- 엘라이x
- 제주도 자전거 종주
- 드론 자격증
- 드론 촬영
- 촬영허가
- UX디자인
- 비행승인
- 드론 초보자
- 드론 서류
- iPadOS
- 드론
- 픽셀
- DJI 신제품
- 제주도 자전거 여행
- 드론 촬영허가
- 드론 법
- DJI 드론
- 미사카x
- 드론 법규
- Today
- Total
테크트리(TechTree)
Making of NewSwipe - Part 3: 한국어 단어 추천이 유독 어려운 이유 본문
Making of NewSwipe - Part 3: 한국어 단어 추천이 유독 어려운 이유
Alternative_TechTree 2026. 10. 18. 15:54안녕하세요, Alternative입니다.
2026년 한글날을 맞아, 새로운 한글 입력 시스템 NewSwipe를 출시하였습니다.
https://github.com/TechTree-Alt/NewSwipe
GitHub - TechTree-Alt/NewSwipe: Modern, lightweight, and comfortable Korean Input System.
Modern, lightweight, and comfortable Korean Input System. - TechTree-Alt/NewSwipe
github.com
지난 글에서는 NewSwipe 단모음 배열을 만든 과정을 이야기했습니다. 이번 글에서는 키보드 위에 뜨는 단어 추천이 어떻게 돌아가는지 알아보겠습니다.
이 글의 내용은 새로운 단어 추천, 자동수정 엔진이 들어가는 NewSwipe 1.5.0 이상의 버전에 해당됩니다. 추후 버전에서 수정될 수 있습니다.
이 글은 Claude Opus 5.5의 도움을 받아 작성하였습니다.
영어는 단어, 한국어는 어절
영어 키보드의 단어 추천은 생각보다 단순합니다. 'fri'까지 치면 fri로 시작하는 단어 중에 많이 쓰는 걸 보여 주면 끝입니다. friend, friday, fried. 영어 단어는 꼴이 크게 바뀌지 않으니 사전 하나로 거의 해결됩니다.
한국어는 사정이 다릅니다. '친구' 하나만 해도 실제로는 친구가, 친구를, 친구한테, 친구랑, 친구인데 등등... 다양하게 입력합니다.
동사는 더합니다. '보내다'만 해도 보내, 보내줘, 보내줘서, 보냈어, 보냈나봐, 보낼게, 보낼까... 끝이 없습니다. 한국어는 낱말 뒤에 조사나 어미가 붙어 한 덩어리(어절)로 쓰이다 보니, 같은 낱말도 꼴이 수십 개로 늘어납니다.
NewSwipe 기본 사전에는 7만 단어가 들어 있습니다 (1.5.0 버전 기준). 많아 보여도 사람들이 실제로 치는 어절을 다 담기에는 턱없이 모자랍니다. 그렇다고 사전을 마냥 키우면 키보드가 무거워지죠. NewSwipe의 핵심 가치는 가벼움이기 때문에, 사전을 무작정 키우는 방법은 쓸 수 없었습니다.
그래서 한국어 단어 추천은 사전에서 찾기만 해서는 안 되고, 사전에 없는 말을 그때그때 만들어 내야 했습니다.
치는 도중의 글자부터 골치
본론에 앞서, 한국어 추천에는 영어에 없는 문제가 하나 더 있습니다. 치는 도중에는 마지막 글자가 아직 덜 만들어진 상태라는 점입니다.
'안녕하세요'를 치면 화면에는 '안녕ㅎ' → '안녕하' → '안녕핫' 순으로 글자가 보입니다. 여기서 두 군데가 까다롭습니다.
1. '안녕하'의 '하'는 곧 '한'이나 '할'이 될 수도 있습니다. '고'는 모음이 합쳐져 '과'가 될 수도 있고요.
2. '안녕핫'의 ㅅ은 받침이 아니라 다음 글자 '세'의 첫소리입니다. 두벌식 계열은 다음 모음을 치기 전까지 일단 받침으로 붙여 보여 주거든요.
다행히 유니코드는 한글 음절에 (초성, 중성, 종성) 순서로 번호를 매겨 두어서, 마지막 글자가 앞으로 될 수 있는 글자들이 한 구간에 몰려 있습니다. '하'를 치면 '하'부터 '핳'까지, '고'를 치면 '과·괘·괴'까지 넣은 구간을 한 번에 찾으면 됩니다. '안녕핫'은 받침을 다음 글자로 넘긴 '안녕하ㅅ'으로도 한 번 더 찾게 해서, 안녕하세요가 제대로 뜨게 했습니다.
없는 말은 만들어서
이제 본론입니다. 사전에 '민수가'가 없어도 '민수ㄱ'까지 치면 민수가를 추천해야 합니다. 그래서 NewSwipe는 명사 뒤에 조사를, 동사 뒤에 어미를 붙인 말을 그 자리에서 만듭니다.
말은 쉬운데, 막상 해 보니 이상한 말이 쏟아졌습니다.
- '가는'에 조사를 붙인 '가는요'
- '있다'에 조사를 붙인 '있다한테'
- '사업'에 붙인 '사업한테'
- '피곤하다'에 어미를 붙인 '피곤해줘'
사람은 한눈에 이상하다는 걸 알지만, 컴퓨터는 '가는'이 명사가 아니라는 것도, '사업'이 사람이 아니라는 것도 모릅니다. 그렇다고 형태소 분석기처럼 무거운 도구를 키보드에 넣을 수도 없었습니다.
그래서 사전에 물어보기로 했습니다. 사전에 이미 들어 있는 말을 근거로 낱말의 성격을 짐작하는 방식입니다.
- 명사인지 볼 때: 사전에 그 말 + '의', '에', '에서', '에게' 같은 꼴이 있으면 명사로 봅니다. '은·는·도'는 근거로 치지 않습니다. '그냥은', '가는'처럼 명사가 아닌 말에도 잘 붙기 때문입니다.
- 사람인지 볼 때: '한테·에게·께'는 사전에 그 말 + 한테, 에게가 실제로 있을 때만 붙입니다. 그래서 '사업한테'는 안 나오고 '엄마한테'는 나옵니다.
- 동사인지 형용사인지 볼 때: 사전에 '○○한다', '○○하자'가 있으면 동사로 봅니다. '피곤한다', '피곤하자'라는 말은 없으니 피곤하다는 형용사로 보고, 해줘나 할래 같은 동사 어미는 붙이지 않습니다.
- 어미는 안전한 것만: '돕다 → 도와'처럼 불규칙하게 바뀌는 활용은 틀리기 쉬워서, 불규칙과 상관없는 어미(-고, -지, -겠어, -잖아 등)만 붙입니다. 다만 사용자가 '떨어졌'까지 이미 쳤다면 과거형은 맞게 친 셈이니, 그 뒤에 '어'나 '나봐'를 붙여도 괜찮습니다.
메신저에서 흔한 붙여 쓴 의존 명사도 따로 챙겼습니다. '좋아하는게', '힘든거', '할수', '갈때' 같은 말들입니다. 맞춤법으로는 띄어 써야 하지만, 폰으로 칠 때는 많이들 붙여 치니깐요
그리고 만든 말은 사전의 단어가 없을 때, 빈칸만 채워야 합니다. 만든 말이 사전의 진짜 단어를 밀어내게 했더니 평가 점수가 오히려 떨어졌습니다. 많이 쓰는 흔한 단어들은 사전에 먼저 들어가 있기 때문입니다. 그래서 사전 후보로 세 칸을 다 못 채울 때만, 그것도 기존 후보보다 뒤에 오도록 넣었습니다.
앞 단어도 본다
추천 순서는 바로 앞 단어에 따라서도 바뀝니다. "오늘 저녁 뭐" 다음에는 '먹을까'가, "회의 자료" 다음에는 '보내줘'가 먼저 나와야 자연스럽죠. 그래서 기본 사전에 자주 붙어 다니는 단어 쌍 5만 개를 넣었습니다.
그런데 여기서도 어절 문제가 발목을 잡았습니다. '짝남이', '민수랑'처럼 꼴이 다양한 앞 단어는 단어 쌍 사전에 거의 없습니다. 앞 단어가 사전에 없으면 앞 단어를 보는 의미가 없어지는 셈이죠.
그러다 떠올린 방법이 앞 단어의 끝 글자만 보기였습니다. 끝 글자만 봐도 다음에 어떤 종류의 말이 올지는 대충 짐작할 수 있거든요.
- '을'로 끝나면 → 다음에 동사가 오기 쉽습니다 (밥을 → 먹었어)
- '는'으로 끝나면 → '거', '게' 같은 말이 오기 쉽습니다
- '랑'으로 끝나면 → '같이', '놀았어' 같은 말이 오기 쉽습니다
그래서 앱이 사전을 읽을 때 단어 쌍을 앞 단어의 끝 글자별로 묶어, 끝 글자마다 다음에 오기 쉬운 단어 목록을 새로 만들게 했습니다. 사전 파일에 따로 저장하지 않고 그때그때 계산하니 앱 크기는 늘지 않습니다. 개인적으로 NewSwipe 추천 엔진에서 가장 한국어다우면서도 가성비가 좋은 부분이라고 생각합니다.
틀린 후보는 없느니만 못하다
여러 방법과 알고리즘을 개발하고 평가하면서 크게 깨달은 부분이었습니다.
폰으로 칠 때는 띄어쓰기를 자주 빼먹습니다. '밥먹었니'처럼요. 그래서 앞부분이 사전 단어면 뒷부분을 이어 붙인 후보를 만들게 했습니다. 평가 점수도 꽤 올라서 좋아했는데, 막상 써 보니 추천란에 이런 말이 떴습니다.
- 사솔직히
- 그런가장
- 진짜로맨스
앞부분이 단어이기만 하면 아무 말이나 갖다 붙였던 겁니다. 세어 보니 추천란에 뜬 후보의 9.5%가 이렇게 만든 말이었고, 그중 94%가 틀린 말이었습니다.
문제는 평가 점수로는 이걸 알 수 없었다는 점입니다. 키보드 추천은 보통 "추천 덕분에 키를 얼마나 덜 눌렀나(키 절약률)"로 평가하는데, 이 점수는 틀린 후보를 보여 줘도 깎이지 않습니다. 엉뚱한 후보를 잔뜩 보여 주다가 가끔 맞히기만 해도 점수가 오르는 거죠. 쓰는 사람으로서는 이상한 말이 눈에 걸려서 꽤 거슬리는데 말입니다.
그래서 이어 붙이기는 근거가 있을 때만 하게 바꿨습니다. 단어 쌍 사전에 그 조합이 실제로 있거나, 사용자가 두 번 넘게 이어 쓴 적이 있을 때만요. 그랬더니 만든 말의 비율이 1~1.5%로 줄었습니다. 대신 키 절약률은 18.8%에서 16.8%로 떨어졌습니다. 숫자만 보면 뒷걸음질이지만, 빠진 2%p는 엉뚱한 후보로 가끔 맞히던 가짜였습니다. 그 뒤로는 만든 후보가 얼마나 뜨고 얼마나 맞는지도 따로 재서, 점수는 오르는데 화면은 지저분해지는 일이 없게 했습니다.
띄어 쓴 직후에 다음 단어를 미리 보여 주는 다음 단어 예측도 같은 이유로 기준을 크게 올렸습니다. 처음 기준으로는 보여 준 예측의 90%가 틀렸습니다. 자주 뜨는데 거의 다 틀리면 없느니만 못하죠. 현재 버전은 꽤 자신 있을 때만 다음 단어가 뜨니 가끔만 보이는데, 의도된 사항입니다. 여러 가지를 시도한 결과, 트랜스포머 모델을 쓰지 않는 이상은 모든 상황에서 다음 단어를 유의미한 예측력으로 맞추기는 어렵더라고요. 그래서 사용자가 자주 쓰는 말이거나 관용구처럼 항상 같이 붙어 다니는 경우에만 추천되도록 하였습니다.
결과
여러 번 손본 끝에, 지금은 사람이 쓴 대화체 문장에서 키 절약률(KSR)이 기본 사전 기준 약 21%, 쓰면서 학습이 쌓이면 약 28%쯤 나옵니다. 다섯 번 칠 걸 네 번 친다고 생각하시면 됩니다.
속도도 신경 썼습니다. 키를 누를 때마다 추천을 찾는 데 평균 0.2ms(0.0002초)쯤 걸립니다. 화면을 붙잡아 둘 만한 작업은 모두 백그라운드로 돌렸고, 사전을 아직 못 읽었으면 일단 빈 추천을 보여 주고 다 읽고 나서 다시 찾습니다. NewSwipe는 언제든 바로 반응해야 하니까요.
NewSwipe 사용자를 위한 몇 가지 팁도 남깁니다.
- 단어 추천과 자동 수정은 처음에는 꺼져 있습니다. 설정의 '추천, 학습 및 완성'에서 켜실 수 있습니다.
- 검색창이나 주소창에서는 '친구를'처럼 조사가 붙은 말을 뒤로 뺍니다. 검색어에는 조사를 거의 안 붙이니까요.
- 더 큰 사전(8만 단어, 단어 쌍 40만 개)을 쓰고 싶으시면 설정의 '추천, 학습 및 완성'에 있는 '한국어 사전' 섹션에서 제가 만든 표준 사전 팩(약 1MB)을 받고 가져올 수 있습니다. 이러면 용량이 좀 더 커지는 대신, 키 절약률이 더 올라갑니다.

지금까지 NewSwipe 단어 추천을 만든 이야기였습니다.
다음 글에서는 단어 추천과 짝을 이루는 자동 수정을 다뤄 보겠습니다. 오타를 고치기보다 오타가 아닌 말을 건드리지 않기가 훨씬 어려웠던 이야기입니다.
이 개발 기록이 한국어 추천 기능을 만드는 다른 분에게도 도움이 되었으면 좋겠습니다!
'NewSwipe > NewSwipe 정보' 카테고리의 다른 글
| Making of NewSwipe - Part 5: 내 말버릇을 배우는 키보드와 개인정보 (0) | 2026.10.18 |
|---|---|
| Making of NewSwipe - Part 4: 잘 고치기보다 잘 참아야 하는 자동 수정 (0) | 2026.10.18 |
| Making of NewSwipe - Part 2: NewSwipe 단모음 배열의 개발 과정 (0) | 2026.10.16 |
| Making of NewSwipe - Part 1: 왜 만들었는가 (0) | 2026.10.12 |