출처 : http://serahero.dothome.co.kr/entry/MFC-TIP1
출처 :
http://myhome.hanafos.com/~kukdas/index.html: 정리 잘 해놨네..감샤 (--) (__)


Visual-C의 MFC에 관한 내용.

Button

ToolBar

StatusBar

Other Control

Menu

Dialog

Splitter Window

View

Property Sheet

Title Bar

System

DLL (Dynamic Link Library)

ETC

SCJP 자격증 사진 (java programmer자격증)



전자계산기조직응용기사1급 자격증 사진



정보처리기사 2급 자격증 사진



CCNA 자격증 사진





정보통신기사 자격증 사진



'기본 카테고리' 카테고리의 다른 글

정보처리기사 2급 자격증 사진  (0) 2008.05.14
CCNA 자격증 사진  (0) 2008.05.13
번지점프를 하다!!! bungee jumping  (0) 2008.05.12
게임프로그래밍전문가자격증사진  (1) 2008.05.12
형태소 분석기  (0) 2008.05.12

번지점프를 하다 bungee jumping





'기본 카테고리' 카테고리의 다른 글

CCNA 자격증 사진  (0) 2008.05.13
정보통신기사 자격증 사진  (0) 2008.05.13
게임프로그래밍전문가자격증사진  (1) 2008.05.12
형태소 분석기  (0) 2008.05.12
한글 코드에 대하여  (0) 2008.05.12

게임프로그래밍전문가자격증사진



'기본 카테고리' 카테고리의 다른 글

정보통신기사 자격증 사진  (0) 2008.05.13
번지점프를 하다!!! bungee jumping  (0) 2008.05.12
형태소 분석기  (0) 2008.05.12
한글 코드에 대하여  (0) 2008.05.12
점프 투 파이썬  (0) 2008.05.12

형태소 분석기

1. 한국어 형태소 분석의 개요

1.1. 형태소 분석이란

형태소 분석이란 자연 언어 분석의 첫 단계로서 단어(한국어의 경우 어절)를 구성하는 각각의 형태소들을 인식하고 불규칙 활용이나 축약, 탈락 현상이 일어난 경우 원형을 복원하는 과정을 말한다(강승식 저).

1.2. 형태소의 정의

형태소란 단어(어절)을 구성하고 있는 최소한의 언어 요소라고 할 수 있다. 가장 쉽게 생각할 수 있는 것이 '명사', '대명사', '수사' 등의 체언, '형용사', '동사' 등의 '용언', '부사', '관형사', '감탄사' 등의 독립언, '조사', '어미', '선어말어미', '접사' 등의 기능어가 있다.

형태소는 실질적인 의미를 가지고 있는 실질형태소와 기능적 요소를 담당하고 있는 기능형태소로 크게 양분되며, 색인어 추출을 위한 형태소 분석시 이 둘을 분리하는 과정이 우선시 된다. 한마디로 형태소는 더 이상 별개의 의미나 기능으로 분리할 수 없는 최소한의 언어 요소라고 보면 될 듯 하다.

1.3. 한국어 형태소 분석

우리가 검색엔진 제작시 형태소 분석에 봉착할 수 밖에 없는 이유가 있다. 바로 우리가 다루는 언어가 한국어이기 때문이다.

영어를 보면 소년이라는 의미의 'boy'가 복수로 변하기 위해서는 끝에 '-s'를 첨가하면 된다. 'boys'가 바로 그것이다. 특별히 단어의 형태가 크게 변한다거나 다양한 기능어가 붙지 않는다. 그러나 한국어는 다르다.

한국어의 '소년'이라는 명사에는 '소년의', '소년은', '소년들', 소년인가요', '소년아' 등 각종 기능어 및 접사, 용언화 과정 등이 가능하다. 따라서 이러한 언어적 변화 현상을 찾아내어 최종의 형태소를 인식해야 한다. 그 규칙을 찾아내기란 쉽지 않고 이를 기계적으로 구현하는 것 역시 만만치 않다.

1.4. 형태소 분석의 필요성

