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

Slides:



Advertisements
Similar presentations
연천 새둥지마을 체재형 주말농장 준공식 초청장 오시는 길 주제 일시 장소 21C 경기농촌희망심기 2005년 제1기 교육수료마을
Advertisements

출석수업 자료 교과서 범위: 제1장-4장.
10월 충북노회 남선교회 순회 헌신예배 묵 도 기 도 성 경 봉 독 특 송 찬 양 설 교 찬양 / 봉헌 봉 헌 기 도
한알Ⅱ「더불어 살기」전국대회 일정표 날짜 시간 7월 26일(목) 7월 27일(금) 7월 28일(토) 7월 29일(일)
선거관리위원회 위원 공개모집 4차 공고 제4기 선거관리위원회를 구성하는 위원 모집의
신앙의 기초를 세우는 중고등부 1부 대 예 배 : 11 : 00 ~ 12 : 층 본당
신앙의 기초를 세우는 중고등부 1부 대 예 배 : 11 : 00 ~ 12 : 층 본당
◆ 지난주 반별 출석 보기 ◆ 제 56 권 26호 년 6월 26일 반 선생님 친구들 재적 출석 5세 화평 김성희 선생님
임상시험 규정 (최근 변경 사항 중심으로) -QCRC 보수 교육 과정 전달 교육
사회복지현장의 이해 Generalist Social Worker 사회복지입문자기초과정 반포종합사회복지관 김한욱 관장
Digital BibleⅢ 폰속의 성경 디지털 바이블 2008년 12월 ㈜씨엔커뮤니케이션 ㈜씨엔엠브이엔오.
성 김대건 피츠버그 한인 성당 그리스도왕 대축일 공지사항
지금 나에게 주신 레마인 말씀 히브리서 13장 8절.
KAINOS 날마다 더하여지는 Kainos News 이번 주 찬양 20 / 300 – 20개의 셀, 300명의 영혼
성경 암송 대회 한일교회 고등부 (일).
III. 노동조합과 경영자조직 노동조합의 이데올로기, 역할 및 기능 노동조합의 조직형태 노동조합의 설립과 운영
1. 단위사업 관리, 예산관리 사업설정 (교직원협의/의견수렴) 정책 사업 학교 정책 사업 등록 사업 기본정보 목표 설정
※과정 수료자에 한하여 수강료의 80~100% 차등 환급함
평생학습중심대학 프로그램 수강지원서 접수안내 오시는 길 관악구&구로구민을 위한 서울대학교 -- 접수 일정 및 방법 안내--
서비스산업의 선진화, 무엇이 필요한가? 김 주 훈 한 국 개 발 연 구 원.
기존에 없던 창업을 하고 싶은데, 누구의 도움을 받아야 할지 모르겠어요
Homeplus 일 家 양 득 프로그램 소개 2015년 12월.
통신이론 제 1 장 : 신호의 표현 2015 (1학기).
I. 기업과 혁신.
Chapter 4 – 프로그래밍 언어의 구문과 구현 기법
14 장 근거리통신망 : 이더넷(Ethernet)
제14장 스팸 메일 대응 기술.
MAGNI 565 THE MAGNI GROUP,ING. 제품 설명: 외관: 성능 데이타: 주요 이점: 사양:
제 1장. 멀티미디어 개론 1.1 멀티미디어란 무엇인가? 1.2 멀티미디어와 하이퍼미디어 1.3 월드 와이드 웹
노동조합의 기능과 사용자의 고용관계 정책 노사관계론 이성희 교수님
George Soros의 투자 전략 협동조합 금융학과 담당교수 : 류 덕 위.
독성물질의 투여 방법 생체내 시험 시험관내 시험
로봇의 표정구현을 위한 메커니즘 및 립싱크 KIST 김승종 박사 세계적인 경쟁력을 확보한 기술적 성과
일제의 경제 침탈과 민족 경제 운동 풍암고 국사과
광주경영자총협회 위기극복을 위한 변화창조 리더십 광진구청080911/건국대행정대학원 정 용 진 교수.
2004년 인천시 2차 동시분양 일정표 Monday Tuesday Wednesday Thursday Friday
2차저작물과 ‘식객’ 1조.
CONTENTS 1 주제 소개 2 캐논사 연혁 및 제품 3 카메라 업계 현황 4 일본에서 보완할 점.
병원 감염 Nosocomial Infection
미술관 사례 윤초혜.
~~ 학부모님들의 많은 참여 부탁 드립니다 ~~
열왕기하 1장을 읽고 묵상으로 예배를 준비합시다..
여우와 신 포도.
2011 5학년 독서 골든벨.
오늘의 안건 시장의 변화 다양성 포용성 휴식 사례 연구 국제적 다양성.
실패 없는 도전, 아름다운 성공을 위한 2014학년도 대학입시설명회
Simulation and software radio for mobile communications
외환시장의 효율성과 환율예측 이 장의 목적 - 대부분의 이론들이 효율성을 가정하고 있으 며, 또한 시장이 비효율적인 경우 정책적인 개입근거가 된다. 따라서 효율성의 개념에 대한 명확한 설명이 필요 - 장기적인 투자결정 및 환위험관리에 필요한 환율예측의 다양한 기법을.
CPU-GPU 이기종 플랫폼에서 하둡 맵리듀스의 가속: CKY 파서 사례 분석
최현진 정경대학 정치외교학과 국제정치론 2015 가을학기 제13주(2) 최현진 정경대학 정치외교학과
러시아 주요 거시경제 지표 러시아 경제 지표 자료: Troika Dialog

