Ruby 프로그래밍 4 자료구조 응용 한국어 정보의 전산 처리 2017. 5. 8..

Slides:



Advertisements
Similar presentations
Tcl/Tk 민 인학 한국 Tcl/Tk 커뮤니티.
Advertisements

교직원 성희롱·성폭력·성매매 예방교육 벌교중앙초등학교 박명희
학습센터란? 기도에 관해 배울 수 있는 다양한 학습 코너를 통하여 어린이들이 보다 더 쉽게 기도를 알게 하고, 기도할 수 있게 하며, 기도의 사람으로 변화될 수 있도록 하는 체험학습 프로그램이다. 따라서 주입식이지 않으며 어린이들이 참여할 수 있는 역동적인 프로그램으로.
후에 70인역(LXX)을 좇아 영어 성경은 본서의 중심 주제인 “엑소도스”(출애굽기)라 하였다.
예배에 대하여.
성인 1부 성경 공부 지도목사: 신정우 목사 부 장: 오중환 집사 2010년. 5월 9일
여수시 MICE 산업 활성화 전략 ( 중간보고 )
전시회 개요 Ⅰ. 전시명칭 개최기간 개최장소 개최규모 주 최 참 관 객 현 지 파 트 너 General Information
Home Network 유동관.
목 차 Ⅰ 점검 업무의 목적 Ⅱ 시설물 설치 현황 파악 Ⅲ 주요 시설물 점검 특성 및 주기 Ⅳ 테마별 점검 내용 Ⅴ
발표순서 추진배경 자유이용사이트 현황 만료저작물 활용 사례 공유저작물 이용 활성화 사업 추진 계획.
Chapter 01. 해킹의 정의와 역사.
리우올림픽 개최국 브라질에 대해서~~ 금은동 메달 브라질 국기 마스코트 비니시우스와 톰 리우올림픽 개막식 및 폐막식 구 분
섬유의 종류에 따른 공기저항 비교 지도교사: 김 은 정 선생님.
베이비 붐 세대란 ?.
■ 분위기 조성 게임(Icebreaker) 이란?
대표이사 – 김휘중 대표이사 소개 조선대학교 무역학과 수학 크린코리아 전남,광주 지점장 대신용역 대표이사 하나건설 대표이사
참석자: 정미자, 강지혜, 정이향, 윤지영 일시: 2012년 7월 4일 수요일 장소: 맛나다
국어 정서법의 기초 -한글 띄어쓰기를 중심으로
한튜터 지역별 사업자 제안서 F5 키를 누르시면 슬라이드로 보실 수 있습니다.
송년회, 이런 노래는 참아주세요 동아일보 문화부 이승재 기자.
5차시: 비례식을 이용하여 생활 속 문제를 해결해 보자.
알기쉬운 Proposal 작성법 순천청암대학 이재호.
Ⅰ.서론 첫 번째, 인터넷신문 속 표기 오류 정보화 사회로 급격하게 변화하고 있는 가운데, 우리의 실생활 속에서 인터넷이란
순환기내과 정명호 교수 전문진료분야 : 협심증, 심근경색증, 고혈압
안 중 근 2학년 1반 7조 강선미, 전효정, 신주영, 이소희.
경기도와 함께 하는 병영독서프로그램 “독서마차”
1. 반전.반제 사상의 형성 반전.반제 사상의 등장 우치무라 간조: 러일 전쟁 중 반전론 제기, 전쟁의 비도덕성 강조
통일은 대박이다 !.
Ⅱ 삼국의 성립과 발전 3. 삼국의 문화와 대외 교류 02 삼국과 가야가 이웃 나라와 교류하다.
삼성전자 지역 CSR 활동 커뮤니케이션 효과 및 평가 연구 서강대학교 대학원 신문방송학과 지도교수: 신호창
국가 추격지수 : 한국에의 시사 (International Index of Catch-up of Nations)
세계은행 그룹 (World Bank Group)
“부양책 효과기대…주가는 경기에 6개월 선행”
◆자치통감강목◆ 학과:문헌정보학과 학번: 이름:이민지.
8조 자유 주제 (오사카- 도톤보리) 발표: 김다미 조원: 김광희, 이민섭, 김홍섭.
2012년 1월 일 월 화 수 목 금 토
2015-2학기 고전문학입문 12주차 2차시 여행(2) 열하일기 중 관내정사.
중앙아시아의 경제 현황과 발전 전망 2008년 9월 18일 이 재 영.
3 디지털 논리 IT CookBook, 컴퓨터 구조와 원리 2.0.
Seoul National University
2. 장기 이식의 윤리적 쟁점.
서은이의 4학년 때 뉴스~ 4학년4반 18번 김 서은.
지금부터 혜초에 대하여 알아봅시다! 5학년 2반 김예진.
-민요에 대해서- ☆5학년5반 김채림☆.
북한의 권력구조와 후계체제 김정일시대를 중심으로.
북한 사회변화 실태 및 전망 고향으로 가는 길 우리가 열자!.
자유학기제 교육과정 편성 및 운영 교사 조 우 성.
2010 충청남도교육청 지정 시범학교 운영 보고 바른품성 5 운동 전개.
매체소개서
재해 발생 배경 검토 재 해 위 험 고층 구조물 및 설비 증가 매년 10명 이상 사망 사용중 검사 미실시
내가 갖고 싶은 직업. 내가 갖고 싶은 직업 살아가기 힘들 때마다 문득 생각나는 사람이 있다.
Petri-net 오상묵 Date Written by SangMook.
제27과 약국(병원)에서  약사:어떻게 오셨습니까? 메링:감기에 걸려서 왔어요.열이 좀 있고 기침도 해요.
13. Floating Point Operations
Optimization for Training Deep Models
지호네 가족 신문 제 1호 창간호 우지호 만듦 제작일 5월 19일~.
Chapter 11 The C Shell.
Ruby on Rails – 1. Ruby Aon의 공부하면서 만드는 세미나 1탄.
Ruby 프로그래밍 1 문자열 입출력 제어구조 looping 함수 정의
 13장. 배시쉘 프로그래밍.
