«   2010/02   »
  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            
전체 (90)
Intro (5)
밥(2인용) (1)
소풍 (0)
릴레이소설 (3)
Book (21)
Blog (4)
Developer (3)
DB (3)
C++ (7)
Flex (2)
Html (4)
Java (16)
Javascript (13)
Others (5)
Total 31,740, 어제 153, 오늘 6
2010/01/21 15:14
작성하기 빡시다
천지인좀...



iPhone 에서 작성된 글입니다.

'Others' 카테고리의 다른 글

I-phone으로 블로깅그~  (0) 2010/01/21
IP 주소 변경하기  (0) 2009/11/18
Mobilink UltraLite  (0) 2009/07/14
Telnet으로 html 소스 보기  (0) 2009/06/25
VoiceXML이 뭐야?  (0) 2009/06/24
Trackback Address :: http://codepedia.tistory.com/trackback/91 관련글 쓰기
Name
Password
Homepage
Secret
2009/12/28 20:41
[C++]
한글 오토마타에 대하여...
PDA의 키보드를 만들어야 할 상황이 있어서 제작을 해보았다.



UI는 따로 처리된 DLL에서 호출하여 사용하는 방식이고 키 코드를 넘겨 받아서 한글 조합을 하고 있다.
이번에 제작한 오토마타는 유니코드(0xac00 ~ 0xd7a3 범위)내의 한글코드를 처리하고 있다.
때문에 표현 불가능한 글자가 몇개 있는 것 같다.
아니 정확하게 표현 불가능한 코드가 있다.

하지만 입력 방식이 키보드가 아닌 키 코드의 입력 방식이기 때문에 문제는 되지 않았다. 또한 PDA는 유니코드를 사용하니 일단 사용자 범주안에서는 OK 이다.!!
문제는 키보드 입력방식에 적용이 어렵다.
이부분은 보완하여 수정해봐야 겠다.
Define 한 키 코드의 입력이 아닌 char 값을 입력 받을 수 있도록 추가로 처리를 해야 할 것 같다.

소스를 올리기 전에 간단한 한글 오토마타 와 한글 형태소 분리에 대한 설명을 해야 할 것 같다.

※ 본문 내용의 오토마타 구현 과정은 핸드폰과 같이 키의 조합이 키보드와는 다른 모형을 기준으로 하고 있다. 기본 원리를 파악하면 키의 배열이나 키의 숫자가 달라진다고 하여 문제가 될 것은 없는 것 같다.


한글 형태소 분리
{
   간단하게 설명하고 끝내려 한다.자세하게 설명 되어있는 사이트는 찾아보니 생각보다 많이 있었다.
   그리고 내가 그 사이트 보다 자세하게 설명할 자신도 없다.
}

한글코드의 기본개념: http://paero3.myzip.co.kr/hangeul_code/index.html 찾아가서 보면 너무너무 설명을 잘 하고 있다.
원문의 내용을 필요한 부분만 간단 요약 하면 이렇다.

윈도우의 한글코드 : Microsoft의 통합형 한글(확장 완성형 코드:2350자)
확장 완성형 코드 = (기존 완성형 코드 영역 0xB0A1~0xC8FE) + (0x8141~0xC6FE 부분에 한글을 추가)

완성형 코드

 정의:
완성형 방식은, 완성된 글자를 일종의 그림처럼 다루는 방식이다. 따라서 그 발상의 밑바탕에서 바라봤을 때는, 한자 같은 상형문자를 다루는 방식과 근본적으로 아무 차이점이 없다. 그리고 그게 '가나다' 순서를 지키려면, 이미 글자 체계 또한 완성되었다고 본 후 코드를 배열해야 한다. 유니코드 2.0의한글 배열은, 현대 한글에서 조합 가능한 숫자 '11,172'자를 쭉 순서대로 배열해 놓았다. 즉 '2바이트 완성형' 방식이다.

 크기: 2바이트

 자주 쓰이는 한글 2350자를 골라 가나다 순으로 배치
 0xB0A1~0xC8FE: 차례대로 코드 부여
  상위 바이트 0xB0 ~ 0xC8
  하위 바이트 0xA1~ 0xFE