주일공동예배 2008년 3월 9일.
분광광도법에 의한 크롬과 망간 혼합물의 정량 4조 박진영 서지현 송영호 심영경.
열화학 6.1 에너지의 본질과 에너지의 종류 6.2 화학 반응에서의 에너지 변화 6.3 열역학 서론 6.4 화학 반응의 엔탈피
Fischer esterifiacation
2. 기본 전기물리학.
출산준비교실 안내 교 육 내 용 참 고 사 진 구 분 1 주 2 주 3 주 4 주 교 육 내 용
※별첨) ‘16년 컨소시엄 연간 교육일정(안) ~13
우리나라 지진해일 발생현황 (1900년 이후) 발생일시 지진 발생지점 지진해일 높이 정부대응 피해지역 인명피해 재산피해
2011년 청,장년회 사업 계획서 월 사 업 내 용 비 고 수 입 지 출 2010년도 회비 잔액: 12,600
주간메뉴표 . 5월 30일(월) 5월 31일(화) 6월 1일(수) 6월 2일(목) 6월 3일(금) 6월 4일(토)
한국현대사 강의.
전도위원회 원장 박봉기 장로 2010년 4월,5월 실적 2010년 6월,7월 계획 ◎ 종량제 봉투 전도: 구마을 875장
한사랑교회 청소년부 5월의 소식 5/6 전원진 이후정 김세환 5/13 아라이노부오 허소영 5/20 김주경 아라이앙리 5/27
중앙아시아의 경제 현황과 발전 전망 2008년 9월 18일 이 재 영.
1. 기관별 맞춤형 집중교육 : 실습 및 개인별 집중지도    1. 기관별 맞춤형 집중교육 : 실습 및 개인별 집중지도 (상설) 기관별 맞춤형 교육 - 당 교육기관에서.
Ruby on Rails – 1. Ruby Aon의 공부하면서 만드는 세미나 1탄.
Ruby 프로그래밍 1 문자열 입출력 제어구조 looping 함수 정의
Ruby 프로그래밍 4 자료구조 응용 한국어 정보의 전산 처리
Presentation transcript:

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

jaso_call_me.rb의 함수들을 메소드로 바꾸기 한글인지 아닌지 판정, 초성,중성,종성 알아내기는 문자열에 대해서만 수행하는 일이므로, 이들 함수를 free function보다는 String class 내의 메소드로 정의하는 것이 합리적임. class String def hangeul? (0xac00..0xd7a3).include? self.ord end def onset #반환값은 0~18, 0: ㄱ. 1: ㄲ, ..., 18: ㅎ (self.ord - 0xac00) / 588 def nucleus #반환값은 0~20, 0: ㅏ, 1: ㅐ, ..., 20: ㅣ ( (self.ord - 0xac00) % 588 ) / 28 def coda # 반환값은 0~27, 0: 받침없음, 1: ㄱ, 2: ㄲ, ... 27: ㅎ (self.ord - 0xac00) % 28