그렇다면 한국어에 왜 형태소 분석이 필요할까. 바로 색인어 추출을 위해서이다. 우리가 사용하는 색인어 및 검색어는 주로 명사 위주이다. 이런 명사를 추출하기 위해서는 불행히도 각종 기능어와 타 품사, 형태 변형 등의 인식이 필요하게 된다. 물론 형태소 분석없이 별도의 색인어 추출 방법을 사용하게 된다면 관심을 가지지 않아도 되는 것은 당연하다.

검색엔진에 있어 색인 DB의 구조와 랭킹 알고리즘 역시 중요하나 가장 적합하고 확실한 색인어가 저장되어 있어야만 그 성능이 탁월할 수 있다. 한국어 텍스트를 단순히 공백(어절)으로 나눠 색인하게 되면 초라한 검색 결과를 보게 되는 이치이다.

2. 사전지식

형태소 분석을 위해서는 PHP 등 웹언어를 이용한 프로그래밍적 지식으로는 부족하다. 문자열에 대한 분석과 국문학적 지식, 그리고 자료구조에 대한 지식 등이 필요하다.

2.1. 한글 코드

한글 코드에 대해서는 어느 정도 지식이 있으리라고 여겨진다. 형태소 분석에서 한글 코드가 등장하는 이유는 한글이 초성, 중성, 종성으로 구성되어 있기 때문이다. 한글은 2byte 코드로 총 16bit로 되어 있다. 불행히도 이 16bit를 3등분 해야 하는 과정에서 한글 코드가 필요하게 된다.

PHP 언어에서 한글 코드는 완성형을 지원한다. 완성형 한글 코드는 총 2,350글자에 각자의 코드를 부여한 것이다. 따라서 하나의 음절을 초성, 중성, 종성으로 분리하기 위해서는 조합형 한글 코드로 변환하는 과정이 필수적이다. 유니코드에 대해서는 언급하지 않겠다.

문자열을 처리할 때 1byte짜리 문자는 숫자, 영문자, 제어문자이다. 2byte짜리 문자는 한글, 한자, 일본어, 특수문자를 포함한다. 한글의 경우 2byte 중 상위코드는 25개, 하위코드는 92개로 구성되어 있음을 항상 염두해 두어야 한다.

2.2. 어절의 문자열 유형

어절(단어)의 문자열 유형이란 하나의 어절이 한글, 한자, 영문자, 숫자, 특수기호 등 어느 것을 포함하고 있느냐를 가지고 분류한 것이다. 예를 들어 '색인어'라는 어절(단어)은 한글로만, 'search'라는 어절은 영문자만, 'MP3'는 영문자와 숫자, 'MP3폰'은 영문자와 숫자와 한글, '文化민족'은 한자와 한글, '우리(We)는'은 한글과 기호와 영문자로 구성되어 있다.

어절의 문자열 유형이 중요한 이유는 영문자와 숫자, 특수기호, 한자 등도 색인어로서 무시할 수 없기 때문이다. 특히 'MP3'같은 단어는 중요 색인어 및 검색어이다. 따라서 각 문자열 유형별 색인어 추출 기준을 세워야 한다.

제안하는 기준은 다음과 같다.

