100문제로 두드려 보는 자연어처리(제1장, 준비운동)


출처 : nlp100


제1장 : 준비운동

00. 문자열의 뒤집기

  • stressed라는 글자를 거꾸로 (마지막 글자가 맨 앞으로 오도록) 나열한 문자열을 구하시오.
string = 'stressed'
ret = ''
for i in range(len(string)-1, 0, -1):
    ret += string[i]

01. “schooled”

  • 문자열 ‘schooled’에서 1, 3, 5, 7번째 글자를 추출하여 연결된 문자열을 구하시오.
string = "schooled"
ret = ''
for i in range(len(string)):
    if i % 2 != 0 and i != 0:
        ret += string[i]

02. “shoe” + “cold” = “schooled”

  • 문자열 “shoe”와 “cold”에서 문자를 앞에서부터 번갈아 추출, 이어붙인 문자열을 구하시오.
string1 = "shoe"; string2 = "cold"
ret = ''
for i, j in zip(string1, string2):
    ret += i
    ret += j

03. 원주율

  • “Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.” 라는 문장을 단어로 분할하여 각 단어의 (알파벳) 글자 수를 앞에서부터 나열한 배열을 만드시오.
string = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
ret_list = []
cnt = 0
for i in range(len(string)):
    cnt += 1
    if string[i] == ' ':
        ret_list.append(cnt)
        cnt = 0

04. 원소 기호

  • “Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.”라는 문장을 단어 단위로 분할하고, 1, 5, 6, 7, 8, 9, 15, 16, 19번째 단어는 앞글자, 그 밖의 단어는 앞에서 두 글자씩 추출하여 꺼낸 문자열에서 단어의 위치순으로 나열한 배열을 만드시오.
string = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
str_list = string.split(' ')
ret_list = []
for i in range(len(str_list)):
    if i+1 in (1, 5, 6, 7, 8, 15, 16, 19):
        ret_list.append(str_list[i][:1])
    else:
        ret_list.append(str_list[i][:2])

05. n-gram

  • 주어진 시퀀스(문자열이나 리스트 등)에서 n-gram을 만드는 함수를 작성하시오. 이 함수를 이용해 “I am an NLPer” 라는 문장에서 단어 bi-gram과 문자 bi-gram을 구하시오.
string = "I am an NLPer"
token_gram = []
token_list = string.split(' ')
for i in range(len(token_list) - 1):
    token_gram.append(token_list[i] + token_list[i+1])
str_gram = []
for i in range(len(string) - 1):
    str_gram.append(string[i] + string[i+1])

06. 집합

  • “paraparaparadise”와 “paragraph”에 포함되는 문자 bi-gram의 집합을 각각, X와 Y로 구하고, X와 Y의 합집합, 곱집합, 차집합을 구하시오. 그리고, “se” 라는 bi-gram이 X와 Y 중 어느 집합에 포함되는지 확인하시오.
str1 = "paraparaparadise"
str2 = "paragraph"
X = []
for i in range(len(str1) - 1):
    X.append(str1[i] + str1[i+1])
X = set(X)
Y = []
for i in range(len(str2) - 1):
    Y.append(str2[i] + str2[i+1])
Y = set(Y)
# 합집합
X | Y # {'di', 'ap', 'is', 'ph', 'ad', 'gr', 'ra', 'ag', 'se', 'pa', 'ar'}
# 곱집합
from itertools import product
mul_set = set(product(X, Y))
"""
{('is', 'ph'), ('ad', 'ag'), ('di', 'ar'), ('ra', 'ra'), ('se', 'gr'), ('pa', 'ra'), ('di', 'ra'), ('ra', 'ar'), ('ap', 'ap'), ('ar', 'ag'), ('pa', 'ap'), ('se', 'ph'), ('is', 'ap'), ('is', 'gr'), ('ad', 'ph'), ('di', 'pa'), ('pa', 'ag'), ('ap', 'ph'), ('ap', 'ra'), ('pa', 'pa'), ('ra', 'ag'), ('ap', 'pa'), ('ar', 'ar'), ('ar', 'ra'), ('pa', 'gr'), ('ar', 'pa'), ('is', 'ar'), ('ap', 'ag'), ('di', 'ph'), ('pa', 'ar'), ('ar', 'ap'), ('ra', 'ph'), ('ad', 'pa'), ('ar', 'gr'), ('is', 'ag'), ('se', 'pa'), ('ar', 'ph'), ('ap', 'ar'), ('ra', 'gr'), ('is', 'pa'), ('ra', 'ap'), ('se', 'ra'), ('di', 'gr'), ('se', 'ar'), ('di', 'ap'), ('pa', 'ph'), ('ra', 'pa'), ('ad', 'ra'), ('is', 'ra'), ('se', 'ap'), ('ad', 'ar'), ('di', 'ag'), ('ad', 'ap'), ('ap', 'gr'), ('se', 'ag'), ('ad', 'gr')}
"""
# 차집합
X - Y # {'is', 'se', 'di', 'ad'}
# "se" 는 어느집합?
"se" in X and True or False # True
# 즉, "se"는 X 집합에 포함된다.

07. 템플릿을 이용한 문자열 생성

  • 임의의 인자 x, y, z 를 받아서 “x시 y는 z”라는 문자열을 돌려주는 함수를 구현하시오. 그리고 x=12, y=”기온”, z=22.4를 이용하여 실행 결과를 확인하시오.
def template(x, y, z):
    return f"{x}{y}{z}"
template(12, "기온", 22.4)

08. 암호문

  • 주어진 문자열의 각 문자를 아래의 사양에 따라 변환하는 cipher라는 이름의 함수를 구현하시오.

    • 영소문자일 경우, (219 - 문자 코드) 문자로 전환
    • 기타 문자는 그대로 출력

    이 함수를 사용하여, 영어로 된 문장을 암호화한 후, 복호화하시오.

def cipher(string):
    ret = ''
    for i in range(len(string)):
        if 'a' <= string[i] <= 'z':
            ret += chr(219 - ord(string[i]))
        else:
            ret += string[i]
    return ret
tmp = cipher("Hello, Python!!") # 'Hvool, Pbgslm!!'

09. Typoglycemia

  • 공백으로 구분된 단어의 나열 문자열을 이용, 각 단어의 첫 글자와 마지막 글자는 남기고 그 이외의 문자의 순서를 랜덤으로 섞는 프로그램을 작성하시오. 단, 길이가 4 이하인 단어에 대해서는 섞는 과정을 생략하시오. 적당한 영어 문장을 (e.g. “I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind.) 이용하여 실행 결과를 확인하시오.
import random
string = "I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind."
str_list = string.split(' ')
ret_list = []
for strs in str_list:
    if len(strs) > 4:
        ret = ''
        start = strs[0]; end = strs[-1]
        tmp = [strs[i] for i in range(1, len(strs) - 1)]
        random.shuffle(tmp)
        ret += start
        for i in range(len(tmp)):
            ret += tmp[i]
        ret += end
        ret_list.append(ret)
    else:
        ret_list.append(strs)
print(' '.join(ret_list)) # I culn’dot blveiee that I could atlcluay uetnsadnrd what I was ridnaeg : the pnohneemal power of the hamun mdin.
August 10, 2020 에 작성
Tags: nlp python