로마자화 프로그램의 구조 입력: 한글 문자열 (한글 아닌 문자가 중간에 들어 있어도 무방) 출력: 한글을 로마자로 변환하여 출력. 기타 문자는 그대로 출력. String 클래스에 romanize 메소드 추가 Syllable 클래스 추가: 초성, 중성, 종성 3개의 멤버 변수를 포함 음운규칙의 적용 방식 방법1: 한글->로마자화->음운규칙 방법2: 한글->음운규칙->로마자화 : 방법2를 택함. 음운규칙 적용을 위해 String을 우선 Syllable들의 Array로 변환 phon 함수: Syllable들의 Array를 입력으로 받아, 음운규칙 적용한 뒤, Syllable들의 Array를 반환 phon 함수 내부에서 각종 음운규칙 함수를 호출하여 사용 romanize 메소드에서 phon 함수를 호출하여 음운규칙이 적용된 Syllable들의 Array를 받아서 각 syllable의 초성, 중성, 종성을 각각 로마자로 변환 이렇게 로마자로 변환된 결과를 문자열로 통합: join 메소드 이용

Syllable class 정의 class Syllable #음절 클래스. 초성, 중성, 종성 3개의 멤버로 이루어져 있음. attr_accessor :onset, :nucleus, :coda #이 class의 3개의 멤버를 class 외부에서도 참조할 수 있도록 개방. #음운규칙 적용시 필요함. def initialize(onset=nil, nucleus=nil, coda=nil) #이 class에 속하는 object를 만들 때(new) 멤버들의 값을 초기화 #값을 주지 않으면 nil로 초기화 @onset = onset @nucleus = nucleus @coda = coda end

String class에 to_syls 메소드 추가 def to_syls #Syllable들의 Array로 변환. 나중에 음운규칙의 적용을 위해) syls = [] #결과를 저장할 Syllable들의 Array self.each_char do |c| #입력 문자열의 각 문자 c에 대해 c = [@@hanja[c.ord]].pack 'U' if @@hanja.has_key? c.ord #c가 한자이면 이것을 대응하는 한글로 바꿔줌 syls << (c.hangeul? ? Syllable.new(c.onset, c.nucleus, c.coda) : c) #c가 한글이면 한글 음절의 초성,중성,종성 값을 구하여 이 셋으로 #Syllable instance를 만들어 syls에 추가 #c가 한글이 아니면 그냥 c 자체를 syls에 추가 end #syls: [제1음절[초,중,종],제2음절[초,중,종], ..., 끝음절[초,중,종]] syls #syls Array 반환 end

String class에 romanize 메소드 추가 def romanize #romanize 메소드 추가 #onsets=['ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'] onset2alpha=['g','kk','n','d','tt','r','m','b','pp','s','ss','','j','jj','ch','k','t','p','h','l'] #맨끝에 ㄹ→l 추가. 보통의 초성 ㄹ=r, ㄹ 뒤의 초성 ㄹ=l #nuclei=['ㅏ','ㅐ','ㅑ','ㅒ','ㅓ','ㅔ','ㅕ','ㅖ','ㅗ','ㅘ','ㅙ','ㅚ','ㅛ','ㅜ','ㅝ','ㅞ','ㅟ','ㅠ','ㅡ','ㅢ','ㅣ'] nucleus2alpha = ['a','ae','ya','yae','eo','e','yeo','ye','o','wa','wae','oe','yo','u','wo','we','wi','yu','eu','ui','i'] #codas = ['채움','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄼ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ',' ㅂ','ㅄ','ㅅ','ㅆ','ㅇ','ㅈ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'] coda2alpha = #ㄱ,ㄷ,ㅂ 초성은 g, d, b인 데 비해 종성은 k, t, p ['','k','k','k','n','n','n','t','l','k','m','p','l','l','p','l','m','p','p','t','t','ng','t','t','k','t','p','t'] self.to_syls.map{ |syl| syl.class()==Syllable ? onset2alpha[syl.onset] + nucleus2alpha[syl.nucleus] + coda2alpha[syl.coda] : syl }.join("") end #Syllable인 것은 위의 세 Array에서 대응하는 로마자로 바꿈 #Syllable이 아닌 것은 원래 것 그대로

