#!/usr/bin/env python # coding: utf-8 # # Assignment 4 # ### [정보] # #### 1) Due Date: 2018년 11월 25일 (일), 23시 59분 # #### 2) 제출방법: jupyter notebook으로 작성된 내용을 github 또는 dropbox와 같은 클라우드에 올려 해당 URL을 다시 http://nbviewer.jupyter.org 에 넣어서 산출된 URL을 EL사이트에 제출함. # #### 3) 내용: 반드시 python code와 수행 결과를 jupyter notebook 내에 작성하여 넣고 이에 대한 설명등을 해당 코드 아래에 markdown cell에 넣어 기입하시오. # #### 4) 숙제이후 소감: 문제를 모두 푼 이후에 현재까지 강의를 들은 이후의 소감, 숙제를 한 이후의 소감, 또는 전하고자 하는 말 등을 짧막하게라도 좋으니 마지막에 함께 작성하여 제출하시오. # #### 5) 문제 (마지막 Incremental Project에 집중하기 위하여 이번 숙제에는 ACM-ICPC 문제는 포함하지 않음) # ##### [1번 문제] # 파일 s.txt 내의 다음 내용과 함께 아래 문제의 코드를 제시하시오. # >pig ham
# >cat dog
# >ham bird
# >dog pig
#            - 1) 파일 s.txt을 읽어서 각 라인에 있는 첫 번째 단어(문자열) 자체들을 기준으로 라인별 정렬후 파일 s1.txt에 그 결과를 기록하는 코드를 작성하시오. 즉, 프로그램 수행 후 s1.txt에 있는 파일 내용은 다음과 같다. # >cat dog
# >dog pig
# >ham bird
# >pig ham
#            - 2) 파일 s.txt을 읽어서 각 라인에 있는 두 번째 단어(문자열) 자체들을 기준으로 라인별 정렬후 파일 s2.txt에 그 결과를 기록하는 코드를 작성하시오. 즉, 프로그램 수행 후 s2.txt에 있는 파일 내용은 다음과 같다. # >ham bird
# >cat dog
# >pig ham
# >dog pig
#            - 3) 파일 s.txt을 읽어서 각 라인들에 있는 모든 단어들을 순차적으로 다시 나열하되 각 라인에 세 개의 단어들이 오도록 하여 s3.txt에 기록하는 코드를 작성하시오. 즉, 프로그램 수행 후 s3.txt에 있는 파일 내용은 다음과 같다. # >pig ham cat
# >dog ham bird
# >dog pig
# ##### [2번 문제] # 다음과 같은 조건들을 참고하여 회원 가입 및 로그인 프로그램을 작성하시오. # - 1) 프로그램 시작 후 다음과 같은 메시지가 출력되어 1, 2, 3 중 하나의 값을 입력 받도록 한다. # >Welcome to Our Service
# >1. Sign Up
# >2. Sign In
# >3. Quit
# - 2) 1을 선택하면 ID, Password, Name, School의 4가지 정보를 입력받아 파일에 저장하는 프로그램을 작성한다. # - 2-1) 입력된 내용은 access.txt 라는 이름의 텍스트 파일 내에 저장된다. # - 2-2) access.txt 파일의 각 라인에는 가입된 회원 각각의 정보가 "[id]: [password], [name], [school]" 형태로 저장된다. # - 2-3) 즉, 가입 회원이 10명이면 access.txt 파일 내에 라인 수도 정확히 10개이다. # - 2-4) 암호화 방식은 sha 모듈을 활용한다. sha 모듈 활용 방법은 본 문제의 마지막에 제시된 sha 활용 예를 참고한다. # - 즉, access.txt 파일 내에 password 정보는 암호화 되어 저장되어야 한다. # - 2-5) 회원 정보를 입력 받을 때 id를 입력 받은 직후 access.txt를 확인하여 이미 존재하는 id가 입력되었다면 다음 메시지를 출력하고 id 정보를 다시 입력받는다. # - Sorry, the entered ID is already used. # - 3) 2를 선택하면 ID, Password의 2가지 정보를 입력받는 프로그램을 작성한다. # - 3-1) 입력된 ID 정보가 access.txt에 존재하지 않으면 다음과 같은 메시지를 출력하고 다시 입력받는다. # - Sorry, you are not a registered member. # - 3-2) 입력된 ID가 올바르게 존재하지만 Password 정보가 access.txt 파일에 있는 정보와 불일치하면 다음과 같은 메시지를 출력하고 Password를 다시 입력받는다. # - Sorry, the entered password is not correct. # - 이 때에도 사용자가 입력한 Password 정보와 함께 sha 모듈이 활용되어야 한다. # - 3-3) 입력된 ID와 Password가 모두 올바르면 다음과 같은 메시지를 출력한다. # - Hello [name]! # - 위 [name]에는 access.txt에 기록되어 있는 name 정보를 출력한다. # - 4) 3을 선택하면 프로그램이 끝난다. # - [참고] sha 모듈 활용 예 # In[10]: import sha password_plain = "12345678" password_encrypted = sha.new(password_plain).hexdigest() print password_encrypted # import hashlib # hasher = hashlib.sha1() # password_plain = 'ripemd160' # password_encrypted = hashlib.new(password_plain) # password_encrypted.hexdigest() # print(password_encrypted) # ##### [3번 문제] # range() 함수와 유사한 frange() 함수를 다음 조건을 참고하여 만드시오. # - 1) frange()의 인자 구성은 다음과 같이 range와 동일하지만 각 인수들은 음수를 받지 않는다고 가정한다. # > range(stop)
# > range(start, stop[, step])
# - 2) frange() 함수의 인자에 대한 기본 시작(start) 값은 0.0이고, 기본 단계(step) 값은 0.1이다. # - 3) frange 사용 예 # - 3-1) frange(0.5) # - [0.0, 0.1, 0.2, 0.3, 0.4] # - 3-2) frange(1.0, 2.0) # - [1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9] # - 3-3) frange(2.2, 4.0, 0.5) # - [2.2, 2.7, 3.2, 3.7] # ##### [4번 문제] # 가변인수를 받는 함수 sum()을 다음과 같은 조건을 참고하여 구현하시오 # - sum() 사용 예 # - sum() # - 0 # - sum(1, 2) # - 3 # - sum(1, 2, 3, 4, 5) # - 15 # - sum(1, 5, 7, 2, -10) # - 5 # ##### [5번 문제] # 여러 단어로 이루어진 문자열을 입력받아 각 단어의 첫글자로 이루어진 단어를 대문자로 출력하는 myinitial() 함수를 다음 조건을 참고하여 작성하시오. # - 1) 다음에 제시되는 함수들을 모두 이용해야 한다. # - split # - map # - join # - 2) myinitial() 함수 사용 예 # - myinitial("as soon as possible") # - ASAP # ##### [6번 문제] # 음이 아닌 정수 n를 입력받으면 n! (factorial)을 계산하는 myfact() 함수를 재귀적 함수로 구현하시오. # - [옵션] 참을 수 있는 정도 만큼의 수행시간을 직접 기다려보면서 n을 늘려보도록 합시다. # ##### [7번 문제] # (서술형) import string 과 from string import * 의 차이점을 설명하시오. # ##### [8번 문제] # 이전 Assignment 3의 마지막 문제는 웹 URL로 지정된 웹페이지를 문자열로 가져와 모든 HTML 태그 및 CSS와 Javascript를 제외한 순수 텍스트를 얻어내고 그 안에 존재하는 단어를 추출하여 각 단어들에 대해 출현빈도를 사전형태({'world': 2, 'hello': 1, 'python': 1})로 저장하여 출력하는 것이었다. 이번에는 Assignment 3를 확장하여 다음과 같은 조건을 만족하도록 구현하시오. # - 1) 다음 사이트에서 제시되는 불용어 (Stop words)를 참고하여 이전 숙제에서 구성했던 단어 사전에서 불용어들을 모두 제거하는 코드를 추가하시오. # - 영어 불용어: http://www.lextek.com/manuals/onix/stopwords1.html # - 한글 불용어: https://raw.githubusercontent.com/stopwords-iso/stopwords-ko/master/stopwords-ko.txt # - 2) 각 URL로 지정된 웹페이지의 HTML 소스를 파일로 저장하시오. # - URL이 http://URL 이라면 파일명은 URL.html 이다. # - 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.html 이다. # - 3) 단어의 출현빈도가 담긴 사전 객체를 위 HTML 소스 파일과 동일한 폴더에 파일로 저장하시오. # - 파일입출력 (E-learning 13주차) 마지막에 학습한 pickle 모듈을 활용하시오. # - URL이 http://URL 이라면 사전 객체를 담고 있는 파일명은 URL.words_frequency.pickle 이다. # - 예: URL이 http://www.cnn.com 이라면 파일명은 www.cnn.com.words_frequency.pickle 이다. # - 4) 최소 5개 이상의 웹 사이트 각각에 대한 HTML 소스 파일과 단어 출현빈도 파일을 저장하시오. # - 즉, 5개의 웹 사이트에 대해 총 10개의 파일을 동일한 폴더에 생성하시오. # - [주의] 가능하면 웹사이트에 단어들이 많고 다루는 주제가 서로 다른 웹 사이트들로 선정하는 것 추천 # - 5) 위 문제에서 저장한 모든 pickle 파일들을 객체로 다시 로드하여 본인이 저장하여 분석한 사이트들 각각에 대해서 가장 많이 출현한 단어 3개씩를 뽑아 제시하시오. # - 반드시 pickle 모듈로 저장한 5개 이상의 pickle 파일들을 다시 5개 이상의 사전 객체로 로드 하는 코드가 추가되어야 함 # - 6) 간단한 검색엔진 코딩 (Like Google!!!) # - 사용자에게 임의의 검색어 (하나 또는 여러 단어로 구성) 를 입력받으시오. # - 예: # - 대한민국 # - 컴퓨터 공학 # - 맛있는 음식 # - 파이썬을 쉽게 공부하는 법 # - 한기대 장점을 알려주세요 # - 입력받은 검색어들에 대해서도 1)에서 제시하는 방법처럼 불용어 처리를 하여 정리 # - 입력 받은 검색어와 유사도(Similarity)가 높은 웹 사이트 기준으로 위 4)에서 미리 지정해 놓은 5개 이상의 웹 사이트 URL들을 일렬로 나열하여 출력하시오. # - 검색어와 웹 사이트 간의 유사도는 본인이 스스로 정하시오. # - 유사도를 정하는 최소한의 기준은 단어 출현 빈도를 기반으로 해야 하며, 이외의 본인이 생각하는 방안이 있으면 함께 사용해도 됨. # - 유사도가 높은 웹 사이트가 상위에 출력되어야 함 (즉, 유사도 기준 내림 차순) # - 유사도가 동일한 웹 사이트들에 대해서는 임의 배치함. # - 7) [주의] 필수사항 # - 위에서 만든 검색엔진 코딩은 매우 간단한 것이라 부족한 점이 많이 존재한다. # - 본인이 생각하기에 상업적인 완성도 높은 검색 로봇/엔진이 되려면 어떤 기능들이 추가적으로 구현되어야 할지 최소 1가지 이상 제시하시오.