Ruby 프로그래밍 한글 로마자화 한국어 정보의 전산 처리
Mammalian cell culture Ⅱ
1. 내 - 주의 보혈은 정하고 정하다 내 죄를 정 케 하신 주 날 오라 하신다 1. 내 주의 보혈은 3. 약하고 추해도
Ruby 프로그래밍 3 Array와 Hash 이용
U N I X 창원대학교 전자계산학과 김병찬.
주안교회 아동부 예배 2008년 2월 10일.
KS9050 CAT 설정 * 중요 * 버전이 E2.00 일 경우는 반드시 업데이트 하셔야 합니다.
Ruby 프로그래밍 2 loop, 수열 함수 정의 및 호출 반복과 재귀
argc, argv 의 사용방법 #include <stdio.h>
Presentation transcript:

Ruby 프로그래밍 4 자료구조 응용 한국어 정보의 전산 처리 2017. 5. 8.

합격자 명단 파일에서 읽어오기 2 if ARGV.length < 2 print "이름이 명단에 있는지 검사. 명단파일, 이름을 입력" exit end names = File.open(ARGV[0], "r:UTF-8").readlines.map{ |s| s.chomp } #File objet의 메소드 readlines를 이용하여 각 라인들의 Array 만듦 #이 Array에 들어 있는 라인들은 줄바꿈 문자가 끝에 달려 있음 #map 메소드로 각 요소에 chomp 적용하여 줄바꿈 문자 떼어냄 print ( names.include? ARGV[1] ) ? "Yes" : "No"

표준국어대사전에서 주표제어, 부표제어 추출 File.open(ARGV[0], "r:UTF-8").each do |line| fs = line.chomp.split("#") mainlemma = fs[2][1..-1] #주표제어: 셋째 필드의 둘째 문자부터 끝 문자까지 sublemmas = fs.select{ |s| s.start_with?("6") }.map{ |s| s[1..-1] } #부표제어: 6으로 시작되는 필드들. 둘째 문자부터 끝 문자까지 print mainlemma, ",", sublemmas.join(","), "\n" end

품사별 빈도 통계: 형태소 분석 말뭉치 data = Hash.new # {pos => { form => freq } } File.open(ARGV[0], "r:UTF-8").each do |line| line.chomp.split(" ").each do |word| #라인을 어절별로 분리 word.split("+").each do |morph| #어절을 형태별로 분리 temp = morph.split("/") #형태를 /로 분리 case temp.size #/로 분리한 결과가 몇 개인가에 따라 별도 처리 when 2 #분리 결과가 2개. 즉 /가 1개인 경우. 정상적인 경우 form = temp[0] #/ 앞의 것은 form pos = temp[1] #/ 뒤의 것은 품사 when 3 # 분리 결과가 3개. 즉 /가 2개인 경우. 예: //SP form = "/" #/ 앞의 것은 "/" pos = temp[-1] # temp Array의 마지막 요소. ==temp[2] else # 분리 결과가 2개도 아니고 3개도 아닌 경우. 아마 없을 듯 print "Error: ", morph #에러 메시지 출력하고 exit #프로그램 종료 end