음운규칙 적용 국어의 로마자 표기법에서 경음화는 반영하지 않음. ㅎ 축약은 명사에서는 반영하지 않고, 용언에서만 반영. 한국어의 대개의 음운 규칙은 앞 음절의 종성과 뒤 음절의 초성 사이 에서 일어남. 다음의 순서로 반영함. 재음절화 (연음법칙): 밥이→바비, 숲을→수플 초성 ㄹ 관련 규칙: 역행 유음화, 초성 ㄹ 제약 순행 유음화 비음화: {ㅂ, ㄷ, ㄱ} → {ㅁ, ㄴ, ㅇ} / __ 비음 ㅎ 축약: {ㅂ, ㄷ, ㅈ, ㄱ} ~ ㅎ → {ㅍ, ㅌ, ㅊ, ㅋ} 구개음화 일부 반영: 닫히다 /다치다/, 묻히다 /무치다/ 음절말 중화: romanize 메소드에서 반영 String class 내의 함수로 phon을 만들고, 여러 음운규칙에 해당하는 함수를 phon이 호출하도록 함. 이들 함수는 클래스 내부에서만 사용. romanize 메소드에서 phon 함수 호출

def resyllabification(coda) #재음절화 coda2resyl = [ #재음절화가 일어날 때, 앞 음 절 종성이 무엇인가에 따라 앞 음절 종성 및 뒤 음절 초성이 무엇으로 바뀔지를 정해 놓은 Array [0,11], #0채움: 채움, ㅇ [0,0], #1ㄱ: 채움, ㄱ [0,1], #2ㄲ: 채움, ㄲ [1,9], #3ㄳ: ㄱ, ㅅ [0,2], #4ㄴ: 채움, ㄴ [4,12], #5ㄵ: ㄴ, ㅈ [0,2], #6ㄶ: 채움, ㄴ 않아->아나 #실제 발음이 '안하'가 아님) [0,3], #7ㄷ: 채움, ㄷ [0,5], #8ㄹ: 채움, ㄹ [8,0], #9ㄺ: ㄹ, ㄱ [8,6], #10ㄻ: ㄹ, ㅁ [8,7], #11ㄼ, ㄹ, ㅂ [8,9], #12ㄽ: ㄹ, ㅅ [8,16], #13ㄾ: ㄹ, ㅌ [8,17], #14ㄿ: ㄹ, ㅍ [0,5], #15ㅀ: 채움, ㄹ 앓아→아라 #실제 발음이 '알하'가 아님 [0,6], #16ㅁ: 채움, ㅁ [0,7], #17ㅂ: 채움, ㅂ [17,9], #18ㅄ: ㅂ, ㅅ [0,9], #19ㅅ: 채움, ㅅ [0,10], #20ㅆ: 채움, ㅆ [21,11], #21ㅇ: ㅇ, ㅇ [0,12], #22ㅈ: 채움, ㅈ [0,14], #23ㅊ: 채움, ㅊ [0,15], #24ㅋ: 채움, ㅋ [0,16], #25ㅌ: 채움, ㅌ [0,17], #26ㅍ: 채움, ㅍ [0,11], #27ㅎ: 채움, ㅇ 좋아→조아 #실제 발음이 '조하'가 아님 ] [coda2resyl[coda][0], coda2resyl[coda][1]] # 앞음절 종성, 뒤음절 초성 end

