바로 옆 키로 빗나간 오타를 학습으로 줄이기
키마다 실제로 누르는 위치의 치우침을 기기 안에서 학습하는 학습 앙(터치 학습 보정)을 만든 과정과, 제 터치 기록으로 재생한 결과를 정리함.
키보드 앙에는 학습 앙(터치 학습 보정)이라는 실험 기능이 있습니다. 평소 타자에서 키마다 실제로 누르는 위치가 어느 쪽으로 치우치는지 기기 안에서 학습하고, 보이는 키는 그대로 둔 채 그 키로 인정하는 영역만 살짝 옮깁니다. 내 터치 기록을 실제 앱 코드로 다시 재생해 보니, 바로 옆 키로 빗나간 오타가 약 60% 줄었습니다.
참고
모든 수치는 본인이 Oppo Find N5 한 대에서 남긴 터치 기록을 재생해 얻은 자체 측정값입니다. 다른 사람에게도 같은 효과가 있는지는 비공개 테스트로 확인이 필요합니다.
학습 전에 먼저 고친 것
학습을 넣기 전에, 누른 위치와 상관없이 생기던 오타부터 정리했습니다.
- 아무 키도 입력되지 않던 터치: 키 사이 빈 곳이나 스페이스바 아래 여백을 누르면 그 터치가 버려졌습니다. 안드로이드 기본 키보드(AOSP LatinIME)와 같은 방식으로 바꿔, 어디를 누르든 가장 가까운 키가 입력되게 했습니다. 이 영역은 나중에 다시 터치되지 않게 막을 예정입니다.
- 빠르게 칠 때 뒤집히거나 사라지던 글자: 스페이스를 떼기 전에 다음 키를 누르면 공백 순서가 뒤집히거나 사라지던 문제를 고쳤습니다. 길게 누르기 판정도 앱이 처리한 시각이 아니라 손가락이 닿은 시각을 기준으로 바꿨습니다.
여기까지 고친 뒤에도 남은 오타 중 하나가 손가락이 바로 옆 키를 누른 경우였습니다. 이 글은 이 오타를 다룹니다.
사람은 키 가운데를 누르지 않습니다
터치 입력 연구에서는 사람이 키 가운데가 아니라 일정한 쪽으로 치우쳐 누른다는 결과가 반복해서 나옵니다. 치우치는 방향은 사람마다, 손마다, 줄마다 다르지만 같은 사람 안에서는 꽤 일정합니다.
제 기록에서도 그대로 나타났습니다. 개발용 수집 화면에서 수집용 문장을 따라 친 일반 키보드의 터치 기록입니다.
- ㅅ: 218번 눌러 11번 틀렸고, 그중 9번이 바로 왼쪽 키인 ㄱ으로 입력됐습니다. 저는 ㅅ을 키 가운데보다 왼쪽으로 14.7dp(키 폭의 29%), 아래로 16.8dp(키 높이의 28%) 치우쳐 누릅니다.
- ㄱ: 왼쪽 아래로 치우쳐 눌러 ㄷ으로 5번 틀렸습니다.
- ㅈ: ㅂ으로 4번 틀렸습니다. 같은 이유입니다.
dp는 화면 밀도와 관계없이 길이를 재는 단위로, 1dp는 약 0.16mm입니다. 정리하면 저는 숫자 줄 바로 아래 글자 줄(ㅂ부터 ㅔ까지)의 키를 누를 때, 왼손 엄지로는 키 가운데보다 왼쪽 아래를, 오른손 엄지로는 키 가운데보다 아래를 누릅니다. 일반 키보드와 좌우로 나뉜 분할 키보드에서 키별 경향이 거의 같았습니다. 화면 모양과 상관없는 제 습관입니다.
학습 앙이 하는 일
무엇을 배우나
- 공백이나 엔터를 칠 때, 입력창에 실제로 들어간 글과 키보드가 따라간 글이 같은 구간만 배웁니다. 다르면 그 구간은 통째로 버립니다. 중간에 커서를 옮기거나 Ctrl+지우기, 붙여넣기를 하면 다르게 되므로 버려집니다.
- 노린 키에서 키 크기보다 더 멀리 빗나간 터치는 위치 오차가 아니라 다른 종류의 실수로 보고 버립니다. 실수나 습관이 학습값을 오염시키지 않게 하려는 것입니다.
- 비밀번호 칸과 앱이 학습 금지로 표시한 칸에서는 배우지 않습니다.
어떻게 판정하나
- 누른 위치만 봅니다. 앞뒤 글자나 단어 사전은 보지 않으므로, 같은 위치는 같은 학습 상태에서 항상 같은 키입니다.
- 키 가운데 절반은 학습과 관계없이 항상 그 키입니다. 판정 영역은 키 크기의 20%까지만 옮기고, 스페이스·지우기 같은 기능 키는 건드리지 않습니다.
- 입력하는 도중에는 판정이 바뀌지 않습니다. 학습 결과는 입력창에서 키보드가 새로 열릴 때만 반영되고, 옮긴 영역도 그때나 키보드 모양이 바뀔 때만 계산하므로 터치마다 드는 계산은 거의 늘지 않습니다.
- 아직 표본이 적은 키는 같은 줄 키들의 평균을 따르고, 줄 표본도 적으면 거의 옮기지 않습니다.
얼마나, 어디에 저장하나
- 일반 키보드와 분할 키보드를 따로 배웁니다. 각각 120타를 배우기 전에는 판정을 바꾸지 않습니다.
- 키마다 최근 60타 정도만 기억합니다. 무한히 쌓이지 않고, 습관이 바뀌면 천천히 따라갑니다.
- 기기 안에 키별 치우침 숫자(dp)만 저장하고, 입력한 글자는 저장하지 않습니다.
- 특정 기기를 가려내는 코드는 없습니다. 모든 값은 dp와 키 크기에 대한 비율로 계산합니다.
숫자는 기록으로 정했습니다
위의 120타, 60타, 20% 같은 값은 감으로 정하지 않았습니다. 개발용 수집 화면에서 수집용 문장을 따라 친 터치 기록(일반·분할 키보드 138회, 터치 4,240개)을 실제 앱의 판정·학습 코드에 그대로 다시 흘려 넣어 보고 정했습니다.
- 120타: 약 30타만 배우고 적용하면 맞던 터치를 틀리게 만드는 경우가 있었고, 85타 이상에서는 없었습니다. 그보다 넉넉하게 잡은 값입니다.
- 60타: 효과는 약 150타에서 더 늘지 않았고, 키마다 60타를 기억하면 평균 오차가 1dp 안팎입니다.
- 20%: 옮기는 한계를 20%, 30%, 40%로 바꿔도 결과가 같았습니다. 여러 상수를 바꾼 18가지 조합이 모두 같은 결과였기 때문에, 보이는 키와 가장 덜 어긋나는 20%를 골랐습니다.
결과 1: 처음부터 배우며 치는 흐름
학습이 비어 있는 상태에서 시작해 실제 사용 흐름을 그대로 재생했습니다. 학습 결과는 회차가 바뀔 때만 반영되고, 120타를 채우기 전에는 적용되지 않습니다.
- 분할 키보드(902타): 오타 38개 → 22개(약 42% 감소). 고친 터치 17개, 망가뜨린 터치 1개
- 일반 키보드(3,338타): 오타 110개 → 84개(약 24% 감소). 고친 터치 28개, 망가뜨린 터치 2개
단모음 특성상 ㅔ→ㅣ, ㅅ→ㄱ, ㄱ→ㄷ, ㅐ→ㅏ처럼 바로 옆 키로 빗나간 오타가 주로 고쳐졌습니다.
결과 2: 평소 타자로 배운 값을 터치 기록에 적용
이번에는 기능을 켜고 평소처럼 타자를 친 뒤, 그렇게 배운 값을 터치 기록에 적용했습니다. 배운 데이터와 평가한 데이터가 완전히 다르기 때문에 가장 엄격한 확인입니다.
평소 타자로도 같은 값을 배웠나
일반 키보드에서 평소 타자(타자 연습 사이트 포함)로 터치 8,400개를 배웠습니다. 웹 입력창에서도 대조와 학습이 정상적으로 동작했다는 뜻입니다. 학습한 키는 22개, 줄은 3개이고, 숫자 행은 제가 숫자를 거의 치지 않아 아직 학습값이 없습니다.
평소 타자로 배운 값은 터치 기록의 평균과 거의 같았습니다. 괄호 안은 가로, 세로 치우침(dp)입니다.
- ㄱ: 터치 기록 (−9.9, +14.4) / 평소 타자 (−10.3, +14.2)
- ㅔ: 터치 기록 (−8.6, +21.2) / 평소 타자 (−9.4, +23.2)
- ㅅ: 터치 기록 (−14.7, +16.8) / 평소 타자 (−13.3, +13.4)
- ㅂ: 터치 기록 (+3.9, +14.4) / 평소 타자 (+4.7, +14.9)
대부분의 키가 1~2dp 안에서 일치했습니다. 차이가 큰 키는 ㅋ과 ㅌ인데, 터치 기록에서 이 두 키의 표본이 각각 7개와 35개뿐이라 터치 기록 쪽 평균이 불안정한 경우입니다. 수집용 문장을 따라 칠 때와 평소에 글을 입력할 때 제 손의 치우침은 같았습니다.
그 값을 적용하면
일반 키보드 109회, 터치 3,338개에 적용한 결과입니다.
- 전체 오타: 110개(3.3%) → 84개(2.5%)
- 바로 옆 키로 빗나간 오타: 약 43개(1.3%) → 17개(0.5%), 약 60% 감소
- 바로 옆이 아닌 오타: 67개(2.0%) → 67개, 변화 없음
- 틀리던 것이 맞음: 29개
- 맞던 것이 틀림: 3개(ㅇ→ㄹ 2개, ㅏ→ㅣ 1개)
고친 오타는 ㅅ을 노렸는데 ㄱ이 입력되던 경우 8개, ㅔ를 노렸는데 ㅣ 6개, ㄱ을 노렸는데 ㄷ 5개, ㅐ를 노렸는데 ㅏ 4개 등입니다. 보정 전 "바로 옆 키 오타" 43개는 직접 센 값이 아니라, 고친 29개와 남은 17개, 망가뜨린 3개로 거꾸로 계산한 추정치입니다.
남은 오타
남은 오타는 위치 문제가 아닙니다. ㅇ→ㅗ, ㄹ→ㅓ처럼 대부분 왼손 키와 오른손 키 사이에서, 바로 옆이 아닌 떨어진 키로 생긴 오타입니다. 제가 두 엄지의 순서를 뒤바꿔 누르거나 철자를 헷갈린 경우입니다. 누른 위치를 옮겨서는 고칠 수 없는 문제라 학습 앙의 대상이 아니고, 실제로 그대로 남았습니다.
바로 옆 키로 빗나간 오타만 보면 0.5%까지 내려갔습니다. 제 체감으로도 오타가 확실히 줄었지만, 타자 연습 사이트의 오타율은 따로 기록하지 않아 그 숫자를 확인하지는 않았습니다.
한계
- 본인이 기기 1대(Oppo Find N5)로 남긴 기록입니다. 손 크기나 쥐는 방식이 다른 사람에게도 같은 효과가 있는지는 비공개 테스트로 확인이 필요합니다.
- 터치 기록은 수집용 문장을 따라 친 것이라 평소 타자와 다를 수 있습니다. 평소 타자로 배운 값이 터치 기록과 거의 같았던 것으로 일부 확인했을 뿐입니다.
- 손가락이 닿은 면적도 판정에 활용하려 했지만, 기기가 알려 준 값이 평균 0.6px로 의미 없는 수준이라 위치만 사용합니다.
- 남은 오타 중 순서 오타와 철자 오타는 기록만으로 구분하지 못했습니다.
- 아직 실험 기능이며 기본값은 꺼짐입니다.
켜는 방법
키보드 앙 설정의 입력 탭에서 실험 기능 아래 학습 앙(터치 학습 보정)을 켭니다. 같은 자리에서 일반·분할 키보드별로 "학습 중 n/120" 또는 "적용 중"을 확인할 수 있고, 학습 초기화도 할 수 있습니다. 기능을 껐다 켜도 배운 값은 지워지지 않습니다.
참고 자료
- Holz & Baudisch, Understanding Touch (CHI 2011)
- Henze et al., Observational and Experimental Investigation of Typing Behaviour using Virtual Keyboards on Mobile Devices (CHI 2012)
- Weir et al., A User-Specific Machine Learning Approach for Improving Touch Accuracy on Mobile Devices (UIST 2012)
- Buschek et al., User-specific Touch Models in a Cross-device Context (MobileHCI 2013)
- Yin et al., Making Touchscreen Keyboards Adaptive to Keys, Hand Postures, and Individuals (CHI 2013)
- Gunawardana et al., Usability Guided Key-Target Resizing for Soft Keyboards (IUI 2010)