-> 특수문자 및 기호의 경우 : 무조건 공백으로 치환한다(C++, C#, A+, 100% 등의 단어가 문제된다)

-> 영문자와 숫자를 포함한 문자열 : 인접한 영문자와 숫자가 개별적으로 3음절 이상이 아니면 분리하지 않는다. 따라서 'MP3'의 경우 분리되지 않는다. 그러나 'BEA123'은 'BEA'와 '123'으로 분리된다.

-> 영문자 또는 숫자와 한글이 포함된 문자열 : 인접한 영문자와 한글, 또는 숫자와 한글 중 영문자와 숫자가 2음절 이상이면 한글과 분리한다. 한글 역시 2음절 이상인 경우에만 분리한다. 따라서 'LG상사'는 분리되지만 'e비즈니스'의 경우에는 분리되지 않는다.

-> 한글과 한자를 포함한 문자열 : 한자는 2byte 문자로 숫자와 영문자와는 무조건 분리한다. 또한 한글과도 무조건 분리한다.

-> 한글로만 구성된 문자열 : 별다른 분리없이 형태소 분석을 하게 된다.

2.3. 자료구조

대부분의 검색엔진은 C언어로 구성되어 있다. 그래서인지 자료를 저장하고 탐색하고, 삽입/수정/삭제에서 별도의 자료구조를 가지게 된다. PHP의 경우에도 이를 모방한 자료구조가 필요하다. 예를 들어 전자사전을 구성할 때 사전에 들어갈 각 단어를 'Tree' 구조나 'Trie' 구조로 저장하고 탐색해야 한다.

PHP에서는 다중배열의 사용이 용이하므로 다중배열을 이용하여 C언어와 유사한 자료구조를 취한다. 이에 대해서는 독창적인 알고리즘을 고안해 내야 할 것이다.

2.4. 품사의 체계

형태소 분석을 위해서는 어절에 포함된 형태소의 품사를 결정해 놓아야 한다. 크게 체언(명사, 대명사, 수사), 용언(형용사, 동사), 독립언(부사, 관형사, 감탄사), 기능어(조사, 어미, 선어말어미, 접사 등)로 나늬며, 더욱 세세하게 구분되는 경우도 있다.

2.5. 어절 전이 현상

어절 전이 현상이란 한글 어절의 형성 과정이다. 국문학적 지식이 필요하다. 예를 들어 체언 뒤에는 조사가 붙는다든지, 용언 뒤에는 어미가 붙는다든지 하는 규칙이다. 체언과 용언 뒤에 조사와 어미, 선어말어미, 접사 등의 기능어가 붙어 어절의 성격이 달라지게 되는 현상이다.

3. 형태소 분석기의 기능

형태소 분석기가 가져야 할 기능은 크게 문자열 유형의 파악 및 이에 따른 분리 과정, 전자사전의 탐색 기능, 각종 규칙 연산(체언 판단, 용언 판단, 품사 전이 판단 등), 복합명사 처리 등이다.

3.1. 문자열 유형의 파악

형태소 분석기는 우선 공백을 기준으로 텍스트를 나눠 배열에 담는다. 이를 우리는 쉽게 '어절'이라 부른다. 위에서 언급한 대로 어절의 문자열 유형을 파악한다. 그런 후 일정 기준에 따라 색인어로서의 어절을 분리한다.

한글을 포함한 어절일 경우 본격적인 형태소 분석 과정에 들어간다.

3.2. 전자사전의 구성 및 탐색 기능

형태소 분석을 위해서 국내의 상용 제품들은 크게 세가지 방식을 사용한다. 하나는 모든 형태소 어휘와 일정 규칙을 사전에 담아 놓고 이를 탐색하여 결과를 반환하는 '사전 베이스', 별도의 전자사전 없이 무수한 오토마타 등 규칙의 연산을 통해 결과를 반환하는 '규칙 베이스', 그리고 이를 적절히 조화한 '절충형'이다.

알고 있는 바로는 엠파스의 경우 철저히 '사전 베이스 형태소 분석기'를 사용한다. 이는 성신여대 심광섭 교수의 작품이다. 각종 명사 및 동사, 형용사, 기능어 등의 어휘와 각 어휘별, 음절별 규칙을 전자사전에 모두 담아 놓고 사전 탐색만으로 결과를 반환한다.

그러나 대부분의 형태소 분석기는 명사나 독립언, 동사와 형용사, 조사와 어미 등 어휘와 그 문법적 표지를 저장한 사전의 탐색과 이를 위주로 한 규칙의 연산을 통한다. 네이버의 경우가 대표적일 것이다.

그렇다면 전자사전이란 무엇인가. 전자사전이란 사람이 읽어서 이해하는 것이 아니라 기계인 컴퓨터가 이해할 수 있는 사전이다. 저장 장소의 최적화와 탐색 속도의 향상을 위한 것으로 PHP로는 다중배열을 이용한 반음절 Trie 구조가 가장 적합하다는 생각이다.

3.3. 규칙의 연산

특정 어절이 체언이라면 이는 명사, 수사, 또는 대명사와 기능어인 조사의 결합일 것이다. 만일 동사라면 어미와 동사 형태소의 결합으로 이루어져 있을 것이다. 이러한 판단을 하기 위한 특정 조건의 규칙이 필요하며, 최소한의 연산으로 속도 향상을 꾀해야 한다.

3.4. 복합명사 처리

별도의 글에서 상세히 정리해 보겠지만, 한글 명사, 특히 색인어로서 가치가 있는 명사는 주로 고유명사와 복합명사이다. 특히 고유명사 중에는 유난히 복합명사가 많다. 이를 단일명사로 하나 하나 분리해 내야만 탁월한 성능의 색인어 추출기가 될 수 있다.

95/11/12
정 주 원

한글 코드에 대하여

1. 서론

본 문서에서는 95년 11월 현재까지 제안된 한글 부호화 체계를 정리 나열하고, 국제 표준인 ISO-2022, ISO-10646과의 관계를 설명한다.

2. 한글 코드

2.1. KSC-5601

1987년 한국공업진흥청에서 국가 표준으로 정한 코드로 원래 명칭은 "KSC-5601 정보교환용 부호 (한글 및 한자)"이다. KSC-5601은 정보교환용 부호 기본 집합(완성형)과 보조 집합(조합형), 그리고 7-bit용 코드(n-byte형)를 규정한다. 이 문서에서는 기본 집합에 대해서만 언급하겠다.

KSC-5601 정보교환용 부호의 부호 영역은 0xA1A1~0xFEFE로 ISO-2022를 만족한다. 0xA1A1~0xACFE에는 부호 및 일본/러시아 글자를, 0xB0A1~0xC8FE에는 한글을, 0xCAA1~0xFDFE까지는 한자를 배치하였다. 여기서 한글은 자주 쓰이는 2232자를 골라 가나다 순으로 배치하였고, 한자 역시 그러하였다.

2232자에 포함되지 않은 한글에 대해서는 '채움'(0xa4d4)으로 시작하여 초성,중성,종성에 해당하는 글자를 배치함으로써 나타나도록 하였다. KSC-5601의 ISO-2022 지정(designate) sequence는 ESC 2/4 2/9 F로 F는 4/3 이다. (ESC $ ) C) 7bit환경일 경우 호출(invoke)은 SO로 한다.(^N)