조합형 코드

 정의:
조합형 방식은, 한글 글자의 구성 원리인 초성-중성-종성의 세 갈래 음운을 코드 자료로 삼아 설계된다. 따라서 여기에서는 완성된 글자에 초점이 있는 게 아니라, 각 음운들에 초점이 놓인다.

 크기: 2바이트

상위 1비트: 아스키 코드와 구분하기 위해 사용
다음 5비트: 초성
다음 5비트: 중성
다음 5비트: 종성


핵심은?...

첫번째 논점은 한글글자를 초성 + 중성 + 종성 으로 분리해 내는 것이다. 그리고 반대로 한글자모(자음,모음)가 입력될 때 이미 입력되어 있던 한글자모와 조합하여 완성시키는 것이다.

조합 완성된 글자 와 한글자모 사이에는 다음과 같은 수식이 적용된다.

초성(19자)
– ㄱ(0) ㄲ(1) ㄴ(2) ㄷ(3) ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ(15) ㅌ(16) ㅍ(17) ㅎ(18)

중성(21자)
– ㅏ(0) ㅐ(1) ㅑ(2) ㅒ(3) ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ(17) ㅡ(18) ㅢ(19) ㅣ(20)

종성(28자)
– 없음(0) ㄱ(1) ㄲ(2) ㄳ ㄴ ㄵ ㄶ ㄷ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅄ ㅅ ㅆ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ(26) ㅎ(27)

표현범위 : 가(0xAC00) ~ 힣(D7A3)

한글글자 = 초성 * 21 * 28 + (중성 - 19) * 28 + (종성 - 40) + [각주:1]BASE_CODE(한글코드 테이블의 첫번째 문자코드)

예) 강 = ㄱ + ㅏ + ㅇ 
         = 0 * 21 * 28 + (19 - 19) * 28 + (61 - 40) + 0xAC00 = 0xAC00(44032) + 21
         = 44053
         = 0xAC15

두번째 임의로 입력되어지는 한글자모를 받아서 이전에 입력되어진 한글자모와 한글조합이 이루어 지는지의 판단과 처리 및 이후 프로세스의 정립에 있다.

위에 보여지는 키패드의 그림상 아파트를 입력하려면 다음과 같은 순서에 의해 입력이 되어진다.

아파트 = ㅇ + ㅏ + ㅂ + ㅂ + ㅏ + ㄷ + ㄷ + ㅣ + ㅣ (ㅇ) <- 초성
          = 아 + ㅂ + ㅂ + ㅏ + ㄷ + ㄷ + ㅣ + ㅣ (ㅏ) <- 조합 초성 + 중성
          = 압 + ㅂ + ㅏ + ㄷ + ㄷ + ㅣ + ㅣ (ㅂ) <- 조합 초성 + 중성 + 종성
          = 앞 + ㅏ + ㄷ + ㄷ + ㅣ + ㅣ (ㅂ) <- 종성 합성
          = 아파 + ㄷ + ㄷ + ㅣ + ㅣ (ㅏ) <- 완성문자 분해,조합 초성 + 중성
          = 아팓 + ㄷ + ㅣ + ㅣ (ㄷ) <- 조합 초성 + 중성 + 종성
          = 아팥 + ㅣ + ㅣ (ㄷ) <- 종성 합성
          = 아파티 + ㅣ (ㅣ) <- 완성문자 분해, 초성 + 중성
          = 아파트 (ㅣ) <- 중성 합성

(아파트 세글자를 찍기 위해 그렇게도 강대리는 날을 깟다 -_ㅠ)

