Ruby 프로그래밍 5 한글 자소 처리

Similar documents
Microsoft PowerPoint - kandroid_for_HI-CNU.ppt

Ruby 프로그래밍 한글 로마자화

방송통신표준 KCS.KO 제정일 : 2011 년 6 월 27 일 전화기한글문자자판배열 (Arrangement of Korean Character(Hangeul) on Telephones) 방송통신위원회

컴퓨터에서텍스트를표현하는방식및문자코드 1. bit 와 byte 컴퓨터속에서모든데이터와명령은 2진수로표상된다. 컴퓨터의저장장치 ( 하드디스크, 플로피디스크, RAM) 에기록 ( 저장 ) 될수있는것은 2진수뿐이며, CPU도 2진수의연산만을사용한다. 0 또는 1( 즉 on

국어1권표지

The Korean Alphabet:

Vowel ㅏ [a] ㅜ [u] ㅑ [ja] ㅠ [ju] ㅓ [ ] ㅡ [i] ㅕ [j ] ㅣ [i] ㅗ [o] ㅐ [æ] ㅛ [jo] ㅒ [jæ] ㅔ [e] ㅞ [we] ㅖ [je] ㅟ [wi] ㅘ [wa] ㅢ [ij] ㅝ [w ] ㅚ [we] ㅙ [wæ] Begin


zb 8) 자음을 zb 9) zb 10) 다음 zb 11) zb 12) zb 13) zb 14) ( 2013 년 1 학기기말고사대비 4-2. 우리말의음운체계 (01)_ 비상 ( 김 )1 2 혀의높낮이 행복했던나 3 혀의최고점의위치 4 발음할때장애의유무 5 발음할때입술의

기철 : 혜영 : 기철 : 혜영 : ㄴ ㅁ ㅇ ㄴ ㅁ ㅇ ㅇ ㄴ ㅁ ㅇ

Ruby 프로그래밍 3

1수준

<3828BFACB1B829BEE7BFD5BCBA2D D E687770>

Microsoft Word - KSR2012A179.doc

PowerPoint Presentation

S U M M A C U M L A U D E J U N I O R 중학국어문법연습을소개합니다. 2 문법을벌써공부해야하는가? 국어의문법은변하지않고, 정해져있습니다. 따라서중학교시기에배우는문법개념들이고등학교시기에배우는개념들과이어지고, 이는수능

PowerPoint Presentation

2 음절끝소리규칙 1. 음절끝소리규칙 ( 외우기 - 가느다란물방울 ) - 음절의끝소리 ( 받침 ) 가발음될때 ( ㄱ ),( ㄴ ),( ㄷ ),( ㄹ ),( ㅁ ),( ㅂ ),( ㅇ ) 7자음만으로발음되는것. 그이외의받침은모두이 7 자음중하나로바뀌어발음된다. 예 ) 영어

17장 클래스와 메소드

Week5

ETRI-0739.hwp

adfasdfasfdasfasfadf

<C3BBB0A2BEF0BEEEC0E7C8B0C7D0C8B85F30332E535FC0DAC0BDC1F6B0A2B0CBBBE728B1E8C1F8BCF7292E687770>


<4D F736F F F696E74202D20C0C7BFB9B0FAC1A4BAB8BDC3BDBAC5DB>

슬라이드 1

State of New South Wales, Department of Education and Communities, /49

PowerPoint Presentation

Booklet Design: Maia Kennedy Second Edition and Recorded Program 2016 Simon & Schuster, Inc. Reading Booklet 2016 Simon & Schuster, Inc. Pimsleur is a

Module 1 PAGE Lesson 1 Sound & Script 1 Lesson 2 Greeting & Introduction 75 Lesson 3 Describe Your Surroundings 145 Lesson 4 The Family 212 Lesson 5 P

