새로운 내부 인코딩

43 views
Skip to first unread message

Changwoo Ryu

unread,
Apr 23, 2015, 3:39:02 PM4/23/15
to spellc...@googlegroups.com
지금까지 맞춤법 검사의 내부 인코딩으로 음절을 유니코드 한글자모로 분해한 NFD 형태를 사용했습니다. 이 인코딩은 잘 알려진
인코딩이어서 구현하기 쉬우면서 어쨌든 hunspell에서 동작합니다. 그것 외에도 사용하는 또 한가지 이유는 hunspell
1.2부터 도입된 ICONV 및 OCONV 테이블을 통해 변환할 수 있어서였습니다. (man 5 hunspell 참고)
그래서 인코딩 변환을 위해 전처리나 후처리를 하지 않아도 동작했기 때문에 당장 쓸 수 있었습니다.

하지만 NFD는 내부 인코딩으로 쓰기에는 부족합니다. 같은 자음이 초성과 종성으로 다른 코드값을 사용하기 때문에 불필요한
편집거리가 발생합니다. 예를 들어 많이 쓰는 오타인 "하빈다"를 "합니다"로 교정하는 걸 생각해 보면, "ㅣ"와 "ㄴ"의
순서를 뒤바꾸는 작은 편집거리로 취급되어야 맞겠지만, NFD에서는 초성 ㅂ을 종성 ㅂ으로 바꾸고, 종성 ㄴ을 초성 ㄴ으로 바꾼
다음 ㄴ과 중성 ㅣ의 순서를 바꿔야 하는 꽤 먼 거리로 취급됩니다. 이러한 식의 오타는 두벌식 키보드를 사용하면서 발생하는
오타 외에도 사람들의 발음과 표기에 대한 혼동 때문에 흔하게 발생합니다. (일찍이/일찌기 등)

"그러면 두벌식 키 스트로크를 내부 인코딩으로 쓰면 되지 않느냐?" 라고 하실지 모르지만, 그렇게 간단하지 않은 게,
hunspell 소스를 수정하지 않는 한 한글음절과 두벌식 키스트로크 사이의 변환은 할 수 없습니다. ICONV와 OCONV
기능은 테이블에 일치하는 스트링이 발견되면 replace하는 것 뿐이기 때문에 뒤에 자음이 오는지 모음이 오는지에 따라서
다르게 변환할 수 없기 때문입니다. 물론 최종적으로는 hunspell을 수정해서 이러한 복잡한 변환도 자유자재로 할 수 있는
기능을 탑재하고 구현해야 바람직하겠지만, 일단 욕심을 죽이고 중간 단계를 두려고 합니다.


아이디어는 이렇습니다. 두벌식 키스트로크를 쓰되, 그 대신 변환하기 좋도록 음절의 시작을 구분하는 문자를 사용합니다. (PUA 코드 사용 예정)

* 쌍기역 등 된소리는 하나의 코드로 취급합니다. 쌌 => ㅆㅏㅆ
* 겹자음은 두 개의 코드로 취급합니다. 삯 => ㅅㅏㄱㅅ
* 두벌식에서 두 개로 입력하는 이중모음은 두 개의 코드로 입력합니다. 과 => ㄱㅗㅏ

위의 "하빈다"를 "합니다"로 교정하려면, (음절 시작 코드를 *로 표현합니다.)

하빈다 =(ICONV)=> *ㅎㅏ*ㅂㅣㄴ*ㄷㅏ => *ㅎㅏㅂ*ㄴㅣ*ㄷㅏ =(OCONV)=> 합니다.

이렇게 두 번의 swap 편집이 필요합니다. 그래서 최적의 형태는 아니지만 그래도 현재 NFD보다는 낫습니다.


이게 되면 지금 별도의 추가 처리를 통해 구현했던 여러가지 루틴들이 자연스럽게 구현이 됩니다. 위에서 예를 들었던 두벌식
오타도 모든 조합을 일일이 넣지 않아도 처리되고, ㅚ ㅙ 사이의 거리나 비슷한 복자음 받침의 거리가 자연스럽게 줄어듭니다.

Changwoo Ryu

unread,
May 5, 2015, 4:11:15 AM5/5/15
to spellc...@googlegroups.com
hunspell의 개선 방향에 대해서 ICONV/OCONV를 확장하는 방향으로 제안을 해 봤습니다.

https://sourceforge.net/p/hunspell/bugs/269/

더 나아가면 테이블에서 일일이 패턴 매치를 시도해 보는 방식에서 벗어나서 효율적인 구현이 가능하면 더 좋겠지만 쉬운 방법을 제안해 봤습니다.


2015년 4월 24일 오전 4:39, Changwoo Ryu <cw...@debian.org>님이 작성:
Reply all
Reply to author
Forward
0 new messages