세번째 키의 배열과 조합의 순서도 중요하다. 위의 키패드 배열을 보면 ㅂ, ㅍ 이 한쌍을 이루고 ㄱ,ㅋ 이 한쌍을 이룬다. 이것은 우리가 기존에 사용해온 핸드폰의 영향도 있을 것이다. 그런데 왜 ㅡ, ㅣ는 순서가 바뀌어 있을까?...
간단한 예로 '애벌레'를 들어보겠다.
애벌레 = ㅇ + ㅏ + ㅣ + ㅂ + ㅓ + ㄹ + ㄹ + ㅓ + ㅣ
          = 아 + ㅣ + ㅂ + ㅓ + ㄹ + ㄹ + ㅓ + ㅣ
          = 애 + ㅂ + ㅓ + ㄹ + ㄹ + ㅓ + ㅣ
          = 앱 + ㅓ + ㄹ + ㄹ + ㅓ + ㅣ
          = 애버 + ㄹ + ㄹ + ㅓ + ㅣ
          = 애벌 + ㄹ + ㅓ + ㅣ
          = 애벌러 + ㅣ
          = 애벌레

입력된 순서와 키의 입력을 보면 알겠지만 'l' 라는 음소는 조합에 많이 사용되는 문자이다. 때문에 키입력의 최초 입력에서 나와야 입력이 편하다. 만약 ㅡ 를 두번 입력해야 ㅣ 로 변경이 가능하다면 문자 하나를 찍는 것이 보통 힘든일이 아닐 것이다...
(키패드 중에 에니콜에 들어있는 키패드 배열(천지인인가...)이 가장 좋은 것 같다. LG, 모토로라,에버,에니콜 모든 핸드폰을 사용해 보았지만 그중에서도 모토로라는 정말 최악이다. 키의 배열이 한손으로 문자를 만들기가 너무 힘들다. PDA에 모아키라는 것이 있다...난 정말... 왜만들었지??)


소스코드

초기모델


초기 제작한 모델은 아파트를 쓰기위해서 항상 띄어쓰기를 입력하여 문자입력을 종료시켜야 되었다.
때문에 이런 문제들을 확인 후 몇가지를 수정하여 소스를 다듬었다. 초성, 중성, 종성 합성 테이블을 두어 테이블 내에서 변환을 조절하였다.

다음에 오는 소스코드는 나름 정리를 한다고 한 모습임에도 정리가 않되고 있다.
포스팅을 하면서 이것저것 웹서핑을 통하여 찾아보았다. 다행이도 어느정도는 오토마타라는 표현에 구색을 맞추지 않았나 생각이 든다. 갱장이 복잡하게 처리하고 있는 어떤 소스를 웹서핑 중에 확인하였지만 중요한 골격이 되는 알고리즘(? 그냥 단순한 프로세스 정도인가....)은 크게 다르지 않은가 라고 생각이 된다. 누군가 고수님이 이 포스팅을 확인하고 지적해 준다면 정말 감사하겠다. 어찌되었든 잘 돌아가고 있는 모습을 볼때에는 참 뿌듯할 뿐이다. 이 프로세스 유도하기 위해 빽보드에 ㄱ,ㄴ,ㄷ을 무수히 써보기만 했다. ㅋㅋ

빽보드에 삽질한 흔적 이후 많은 변형이 있었지만 골격을 잡기 위한 과정에서 중요한 정보랄까

AutomataKR.h

AutomataKR.cpp
코드가 길어지면 집중력이 떨어진다는 것을 다시 한번 느낌니다.
keenam님께서 덧글로 지적해 주신 부분을 수정하였습니다.
정말 감사합니다.
최근 학습의 열의가 많이 떨어져 있습니다. 어쩌면 좋을까요 ^^;;
관심 가져주시는 분들께 감사를 드립니다. 꾸벅

keenam 님이 다시 지적해주신 부분이 있었습니다.  (;ㅁ;) 눈물이 앞을 가립니다. 아~
종성이 곁자음이 아닐경우 지우기 키를 입력하였을때 무조건 종성을 삭제하는 부분을 수정하여 반영하였습니다. 그리고 변수명 및 Function 명을 좀더 의미 있는 단어로 수정 처리하였습니다.




히스토리)
2009.01.
 - 초본 완성
2009.05.
 - 버그 수정 후 블로그 등록