피동 ( 被動 (1 피동과능동 - 피동 : 남의행동을입어서당하는동작을나타냄. 도둑이경찰에게잡히었다. - 능동 : 제힘으로행하는동작을나타냄. 경찰이도둑을잡았다. (2 피동문되기 1 파생적피동 (-이-, -히-, -리-, -기- - 타동사어근 + 접사 ( 능동문주어 부사어

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

쉽게 풀어쓴 C 프로그래밍

2 / 27 목차 A MQ-1000 키패드 (RiVO k) B 키패드 기본 설명 및 버튼 이름 C iphone 설정 (VoiceOver, 언어, 키보드) D Bluetooth 페어링 E Bluetooth 연결 F iphone 설정 (빠른 탐색 상태) G 입력언어 동기화

NEGRO - HANGUGO 01 - O Alfabeto Coreano.pub

<694D424320B5B6C7D0C7D0C0A7C1A62031B4DCB0E820B1B9BEEE E687770>

PowerPoint Presentation

<B4DCB1E2B1B3C0E72031B1C75FBED5BAD9C0CC2E696E6464>

**V PDF..

Design Issues

REP - VULGAR - 001, MARCH 비속어를표현하면단순한필터링기능으로는제재가불가능하다. 이러한비속어는사용하기불편하 다는단점이있으나최근에는필터링되지않는변형된형태의욕을매크로에저장해서온라인분쟁시 사용하는경우도있다. 그림 1. 모인기게임의채팅장면. 인터

Transkriptionstabelle für das Han'gŭl-Alphabet nach McCune-Reischauer:

JAVA PROGRAMMING 실습 08.다형성

<B4D9B9AEC8AD5FB1B3C0E75FBFCFBCBABABB28C1BEC7D5292E687770>

11장 포인터

슬라이드 1

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

< D333731C3BBB4C9C0E7C8B B1C734C8A3292D3131BFF936C0CF2E687770>

TutorialOnHowToUseTheKoreanRomanizationAndWordDivision(BasicGuide)_

1446년의 훈민정음은 문자 디자인의 출발점이었다. 처음부터 한글은 활 자로 태어났다. 타이포그래피(typography)란 활자[type]로 글을 쓰는 행 위다[graphy]. 붓으로 고급하게 글을 쓴다는 것과 활자로 글쓰기는 그 의미가 다르다. 구텐베르크나 세종은 고

Microsoft Word - Survival Korean

설계란 무엇인가?

PowerPoint 프레젠테이션

Microsoft PowerPoint - C++ 5 .pptx

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

일러두기 1. 이책은 1964년 2월 5일문교부장관의인정을받은, 남상천이만든남천식 ( 南天式 ) 속기법에대한기본편을간추려정리한것이다. 2. 이속기법은속기학의체계를확립하였으며, 쉽고재미있게배울수있도록만들었다. 3. 기본편에대한많은연습문제와속기연습지를남천속기홈페이지 (ww

PowerPoint Presentation

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft Word - transliteration.docx

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

금오공대 컴퓨터공학전공 강의자료

13 주차문자열의표현과입출력

Microsoft PowerPoint Predicates and Quantifiers.ppt

PowerPoint Template

국어혁명 박수미쌤 2 겹문장 : 두개이상의홑문장이합쳐져서이루어진문장 주어와서술어의관계가두번이상나타남 예 ) 나는학교에갔고, 동생은도서관에갔다. 예 ) 나는동생이건강하기를바란다. 2. 문장의종류 1 문장의종류 2 확장방식 < 이어진문장 > 뜻 : 홑문장이여러개이어진문장.

Microsoft PowerPoint - Chapter 6.ppt

Microsoft Word - Korean_solt1_module1_lesson1.doc

자음과모음 1. 자음체계 조음방법 조음위치 입술소리 ( 순음 ) 잇몸소리 ( 치조음 ) 센입천장소리 ( 경구개음 ) 여린입천장소리 ( 연구개음 ) 목청소리 ( 후음 ) 예사소리 파열음 된소리 안울림소리 울림소리 파찰음 마찰음 비음유음 거센소리예사소리된소리거센소리예사소리

쉽게 풀어쓴 C 프로그래밍

Ruby 프로그래밍 1

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

설계란 무엇인가?

제1장 권규호의 공무원 국어 제2장 제3장 제4장 음운론 1 음운과 음성 1. 음운의 개념과 종류 (1) 음성과 음운 ① 음성 : 의사소통을 위해 사람의 발음기관을 통하여 나오는 물리적 말소리 음성이란 사람의 입에서 나오는 소리를 말하는 것이다. 그렇다고 휘파람 소리

PowerPoint 프레젠테이션

PowerPoint Presentation

Microsoft PowerPoint 세션.ppt

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

슬라이드 1

2) 음성 고기 는 ㄱ, ㅗ, ㄱ, ㅣ 의네음운이모여서이루어진단어이다. 그런데두 ㄱ 이발음되는모습을살펴보면, 혀와입천장을이용하여공기의흐름을막았다가터뜨려낸다는공통점이있지만, 첫 ㄱ 과는달리둘째번 ㄱ 은목청을떨어울려낸다는차이점이있다. 이처럼, 구체적인소리하나하나를가리켜음성

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

JAVA PROGRAMMING 실습 02. 표준 입출력

C# Programming Guide - Types

70 diklasifikan berdasarkan perubahan letak dan perubahan cara pelafalan kemudian dianalisis penyebabnya. Berikut adalah variasi cara ucap konsonan ya

OCaml

Microsoft PowerPoint - Java7.pptx

#1. 문법공부를위한필수! 기본용어 음운체계 1. 모음 : 음절 ( 소리마디 ) 을이룰수있는독립적인소리 하늘 땅 사람 [ 天地人 ] 삼재로기본 3 글자를만들고, 가획하여다른글자를만듦 1 단모음 : 소리내는중에입술모양이나혀의위치가고정되어달라지지않는모음 혀의최고점의위치앞

PowerPoint 프레젠테이션

OCW_C언어 기초

슬라이드 1

<31372D31312D303928C7FCBCBAB9CE2DBCDBC1F6C8A E687770>

PowerPoint 프레젠테이션

C 프로그램의 기본

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft PowerPoint - additional06.ppt [호환 모드]

PowerPoint Presentation

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

gnu-lee-oop-kor-lec06-3-chap7

Microsoft PowerPoint - 09-Object Oriented Programming-3.pptx

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Transcription:

Ruby 프로그래밍 5 한글자소처리 한국어정보의전산처리 2017. 5. 15.

잉글랜드프리미어리그전적통계내기 http://www.football-data.co.uk/mmz4281/1617/e0.csv res = Hash.new() # 결과저장할 data structure: 팀 => 전적 (8 개필드 ) teams = [ Arsenal, Bournemouth, Burnley, Chelsea, Crystal Palace, Everton, Hull, Leicester, Liverpool, Man City, Man United", "Middlesbrough", "Southampton", "Stoke", "Sunderland", "Swansea", "Tottenham", "Watford", "West Brom", "West Ham"] # 20 개팀이름으로이루어진 Array 를만듦 teams.each do team #res Hash 에 20 개팀을추가하되 res[team] = Array.new(8,0) # 아래의 8 개필드를 0 으로초기화 # 0 1 2 3 4 5 6 7 # match, won, draw, lost, goal_won, goal_lost, goal_diff, point

File.open("E0.csv") do f f.each do line if f.lineno!= 1 fs = line.split(",") #fs[2], fs[3], fs[4], fs[5], fs[6] #HT, AT, FTHG, FTAG, FTR fs[4] = fs[4].to_i fs[5] = fs[5].to_i res[ fs[2] ][4] += fs[4] # 홈팀득점 fs[4] 만큼증가 res[ fs[2] ][5] += fs[5] # 홈팀실점 fs[5] 만큼증가 res[ fs[3] ][4] += fs[5] # 어웨이팀득점 fs[5] 만큼증가 res[ fs[3] ][5] += fs[4] # 어웨이팀실점 fs[4] 만큼증가 case fs[6] when "H" # 홈팀승리 res[ fs[2] ][1] += 1 # 홈팀승리 1 증가 res[ fs[3] ][3] += 1 # 어웨이팀패배 1 증가 when "A # 어웨이팀승리 res[ fs[2] ][3] += 1 # 홈팀패배 1 증가 res[ fs[3] ][1] += 1 # 어웨이팀승리 1 증가 when "D # 무승부 res[ fs[2] ][2] += 1 # 홈팀무승부 1 증가 res[ fs[3] ][2] += 1 #Away 팀무승부 1 증가 else ; # 위의세경우외에는없음

res.each do team, data #res Hash의경기수, 득실점차, 승점채우기 data[0] = data[1]+data[2]+data[3] # 경기수 = 승리수 + 무승부수 + 패배수 data[6] = data[4] - data[5] # 득실점차 = 총득점 - 총실점 data[7] = data[1] * 3 + data[2] # 승점 = 승리수 *3 + 무승부수 $, = ", # 필드구분자를쉼표로. print 함수호출시쉼표자리에출력됨 $\ = \n # 레코드구분자를줄바꿈문자로 i = 0 # 순위변수 res.sort{ x,y y[1][7]<=>x[1][7] }.each do team,data # 승점순으로소팅 i += 1 # 순위를 1씩증가시킴 print i, team, data.join(",") # 순위, 팀이름, 팀전적출력

한글자소 ( 초성, 중성, 종성 ) 분해 : called code @onset_name_array = [" ㄱ "," ㄲ "," ㄴ "," ㄷ "," ㄸ "," ㄹ "," ㅁ "," ㅂ "," ㅃ "," ㅅ "," ㅆ "," ㅇ "," ㅈ "," ㅉ "," ㅊ "," ㅋ "," ㅌ "," ㅍ "," ㅎ "] # 19 개. 다른파일에서사용할변수는전역 (global) 변수로해야함 @nucleus_name_array = [" ㅏ "," ㅐ "," ㅑ "," ㅒ "," ㅓ "," ㅔ "," ㅕ "," ㅖ "," ㅗ "," ㅘ "," ㅙ "," ㅚ "," ㅛ "," ㅜ "," ㅝ "," ㅞ "," ㅟ "," ㅠ "," ㅡ "," ㅢ "," ㅣ "] # 21 개. 전역변수는앞에 @ 를붙여줌 @coda_name_array = ["@"," ㄱ "," ㄲ "," ㄳ "," ㄴ "," ㄵ "," ㄶ "," ㄷ "," ㄹ "," ㄺ "," ㄻ "," ㄼ "," ㄽ "," ㄾ "," ㄿ "," ㅀ "," ㅁ "," ㅂ "," ㅄ "," ㅅ "," ㅆ "," ㅇ "," ㅈ "," ㅊ "," ㅋ "," ㅌ "," ㅍ "," ㅎ "] # 28 개 def is_hangeul?(code) # 어떤문자의코드값을입력으로하여한글인지판정 (0xac00..0xd7a3).include? code def get_onset(code) # 초성값알아냄. 반환값은 0~18, 0: ㄱ. 1: ㄲ,, 18: ㅎ (code 0xac00) / 588 # x=( 입력문자코드값 - 가 의코드값 ); x 를 588 로나눈몫 def get_nucleus(code) # 중성값알아냄. 반환값은 0~20, 0: ㅏ, 1: ㅐ,..., 20: ㅣ ( (code - 0xac00) % 588 ) / 28 #x 를 588 로나눈나머지 ( 초성블록순위 ) 를 28 로나눈몫 def get_coda(code) # 종성값알아냄. 반환값은 0~27, 0: 받침없음, 1: ㄱ, 2: ㄲ,... 27: ㅎ (code - 0xac00) % 28 # x 를 28 로나눈나머지

한글자소 ( 초성, 중성, 종성 ) 분해 : calling code require './jaso_call_me.rb' raise " 초, 중, 종성을알려드립니다. 한글을입력하세요." if ARGV.size < 1 code = ARGV[0].ord # 사용자가입력한문자의코드값을알아냄 $\ = "\n #print 함수호출시맨끝에줄바꿈문자출력 if is_hangeul? code # 사용자가입력한문자가한글이면 print " 초성 : ", @onset_name_array[ get_onset(code) ] print " 중성 : ", @nucleus_name_array[ get_nucleus(code) ] print " 종성 : ", @coda_name_array[ get_coda(code) ] # 초, 중, 종성값을알아내어초, 중, 종성이름 Array에서추출 else print " 한글을입력하세요. 입력하신문자는한글이아닙니다."

한글자소 ( 초성, 중성, 종성 ) 분해 : 문자열 ARGV[0].each_char do char # 사용자입력문자열의각문자에대해 code = char.ord print char if is_hangeul? code print ": 초성 : ", @onset_name_array[ get_onset(code) ] print ", 중성 : ", @nucleus_name_array[ get_nucleus(code) ] print ", 종성 : ", @coda_name_array[ get_coda(code) ], "\n" else print ": 한글아님 \n"

텍스트자소통계 onset_freq_array = Array.new(19,0) # [ ㄱ빈도, ㄲ빈도,..., ㅎ빈도 ] nucleus_freq_array = Array.new(21,0) # [ ㅏ빈도, ㅐ빈도, ㅑ빈도,..., ㅣ빈도 ] coda_freq_array = Array.new(28,0) # [ 없음빈도, ㄱ빈도, ㄲ빈도, ㄳ빈도,..., ㅎ빈도 ] hangeul_cnt = 0 # 한글음절개수 counter File.open(ARGV[0], "r:utf-8").each do line line.chomp.each_char do char # 각문자에대해 code = char.ord if is_hangeul? code # 한글이면 hangeul_cnt += 1 # 한글개수 counter 를 1 증가시킴 onset_freq_array[ get_onset(code) ] += 1 nucleus_freq_array[ get_nucleus(code) ] += 1 coda_freq_array[ get_coda(code) ] += 1 # 초, 중, 종성값알아내어해당빈도를 1 증가시킴

$, = "\t ; $\ = "\n # 필드구분자, 레코드구분자설정 print " 초성통계 ", "="*20 #= 을 20개출력 onset_freq_array.each_with_index do freq, idx # 초성통계자료 print @onset_name_array[ idx ], freq, freq*100/hangeul_cnt.to_f # 초성이름, 초성빈도, 백분율 ( 초성빈도 *100/ 한글음절수 ) 출력 print " 중성통계 ", "="*20 nucleus_freq_array.each_with_index do freq, idx print @nucleus_name_array[ idx ], freq, freq*100/hangeul_cnt.to_f print " 종성통계 ", "="*20 coda_freq_array.each_with_index do freq, idx print @coda_name_array[ idx ], freq, freq*100/hangeul_cnt.to_f

변수 (variable) 의종류 국소 (local) 변수 : 특정함수, 블록, 모듈, 파일안에서만유효 shadowing: 더작은 scope 에서정의된국소변수는, 더큰 scope 에서정의된자신과같은이름의국소변수를가림. 전역 (global) 변수 : 다른파일에서도접근가능. @ 로시작 instance 변수 : 어떤 class 에속하는각 instance/object 들이따로가지고있는변수. @ 로시작 해당 class 의 initialize 메소드에서 instance 변수의초기화담당 특별한조치를취하지않으면해당 class 의메소드에서만접근가능 class 변수 : 어떤 class 가가지고있는변수. @@ 로시작. 해당 class 에속하는모든 object 가공통으로접근가능함. 특별한조치를취하지않으면해당 class 의메소드에서만접근가능

instance 변수와 class 변수의예시 class Person #Person 이라는클래스정의 @@n = 0 # 이클래스에속하는 instance 의개수를기록하는변수 def initialize(name, age) # 이클래스에속하는 instance 를만들때호출됨 @name = name #instance 변수 @name 초기화 @age = age #instance 변수 @age 초기화 @@n += 1 #instance 의개수를 1 증가시킴 def to_s #instance 의정보 / 데이터를문자열로변환. print 시자동호출 name + : + age.to_s #name, 콜론, age( 문자열로변환 ) def n ; @@n ; end # 클래스변수 @@n 을외부에서조회하는메소드

free function 과 method free function: 특정 object 에매여있지않고그냥호출하는함수 호출형식 : func_name( argument_list ) class 밖에서정의됨. method: 특정 object 에매여서호출되는함수 호출형식 : object_name.method_name(argument_list ) 특정 class 내에서정의됨. 해당 class 내에정의된클래스변수에접근할수있음. 동일한기능을하는함수를 free function 으로만들수도있고메소드로만들수도있음. 예컨대한자 -> 한글변환함수를 free function 으로만들면 def sino2kor( str ) # str 가입력문자 메소드로만드는방법은후술

한자, 한글 ( 해당한자독음 ) 헤더파일 class String #String class 를열어서 data, 메소드를추가할수있음 @@hanja = { # 클래스변수는 @@ 으로시작해야함. 한자 => 한글 0x4e00=>0xc77c, #IL 일 0x4e01=>0xc815, #CENG 정 0x4e02=>0xad50, #KYO 교 0x4e03=>0xce60, #CHIL 칠 0x4e04=>0xc0c1, #SANG 상 0xfa2c=>0xad00, #KWAN 관 0xfa2d=>0xd559, #HAK 학 } # 클래스변수 @@hanja 의정의끝 #String class 를닫음

한자 -> 한글변환 raise " 한자-> 한글변환 " if ARGV.size < 1 require './unihan_hanja_read.rb' class String #String class를열어서 data, 메소드를추가할수있음 def sino2kor # 한자를한글 ( 해당한자의독음 ) 로변환하는메소드 @@hanja[ self.ord ] # 메소드는항상 object에대해호출됨 # 이메소드가호출된 object를 self로지칭 # 클래스변수는그클래스의메소드에서만접근가능 print [ ARGV[0].sino2kor ].pack 'U # 유니코드코드값을문자로변환하는 idiom: [ 코드값 ].pack U # 아스키코드값을문자로변환하는방법 : 코드값.chr

한글 -> 한자변환 : 한글을입력하면그한글을독음으로갖는한자들출력 class String @@dic = {} # 클래스변수 dic 을만들어빈 Hash 할당 @@hanja.each do k,v # 클래스변수 hanja Hash 의각 key( 한자 ) 와 value( 한글 ) 에대해 @@dic[v] = [] # 한글을 key 로하여 dic Hash 에 ( 없으면 ) 추가하고 Array 와연결시킴 @@dic[v] << k # 이한글 key 와연결된 Array 에한자추가 def kor2sino # 한글을한자로변환하는메소드 @@dic[self.ord] #dic Hash 에서한글코드값과짝을이루는한자코드값들의목록반환 res = ARGV[0].kor2sino # 사용자가입력한한글에대해 kor2sino 메소드호출 print res.size, 개 : res.each do i print [i].pack U # 각한자코드값을문자로변환하여출력