비음화 메소드 def nasalization(coda) #앞음절 종성과 뒤음절 초성 ㄴ,ㅁ이 만났을 때 일어나는 비음화를 다룸 #앞음절 종성의 변화만 다룸. case coda #앞음절 종성이 when 1 ; 21 #ㄱ이면 ㅇ으로 바꿈. 예: 독립→독닙→동닙 when 7,27 ; 4 #ㄷ,ㅎ이면 ㄴ으로 바꿈. #예: 묻니→문니, 좋니→졷니→존니 when 17 ; 16 #ㅂ이면 ㅁ으로 바꿈. 예: 법라→법나→범나 else ; coda #기타의 경우 coda를 그대로 둠 end

ㅎ 축약: 용언 어간말 자음이 ㅎ인 경우 def aspiration_verb(onset) #앞음절 종성 ㅎ과 뒤음절 초성의 축약을 다룸 #뒤음절 초성의 변화만 다룸. case onset #뒤음절 초성이 when 0 ; 15 #ㄱ이면 ㅋ으로 바꿈 #예: 않고→않코, 앓고→알코, 좋고→좋코 when 3 ; 16 #ㄷ이면 ㅌ으로 바꿈. 예: 좋더라→좋터라 when 7 ; 17 #ㅂ이면 ㅍ으로 바꿈. when 12 ; 14 #ㅈ이면 ㅊ으로 바꿈. 예: 좋지→조치 else ; onset #기타의 경우 onset을 그대로 둠 end

ㅎ 축약: 접미사 '-히-'의 경우 def aspiration_hi(coda, onset) #앞음절 종성, 뒤음절 초성 둘 다 고려해야 함 #앞음절 종성과 뒤음절 초성 ㅎ이 만났을 때의 축약을 다룸 #뒤음절 초성의 변화만 다룸. case coda when 1 ; 15 #앞음절 종성이 ㄱ이면 뒤음절 초성을 ㅋ으로 바꿈 #예: 먹히고→머키고 when 7,22 ; 14 #앞음절 종성이 ㄷ,ㅈ이면 뒤음절 초성을 ㅊ으로 바꿈 #예: 묻혀→무텨→무쳐(구개음화), 젖힐→저칠 when 17 ; 17 #앞음절 종성이 ㅂ이면 뒤음절 초성을 ㅍ으로 바꿈 #예: 잡혀→자펴 else ; onset #기타의 경우 onset을 그대로 둠 end

def phon(syls) #Syllable들의 Array를 input으로 받아서, 음운규칙이 적용된 결과를 Syllable들의 Array로 반환 syls.each_cons(2) do |ap,dui| #각각의 인접한 두 음절에 대해. ap==앞음절, dui==뒤음절 next if ap.class() != Syllable or dui.class() != Syllable #둘 중 하나라도 한글음절이 아니면 그냥 통과 case dui.onset #뒤음절 초성이 when 11 #ㅇ이면 ap.coda, dui.onset = resyllabification(ap.coda) #재음절화(연음법칙) when 5 #ㄹ이면 초성 ㄹ 관련 음운규칙을 적용 if ap.coda == 4 #앞음절 종성이 ㄴ이면 ap.coda = 8 #ㄹ로 바꿈(역행 유음화) 예: 신라->실라 elsif ap.coda != 0 and ap.coda != 8 #앞음절 종성이 채움, ㄹ이 아니면 dui.onset = 2 #뒤음절 초성을 ㄴ으로 바꿈(초성 ㄹ의 분포 제약) 예: 종로->종노, 독립->독닙 ap.coda = nasalization(ap.coda) end dui.onset = 19 if ap.coda == 8 #종성 ㄹ 뒤의 초성 ㄹ은 'l'로 바꿈. when 2 #ㄴ이면 if ap.coda == 8 #앞음절 종성이 ㄹ이면 순행 유음화 적용 dui.onset = 19 #뒤음절 초성을 ㄹ[l]로 바꿈. 예: 별내->별래 else ap.coda = nasalization(ap.coda) #비음화 when 6 #ㅁ이면 비음화 적용