2009.09.30
 - 모음합성시 발생하는 버그 < keenam님 제보
2009.11.11.
 - 종성이 곁자음이 아닐 경우 지우기 키를 입력시 종성이 삭제되는 문제 < keenam님 제보
 - 변수명 과 함수명 정리, 코딩 스타일(띄어쓰기, 내려쓰기, 주석) 정리
2009.12.28.
 - 광고좀 넣어봤습니다. (굽신굽신)

블로그에 올리기 까지의 히스토리는 정확하게 기억이 나지 않습니다.
이렇게까지 관심이 높아질줄 몰랐습니다.
그리고 이렇게 보완이 될지 몰랐습니다.
앞으로는 히스토리 관리를 해줘야 할것 같습니다.
  1. 유니코드(0xac00 ~ 0xd7a3 범위)에서 첫번째 한글코드 '가'는 0xAC00 이다. 따라서 BASE_CODE는 0xAC00 이다. [본문으로]
저작자 표시
Trackback Address :: http://codepedia.tistory.com/trackback/42 관련글 쓰기
Tracked from whitekid's me2DAY | 2010/01/25 15:57 | DEL
한글 오토마타 만들기::개발자 강대리
| 2009/08/19 13:55 | PERMALINK | EDIT/DEL | REPLY
비밀댓글 입니다
BlogIcon 인형오리 | 2009/07/31 17:11 | PERMALINK | EDIT/DEL
먼저 어리석은 질문이 절대 아닙니다.
저도 대학교에서는 그런 부분에 대한 것을 배운적이 없으니 말입니다. 이론이란 것이 중요하기는 하지만 실체가 없는 이론을 배우는 대학의 수업이 좀 그르치요. 마치 준비되어 있는 자들의 준비되어 있는 놀이 같은 느낌... 제가 개발 경력이 짧아 표현이 어렵기는 하지만 연결하여 구현하는 과정을 다음 포스트로 남기도록 하겠습니다. ^^ 좀더 많은 정보를 원하시면 메신저로 연락 주세요. 직장에서 생각보다 한가하지 않네요 ^^
xangfi@nate.com
박준석 | 2009/09/02 16:17 | PERMALINK | EDIT/DEL | REPLY
본 소스를 제가 임의대로 사용해도 되려는 지요.
미리감사드립니다.
foombar@gmail.com
BlogIcon 인형오리 | 2009/09/03 18:14 | PERMALINK | EDIT/DEL
네 사용해도 됩니다. ^^

사용하시고 문제가 발견된 부분을 지적해주시면 더욱 감사하겠습니다. ㅎㅎ 머쓱
버그도 많이 있을 것이고 불편한 점도 많이 있는 소스입니다. 버그 조심하세요 ^^;....
(사실 버그는 거의 다 잡혀 있습니다. 하지만 사용 자체가 오토마타라고 하기에는 좀 부끄럽기는 합니다. 강남 고속버스 터미널에 있는 서점에 가니 오토마타 책이 한권 있던데 한번 구입해서 속을 드려다 봐야 할 것 같습니다. ㅎㅎ; 이렇게 많은 분들이 (4명.. 컥) 관심을 갖고 소스를 봐 주시니 좀더 욕심이 나는 것은 어쩔수 없군요)

