개요: 첫가끝 인코딩을 사용하는 이유

100 views
Skip to first unread message

Changwoo Ryu

unread,
Nov 25, 2008, 11:45:47 AM11/25/08
to spellc...@googlegroups.com
왜 첫가끝으로 변환했다가 다시 변환하는 수고를 하는가 설명하면..

맞춤법 검사 소프트웨어는 (1) 문장을 단어 단위로 쪼개고, (2) 단어가 올바
른 단어인지 검사하고, (3) 올바른 단어가 아니라면 올바른 단어가 무엇이 되
어야 할 지 후보를 추천하는 일을 합니다. (물론 이렇게 단순화할 수 없는 어
법/문법 수준의 맞춤법 검사도 있지만, 그건 대부분의 프로그램이 안 하고 있
고, hunspell이 할 수 있는 범위도 넘어가므로 논외로 합니다.)

(1)이나 (2)에서 하는 일은 비교적 명백합니다. 단순화하면 (1)이야 띄어쓰기
단위로 자르면 되고, (2)는 올바른 맞춤법의 단어 목록이 들어 있는 사전에
해당 단어가 들어 있는지 찾으면 됩니다. 문제는 (3)인데, "틀린 단어만 보고
맞는 단어가 무엇인지 찾는" 일을 해야 합니다. 사전에 들어 있는 수많은 단
어 중에서 맞는 단어가 과연 무엇일까요. 글 쓴 사람의 의도가 무엇인지 독심
술을 쓸 수도 없는 노릇이고, 적당한 기준을 세워서 추측하는 수밖에 없습니
다.

여러가지 기준을 세울 수 있는데요. 전통적인 방식은 "편집 거리"가 가까운
단어를 찾는 방식입니다. 편집 거리는 (edit distance) 어떤 단어 A와 B가 있
을 때, A에 몇 번의 편집행위를 (글자 삽입, 글자 삭제, 글자 바꾸기, 순서
바꾸기 등) 하면 B가 되느냐를 말합니다. (실제로는 편집동작에 따라 가중치
가 다르기도 해서 단순히 몇번이 아닙니다.) 사람 입장에서는 딱 보기에 철자
가 비슷한 단어를 찾는 기준입니다. 그래서 potatoe라고 입력하면 e를 뺀
potato를 찾아주고, commitee라고 입력하면 t를 추가한 committee를 찾아주
죠.

그렇다면 한글 단어에도 이 방식을 적용할 수 있을까요.

한글 단어는 음절 단위로 모아 쓰기 떄문에 글자 수가 상대적으로 적습니다.
그래서 음절 단위로 한 글자, 두 글자 식으로 편집 거리를 계산하다가는 비슷
하지도 않은 단어들이 편집 거리 상으로 비슷한 거리 상에 놓일 수 있습니다.
이렇게 되면 맞춤법 검사를 했을 때 비슷한 단어가 무엇인지 범위를 좁히지
못합니다. 예를 들어 "스피커" 대신 "스핔어"라고 타이핑한 사람에게 똑같이
2글자 바꾼 단어인 "스컹크", "스포츠", "스르륵"을 추천할 수도 있을 겁니
다. (물론, 음절을 갖고도 음절 사이의 가중치 정보를 갖고 편집 거리를 계산
할 수 있겠지만 이 방법은 가중치를 따질 조합이 너무 많기 때문에 너무 복잡
해 집니다.)

그래서 지금 하는 방법이 한글 음절을 내부적으로 각 자모별로 분해하는 겁니
다. 다행히도 유니코드에는 U+1100부터 시작해서 초성/중성/종성 한글 자모를
위한 코드가 있고 변환하는 규칙도 명확하니 새로운 걸 만들 필요 없이 이 코
드를 써먹으면 됩니다. 공식 명칭은 "한글 자모" 영역이고, 초성/중성/종성을
처음/가운데/끝이라고 불러서 첫가끝이라고도 합니다.

실제로 이렇게 분해해서 실험해 보면 비슷한 단어를 잘 찾아냅니다. (초성에
쓴 자음과 종성에 쓴 자음의 차이라든지, 이중받침같은 경우 분해해야 되느냐
말아야 되느냐 이슈가 있지만 큰 문제가 되지 않습니다.)

이렇게 할 때 또 좋은 점이 있는데요. AFF 파일에서 파생 단어가 만들어지는
규칙을 정의할 때 앞의 음절의 모양이 어떤지 조건을 설정하거나, 모음이나
받침을 빼고 넣고 바꾸는 등의 규칙을 간단히 정의할 수 있습니다. 현재
ko.aff 파일에도 들어 있는 조사 규칙을 보면, 마지막에 등장하는 모음 코드,
종성 코드를 이용해서 받침 있을 경우 조사와 없을 경우 조사를 구분하는 걸
볼 수 있습니다. 또 ㅂ불규칙 활용이라면 "아름답다"가 "아름다운"처럼 ㅂ이
빠지고 ㅜ 모음이 들어가는데요. 음절단위로 이런 규칙을 작성하려면 모든 ㅂ
받침 음절에 대한 케이스별로 ㅂ이 빠지는 규칙을 작성해야 겠지만 자모 코드
를 쓰는 경우 그냥 한 줄에 종성 ㅂ의 코드를 쓰면 됩니다.

자모코드를 직접 입력할 수 없어서 한글 자모로 되어 있는 파일을 딱 보기에
는 어려워 보일 지도 모르겠는데요. 어차피 우리말 활용 규칙은 텍스트 편집
기로 편집해서 관리할 수 있는 분량이 아닙니다. 제가 올려 놓은 파일도 스크
립트를 통해 생성한 파일이구요.

--
Changwoo Ryu <ryu.ch...@gmail.com>

JiHui Choi

unread,
Nov 25, 2008, 10:54:12 PM11/25/08
to spellc...@googlegroups.com
자세한 설명 감사드립니다.
나름 열심히 찾아보고 이해하려고 노력했는데, 그 노력이 헛되지 않았던 모양이네요. :)


On 11월26일, 오전1시45분, Changwoo Ryu <ryu.chang...@gmail.com> wrote:
> 자모코드를 직접 입력할 수 없어서 한글 자모로 되어 있는 파일을 딱 보기에
> 는 어려워 보일 지도 모르겠는데요. 어차피 우리말 활용 규칙은 텍스트 편집
> 기로 편집해서 관리할 수 있는 분량이 아닙니다. 제가 올려 놓은 파일도 스크
> 립트를 통해 생성한 파일이구요.
>

휴우.. 짐작은 했지만 쉽지 않은 일이 되겠네요. 여튼 하나씩 해가다보면 뭔가
되겠지요. ^^;


--
Regards,
JiHui Choi
-------------------------------------------------------------------------------------
http://Mr-Dust.pe.kr
http://GIMP.kr, http://OpenOffice.or.kr, http://Ubuntu.or.kr

Reply all
Reply to author
Forward
0 new messages