when 18 #ㅎ이면 if ((dui.nucleus==6 and (dui.coda==0 or dui.coda==20) ) or (dui.nucleus==20 and [0,4,8,16].include? dui.coda)) and [1,7,17,22].include? ap.coda #((중성 ㅕ and (종성 무,ㅆ) ) or (중성 ㅣ and (종성 무,ㄴ,ㄹ,ㅁ) )) and 앞음절 종성이 ㄱ,ㄷ,ㅂ,ㅈ #즉, 종성 ㄱ,ㄷ,ㅂ,ㅈ 뒤에 '혀,혔,히,힌,힐,힘'이 오는 경우 dui.onset = aspiration_hi(ap.coda, dui.onset) ap.coda = 0 #앞음절 종성을 없앰. 먹힌->먹킨->머킨 end #평장애음과 ㅎ의 축약: 피사동 접사 '-히-'의 경우에만 반영함 #기타 경우는 반영 안 함. 예: 각하 gakha, 법학 beophak else #뒤음절의 초성이 ㅇ,ㄹ,ㄴ,ㅁ,ㅎ이 아닌 경우. 여기서는 앞음절 종성 ㅎ과 뒤음절 초성의 축약만 다룸. case ap.coda #앞음절 종성이 when 6, 15 #ㄶ, ㅀ이면(예: 않,앓) ㅎ과 평장애음의 축약 dui.onset = aspiration_verb(dui.onset) #앞음절 종성은 그대로 놔둬도 됨. ㄶ은 n으로, ㅀ은 l로 변환될 것이기 때문 when 27 #ㅎ이면(예: 좋) ㅎ과 평장애음의 축약 ap.coda = 0 #앞음절 종성을 없앰. 좋고->좋코->조코 end #case dui.onset 의 끝 end #syls.each_cons(2) do |ap,dui|의 끝 syls #음운규칙 적용 결과를 Syllable들의 Array로 반환 end #phon 함수의 끝

romanize 메소드 수정: 음운 규칙 반영 romanize 메소드의 마지막 부분에서 phon 함수 호출 추가 def romanize …… phon(self.to_syls).map{ |syl| syl.class()==Syllable ? onset2alpha[syl.onset] + nucleus2alpha[syl.nucleus] + coda2alpha[syl.coda] : syl }.join("") end

자습 문제: 예일식 로마자 표기법 한국 정부에서 고시한 로마자 표기법과 별도로 한국어/한글의 로마자 표기법에는 매퀸-라이샤워式 표기법과 예일(Yale)式 표기법이 있음. https://en.wikipedia.org/wiki/Yale_romanization_of_Korean 언어학계에서는 예일식 표기법이 주로 쓰임. 한글 표기를 예일식 로마자 표기법으로 변환하는 ruby 스크립 트를 작성해 보시오.

한자의 중국음과 한국음 비교 통계 입력: 약 4000자의 한자에 대해 한국음과 중국음을 대비한 자료 음절별, 초성별, 중성별, 초·중성별, 중·종설별 출력: 한국음을 기준으로 이에 대응하는 중국음의 빈도, 예시 글자들

dic = Hash.new #결과를 저장할 Hash를 만듦. 한국음=>(중국음=>한자) File.open(ARGV[0],"r:UTF-8").each do |line| #입력 파일의 각 라인에 대해 comb, kor, chi = line.chomp.split("\t") #탭으로 분리 → 한자,한국음,중국음 dic[kor] ||= Hash.new #dic[kor]가 nil이면 빈 Hash를 만듦 dic[kor][chi] ||= Array.new #dic[kor][chi]가 nil이면 빈 Array를 만듦 dic[kor][chi] << comb #dic[kor[chi]에 한자 추가 end File.open(ARGV[1], "w:UTF-8") do |of| #출력 파일을 엶 dic.sort.each do |k, c_combs| #dic을 소트(한국음 가나다순). k=한국음 of << k << "\t" #한국음 출력. c_combs == Hash (중국음=>한자목록) c_combs.sort{ |x,y| y[1].length<=>x[1].length }.each do |c, combs| #한자목록의 길이(한자 수)로 소트. c=중국음, combs=한자목록 of << c << "\t" << combs.length << "\t" << combs.join("/") << "\n" end # 중국음, 탭, 한자 수, 탭, 한자/한자/한자/…, 줄바꿈