마지막으로 추천이나 한번 날려주신다면야 저는 감사하죠 ㅎㅎ
zhox | 2009/09/21 16:28 | PERMALINK | EDIT/DEL | REPLY
감사합니다
학기 수업중 형식언어와 오토마타 이론에 대해 공부하던 중, 한글 오토마타에 대해 관심을 갖게 되었고
관련된 글을 검색하다 정말 좋은글을 읽고 갑니다
^^
BlogIcon 인형오리 | 2009/09/25 11:18 | PERMALINK | EDIT/DEL
도움이 되었다니 다행입니다.^^
많이 부족한 것이 사실이고 개량이 더욱 필요한 소스입니다. 꾸벅
학교생활 열심히 하시는 것 같습니다. (학교때 저는 마냥 놀기만 해서 ㅎㅎ 부끄럽네요) 사회에 나와보니 결국 학교생활이 밑거름 이더군요 하하하... d:D
BlogIcon 음냐나리 | 2009/09/25 10:27 | PERMALINK | EDIT/DEL | REPLY
소스 감사합니다. 많은 도움이 되었습니다.
혹시 저작권 문제가 된다면 말씀해 주십시오.
ucanjave@naver.com
BlogIcon 인형오리 | 2009/09/25 11:22 | PERMALINK | EDIT/DEL
아닙니다. 저작권 문제 없을 것 같습니다.
제가 저작권을 등록한 적도 없고 말입니다.
한가지 걱정이 조금 되는 것이 키패드의 형태입니다.
제가 제작한 키패드의 문자 배치 형식이 기존에 있는 것들과는 많이 차이가 있지만 이 입력방식에서 오는 유사성에 의해 저작권이나 특허권 같은 것이 걸리지 않을까 조금 걱정 스럽지 않을수 없네요 하하.

프로그램 부분의 처리방식은 서점에서 찾아보니 유사한 방식으로 많이 나와있는 것 같습니다. 뭐 때문에 약간의 자신감이 생기기는 했지만 사람 생각이라는 것이 다 똑같구나 라는 생각도 하면서... 하하

어째든 별문제가 되지 않을 것 같은 느낌입니다.
생각에는 말입니다.
keenam | 2009/09/29 18:21 | PERMALINK | EDIT/DEL | REPLY
좋은 소스 감사합니다. 혹시 420, 421 줄이 바뀐 것 아닌지요? 'ㅗ + ㅗ + ㅜ'를 하면 'ㅛㅜ'가 되어야 할 텐데 'ㅜㅜ'가 됩니다.