품사별 빈도 통계: 형태소 분석 말뭉치 data[pos] ||= Hash.new(0) #pos와 연결된 value가 이미 있으면(non-nil) 아무 일도 안 하고 #없으면(nil) Hash를 새로 만듦. default value 0 data[pos][form] += 1 #그 Hash에서 form과 연결된 value(즉 빈도)를 1 증가시킴 end data.each do |pos, dic| #data에 들어 있는 각 품사(pos) 및 이와 연결된 Hash(이름을 dic이라 함)에 대해 File.open(pos+".csv", "w:UTF-8") do |of| #pos.csv라는 쓰기용 파일을 엶 dic.sort{ |x,y| y[1]<=>x[1] }.each do |form, freq| #dic을 value(빈도) 내림차순으로 소팅하여 of << form << "," << freq << "\n" #form과 빈도를 출력

grep 흉내내기 사용자가 command line argument로 path, 정규표현 제시 파일이름, 라인번호, 그 라인에서 정규표현에 매치되는 부분의 시작, 끝 부분에 표시 넣어 출력하기 raise "사용법: ./grep_file.rb 파일이름 정규표현" if ARGV.size < 2 pattern = Regexp.new(ARGV[1]) File.open(ARGV[0], "r:UTF-8") do |f| # File object를 가리키는 변수를 f라 함 f.each do |line| line.chomp! if line =~ pattern #line이 정규표현 pattern에 매치되면 print f.lineno, ":", $`, "▶", $~.to_s, "◀", $', "\n“ #라인번호:매치앞부분▶매치부분◀매치뒤부분\n end

구성원-범주 → 범주-구성원 구조 변환 개화기 어휘에 대해 박사논문을 쓰고 있는 후배가 각 명사에 대해 의미부류/범주를 표시한 파일을 각 의미부류/범주에 속하는 명사들을 나열한 파일을 만들어 달라고 함. data = Hash.new #입력 파일을 분석하여 저장할 data strcuture. 결과물의 구조에 따라 만듦. # { 범주 => [단어,단어,단어,......] } File.open(ARGV[0], "r:UTF-8").each do |line| word, cats = line.chomp.split("\t") #탭으로 분리. 앞은 단어, 뒤는 범주목록 cats.split(/, ?/).each do |cat| #범주목록을 쉼표(+공백)로 분리 data[cat] ||= Array.new #cat이라는 key와 연결된 value(단어들의 Array)가 아직 없으면 만듦 data[cat] << word #이 Array에 word 추가 end data.sort.each do |cat, words| print cat, "\t", words.length, "\t", words.join(", "), "\n" # 범주, 탭, 단어개수, 탭, 단어목록

목록 비교: 차집합, 교집합, 합집합 require 'set' set1 = File.open(ARGV[0], "r:UTF-8").readlines.map{ |s| s.chomp }.to_set set2 = File.open(ARGV[1], "r:UTF-8").readlines.map{ |s| s.chomp }.to_set # 입력파일의 라인들을 Array로 읽어들여, 줄바꿈 떼어내고, set으로 변환 diff1 = set1 - set2 # set1.difference(set2)와 동일 diff2 = set2 - set1 # set2.difference(set1)과 동일 uni = set1 + set2 # set1.union(set2), set1|set2와 동일 inter = set1 & set2 # set1.intersection(set2)와 동일 print ARGV[0], " - ", ARGV[1], "\n" diff1.each{ |e| puts e } print ARGV[1], " - ", ARGV[0], "\n" diff2.each{ |e| puts e } print ARGV[0], " ∪ ", ARGV[1], "\n" uni.each{ |e| puts e } print ARGV[0], " ∩ ", ARGV[1], "\n" inter.each{ |e| puts e }

문자의 종류 알려주기 ARGV[0].each_char do |char| #문자열 ARGV[0]의 각 문자에 대해 print char, ": " puts case char.ord #ord 메소드: 문자 char의 코드값을 반환 when (0x0030..0x0039) then "숫자“ #then 대신에 줄바꿈도 가능 when (0x0041..0x005a) then "로마자 대문자" when (0x0061..0x007a) then "로마자 소문자" when (0xac00..0xd7a3) then "한글" when (0x3400..0x4db5), (0x4e00..0x9fa5), (0xf900..0xfa6a) then "한자“ # when 뒤에 여러 값/range를 쉼표로 나열할 수 있음 else “기타“ #위의 when에 나열된 경우들에 걸리지 않은 나머지 경우 end #case ~ when ~ else ~ end 블록의 끝. #char.ord가 속하는 범위(when 뒤의 range)에 해당하는 then 뒤의 값 반환 end