2.2. KSC-5657

KSC-5601로는 부족한 부호, 문자, 한글, 한자등을 추가하기 위해서 제정되었다. KSC-5601과 혼용하여 쓰는 방법은 "KSC-5620 정보교환용 부호의 확장법" 즉 ISO-2022를 따른다.

KSC-5657의 ISO-2022 지정 sequence는 ESC 2/4 2/9 F로 F는 제 1 확장세트 일 경우에는 4/5 (E), 제 2 확장세트일 경우에는 4/6 (F)이다.

2.3. Microsoft의 통합형 한글

기존의 KSC-5601을 사용하면 2바이트로 표현가능한 한글의 글자수가 2350자로 제한된다. KSC-5601을 기본 코드로 한 Microsoft사의 Windows 운영체제로는 이와 같은 한글 표현의 문제가 생긴다. 따라서, 2byte로 표현할 수 있는 한글의 수를 늘리면서, 기존의 KSC-5601을 기반으로 짜여졌던 프로그램도 그대로 사용할 수 있는 방안으로서 제시한 것이 Microsoft사의 통합형 한글 코드(초기에는 확장 완성형이란 이름으로 발표했음)이다.

그림 1에서 보다시피 확장완성형은 기존의 KSC-5601 코드영역을 그대로 두고 0x8141~0xC6FE에 해당하는 부분 중 KSC-5601에 포함되지 않는 부분에 KSC-5601로는 두 바이트로 표시할 수 없는 한글 문자들을 가나다순으로 배치하였다.


그림 1. Microsoft 통합형 한글의 부호 영역

이것은 어떤 표준 규정과도 연관이 없다는 것이 특징으로, Microsoft사 자체내에서 임시적으로 사용하기 위해 제정된 것으로 알려져 있다. 현재 한글 Windows 95와 한글 Windows NT의 한글 코드로 제공되고 있다.