420. Words[0] = keyCode;
421. completeWord = SOUND_TABLE[Words[0]];
BlogIcon 인형오리 | 2009/09/30 11:39 | PERMALINK | EDIT/DEL
엇! 십년만의 버그를!!!(^^;;;
감사합니다.
모르고 있었습니다.
keenam님 말씀대로 코딩을 잘못 한것 같습니다.
확인하여 문제 부분을 수정하도록 하겠습니다.
정말 감사합니다. >_<b
님 최곱 니다.
BlogIcon kimyongmin | 2009/09/30 19:37 | PERMALINK | EDIT/DEL | REPLY
흠... 정말 심오한 그런... 프로그래밍이네여...
BlogIcon 인형오리 | 2009/10/06 11:09 | PERMALINK | EDIT/DEL
네 저두 이곳저곳 찾아보고 해서 많은 버그를 만들어 낸 후에야 어느정도 처리가 된것 같습니다.

아직도 많이 부족합니다. ㅎㅎ
keenam | 2009/11/10 12:06 | PERMALINK | EDIT/DEL | REPLY
IngStatusDownGrade 함수에서 종성 자소단위 지우기를 추가했습니다. 제가 C++언어는 몰라서... actionscript입니다. 좋은 소스 공개해주셔서 감사드립니다.
Words[1] = iMiddleWord + 19; //중성저장

var jl = DIVIDE_JONG_CONSON.length;
for (var i = 0; i < jl; i++) {
if (iLastWord + 40 == DIVIDE_JONG_CONSON[i][2]) {
ingWord = CombineHangle(3);
Words[2] = DIVIDE_JONG_CONSON[i][0];
return HS_END_EXCEPTION;
}
}
ingWord = CombineHangle(1);
return HS_MIDDLE_STATE;
BlogIcon 인형오리 | 2009/11/11 17:20 | PERMALINK | EDIT/DEL
감사합니다.
미처 생각을 못하고 있는 부분이였습니다.
이번에 keenam 님이 말씀해주신 내용을 반영함과 동시에 몇가지 소스 정리를 진행하여 다시 작성을 해야 겠습니다. ^^

정말 감사합니다. 꾸꾸벅
Exorcismuns | 2009/11/25 20:40 | PERMALINK | EDIT/DEL | REPLY
와 멋지시네요

제가 캡톤디자인 공학설계를 하고있는데 음성인식 레시피북을 만들고있거든요

괜찮으시다면

터치스크린에 이 코드 따가도 될까요??


l__ldown@hanmail.net

답변 부탁드릴게요~
BlogIcon 인형오리 | 2009/11/26 12:15 | PERMALINK | EDIT/DEL
감사합니다.
소스 내용을 사용하셔도 됩니다.
^^
BlogIcon 정맥 | 2009/12/01 21:28 | PERMALINK | EDIT/DEL | REPLY
인터넷에서 검색하고 들려서 이론적으로 많은 도움 받았습니다.

그런데 혹시 위 소스 말고 테스트 프로그램 소스까지 요청드려도 되는지 문의드립니다.

리모콘 버튼 테스트 프로그램을 만드려고 하는데 실제로 이 코드를 참고로 해서 적용하려니 어떻게 해야 될지 감이 잘 안잡히네요.

ummk@hitel.net

연락 부탁드릴께요. 그럼 수고하세요.
BlogIcon 인형오리 | 2009/12/02 10:40 | PERMALINK | EDIT/DEL
위에도 다른 분께서 소스를 원하셨는데요. TEST 소스가 중간 개발단계 이후 업그레이드를 하지 않아서 어마어마한 차이가 있습니다.

실력없는 개발자와 훌륭한 개발자의 차이를 느낌니다.
-_ㅠ 갠적으로 아시는 위대하신 분은 정리되어 있는 TEST 소스만 테라급으로 가지고 계시니까요....

저는 아직 메가단위도 되지 않는 쿨럭 -ㅠ-

어째든 TEST 소스도 타인에게 공개를 할수 있는 수준의 정도가 못되어서 정리가 되면 블로그에 올리도록 하겠습니다. 추후 오토마타 2탄을 준비해보도록 하겠습니다. 그때 연락을 드리겠습니다. 죄송합니다.
엔비 | 2010/01/22 12:02 | PERMALINK | EDIT/DEL | REPLY
안녕하세요 ;) 오토마타를 공부하는 대학생입니다.
혼자 관심이 생겨서 알아보고 있는데요 ^^
지금 소스에서 위에 한글 키를 입력하면 나오는
함수 불러오는 순서가 어떻게 되는지 알고 싶습니다.

키를 누르면 int 값을 SetKeyCode 함수를 호출해서 시작되는건가요?

제가 영어 를 입력하면 한글로 변환되는 프로그램을
제작 하려고 하는데요 ^^;;

ex) dpsql -> 엔비
로 변환 되는 프로그램입니다.

영어 를 받아서 "ㅇㅔㄴㅂㅣ" 로 바꾸는건
만들긴 했는데요. 이제 여기서 어떻게 해야할지
감이 안잡힙니다 ;)

답변 부탁드립니다 ;) 감사합니다.. 최고이십니다 ;)
BlogIcon 인형오리 | 2010/01/25 21:06 | PERMALINK | EDIT/DEL
감사합니다. (__)(--)

먼저 Class 내에서 조합과 완성된 문자열을 관리하고 있습니다.

대단하지는 않지만 필요한 Function은 따로 public으로 분리하여 구분하고 있습니다.

함수 wchar_t SetKeyCode(int nKeyCode); 를 호출하여 연속해서 한글코드를 입력해주시면 한글 조합이 가능합니다.

SetKeyCode() 함수를 순서대로 따라가시면 다른 부분의 처리 프로세스를 확인 가능하십니다.

그리고 완성된 문자는 complateText; 를 통하여 확인이 가능하시고 아직 완성전의 문자는 ingWord를 통하여 확인이 가능합니다.

결론적으로 complateText + ingWord를 해주시면 현재 입력되어 완성되어있는 문자를 얻을수 있습니다.
Name
Password
Homepage
Secret
prev"" #1 #2 #3 #4 #5 ... #45 next