2.4. 첫가끝 코드

동국대의 변정용 교수는 '정음형', 부산대의 김경석 교수는 '첫가끝'이라고 부르는 이 코드는, 옛 한글과 현대 한글에서 나타날 수 있는 한글의 초성, 중성, 종성의 자모 요소를 한 글자(Unicode BMP의 경우 2 바이트)로 나타내도록 부호화 하고, 이 자모들을 초성(첫소리), 중성(가운뎃 소리), 종성(끝소리)의 순서대로 한글을 표현하는 방식이다.

초성, 중성, 종성의 자모를 부호화 했으므로 'ㄺㅅ'이나 'ㅠㅣ'과 같은 글자를 한 글자(자모)로 한다. 이 이외에 '초성 fill'과 '중성 fill'의 두 글자가 추가되어 초성없는 중성과 받침 등의 글자등도 표현할 수 있다. 받침이 없을 경우 종성은 나타내지 않으므로 '종성fill'은 필요없다.

이것은 ISO/IEC-10646:1993에 채택되어 24. Hangul syllable composition method라느 이름으로 포함되었다.

2.5. 유니코드 한글

이것은 Unicode 2.0에서 추가된 한글표현 방법으로, 조합될 수 있는 현대 한글 글자 모두를 가나다 순으로 정렬, 배치한 것이다. 현대 한글이 사용하 는 자모는 초성 19자, 중성 21자, 종성 27자로, 조합 가능한 글자의 수는 19 x 21 x 28 (종성없음 포함) = 11172자 이다.

이 코드의 조합 방법을 그림 2에 나타내었다.


그림 2. Unicode V2.0에 포함된 한글의 부호영역

3. 국제 표준과의 관계

3.1. ISO-2022와의 관계

KSC-5601과 KSC-5657은 ISO-2022한경에서 사용할 수 있다. 다른 부호체계에 서 KSC-5601부호체계를 사용하려면 "ESC $ ) C"의 4자의 지정문자열을 보내고 사용하면 되며, KSC-5657의 제 1 확장세트는 "ESC $ ) E", 제 2 확장세트는 "ESC $ ) F"의 지정문자열을 보낸 후 사용하면 된다.

3.2. ISO-10646과의 관계

ISO/IEC-10646:1993에는 KSC-5601, 5657에서 사용하던 부호, 한글, 한자등을 모두 포함되어 있다. 또한 첫가끝 한글방식이 추가되어 있다. KSC-5601에서 사용하던 부호와 문자는 BMP의 부호와 문자 부분에 포함되었으며, 한자 부분도 한중일 통합 한자 부분인 "CJK Unified Ideographs" (0x4E00~0x9EFF)에 포함되었다. 한글 부분은 0x3400부터 KSC-5601의 순서 그대로 배치되었다.

KSC-5636의 한글 부분은 KSC-5601 한글 부분의 배치가 끝나는 0x3D2E부터 순서대로 배치되었다. KSC-5636 한글의 배치가 끝나는 0x44B8부터는 앞의 두 한글 부분에 포함되지 않으면서 비교적 빈번히 사용되는 한글을 0x4DFF 까지 배치하였다.

첫가끝 한글의 요소인 한글 자모는 "Hangul Jamo"(0x1100~0x11FF)에 배치되 었으며, 그 조합 원리는 제 24 장에 설명되었다.

첫가끝 한글의 자모와는 다른 KSC-5601의 한글 자모문자 (0xA4A1~0xA4FF in KSC-5601)는 "Hangul Compatibility Jamo" (0x31 row)에 배치되었다.

Creative Commons License
[MFC/인터페이스] 버튼의 동적 생성과 메시지를 처리하는 방법..
[질문 내용]

mfc위자드로 CView로 상속받은 (SDI)프로젝트를 생성했습니다.

그리고 뷰에 1행에 동적으로 버튼을 행맞춰서 만들고 싶은데, 아무리 생각해도 모르겠군요.
동적으로 말입니다. 4개든 10개든.... 그리고 각 버튼을 눌렀을때 메시지박스가 나와 "현재버튼은
1입니다." 같이 나왔으면 합니다. 다시말해 이벤트 핸들러도 동적으로 만들어야 합니다.

너무나 어려워 질문드립니다.

[답변 내용]

안녕하세요~!

먼저 동적으로 버튼을 5개 생성시킨다고 가정하고 해더파일에

#define MAX_BUTTON_COUNT 5

라고 먼저 정의하고, 버튼을 동적으로 만들어서 사용해야하니까 동적으로
생성된 버튼을 관리할 변수를 선언해야겠죠? 클래스 선언부에 말이죠!!

private:
CButton *mp_test_button[MAX_BUTTON_COUNT];

라고 추가하신후에, 먼저 1행이 의미하는게 정확하게 먼지 모르겠지만
가로방향으로 같이 위치하는 거라고 가정하고 먼저 생성시키는것을 살펴보면
다음과 같습니다. WM_CREATE를 핸들러로 등록하고 다음과 같이 코드를
추가하면 됩니다.

int CViewbuttonView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CView::OnCreate(lpCreateStruct) == -1) return -1;

CString str;
for(int i = 0; i < MAX_BUTTON_COUNT; i++){
str.Format("Test %d", i + 1);
mp_test_button[i] = new CButton();
mp_test_button[i]->Create(str, WS_CHILD | WS_VISIBLE |
BS_PUSHBUTTON, CRect(10 + i*100, 10, 100 + i*100, 36),
this, 25000 + i);
}
return 0;
}

이렇게 하면 버튼이 생성될겁니다. 한줄로 주루룩~~ ^^; 각 버튼을 구별하는
아이디는 25000, 25001, 25002, 25003, 25004로 정해집니다. 각 버튼을
누르면 이 번호에 해당하는 메시지가 WM_COMMAND 메시지와 함게 발생합니다.
물론 버튼의 ID는 wParam 메시지에 들어가구요...

그럼 버튼을 눌렀을때 메시지를 처리할 방법을 생각해보죠~ CView를 클래스
위저드로 보면 OnCommand라는 메소드를 추가할수 있습니다. 그곳에서
동적으로 메시지를 처리할수 있습니다. 다음을 보시죠~ ^^;

BOOL CViewbuttonView::OnCommand(WPARAM wParam, LPARAM lParam)
{
if(wParam >= 25000 && wParam < 25000 + MAX_BUTTON_COUNT){
CString str;
str.Format("저는 %d번 버튼임다.~~ ^^;", wParam - 25000 + 1);
AfxMessageBox(str);
}

return CView::OnCommand(wParam, lParam);
}

버튼에 의해서 발생하는 메시지는 25000~25004 사이의 값을테고 발생한
메시지에 25000을 빼면 각 버튼의 값이 정해지죠~ 0~4로, 하지만 화면에는
1~5로 변경해서 출력해야 하기때문에 1을 더해주면 됩니다. ^^;

자~ 이제는 동적으로 생성된 버튼을 삭제해야겠죠~! WM_DESTROY 메시지
핸들러에서 처리하면 됨다. 아래를 보세요~

void CViewbuttonView::OnDestroy()
{
for(int i = 0; i < MAX_BUTTON_COUNT; i++){
delete mp_test_button[i];
}

CView::OnDestroy();
}

동적으로 만들어진 객체를 다 파괴하면 됨다. ^^; 어렵지 않죠?
소스에 대한 질문이 넘 간단한가요? 이해가 안되면 다시 질문하세요~

이 답변이 님에게 도움이 되었으면 합니다. ^^;
프로그램 열심히 하세요~!

'기본 카테고리' 카테고리의 다른 글

한글 코드에 대하여  (0) 2008.05.12
점프 투 파이썬  (0) 2008.05.12
Python Spider, Web Crawler, Bot Examples  (0) 2008.05.07
PIC의 활용  (0) 2008.05.04
취미 전자공작 사이트 hobby elecronics (japan)  (0) 2008.05.04

+ Recent posts