<Notes>
자연어 처리 수업 필기 + 보충 학습
각각의 알파벳은 아스키
코드로 매칭이 된다.
그리고 아스키 코드 숫자를 바탕으로 모델 학습을 위한 이진수로 변환할 수 있다.
하지만 7비트로 정의한 아스키는 문제가 있었다.
영어를 바탕으로 7비트의 이진수로 변환하다 보니 표현할 수 있는 문자는 2의 7제곱인 128개 밖에 없는 것이다. 그러다보니 세계 다양한 언어를 7비트의 이진수로 변환하는 데 문제가 발생했다.
그렇게 유니코드
가 탄생했다. 전 세계 모든 문자를 컴퓨터에서 일관되게 표현하고 다루기 위한 국제 표준이다. 16진수로 표현된 숫자로 아스키의 문자 인코딩 시스템의 제약을 극복할 수 있었다. 또한 글자, 이모지, 특수 기호, 수학 및 기술적 기호 등 다양한 문자를 표현할 수 있다.
유니코드를 인코딩하는 주요 방식에는 utf-8
과 utf-16
이 있다. 유니코드를 인코딩한 코드 테이블에 있어서 한국어, 일본어, 중국어는 매우 많은 분량을 차지한다. 조합형과(ㄱ,ㄴ) 완성형(가, 나)를 모두 받아야 하기 때문이다.
한글을 인코딩하는 기술도 있다. 대표적으로 euckr
과 cp949
가 있다. 유니코드로 인코딩하는 방식이 더욱 편리할 수 있어도 아직 한국의 많은 데이터들은 위 방식으로 인코딩되어 있기 때문에 짚고 넘어가야 한다.
euckr
은 16비트로 우리나라가 만든 규칙, 완성형(가, 나)이며 영어도 함께 담겨 있어서 utf-8
과 호환되지 않는다.
cp949
는 마이크로소프트에서 개발한 한글 문자 인코딩 방식. euckr
을 확장한 것으로 마찬가지로 영어와 일부 특수 문자를 지원하여 utf-8
과 호환 안된다. 조합형, 완성형 모두 포함하고 있다.
뭐 한줄 요약하자면
- 문자나 문자열을 컴퓨터가 이해할 수 있는 이진수 형태로 변환하는 과정이 필요한데, 현대의 웹 표준이나 국제적으로는
utf-08
을 선호하기 때문에utf-08
을 사용하여 인코딩하는 것을 권장한다.- 하나 더, 뭐 당연한 얘기지만 인코딩으로 변환된 데이터는 디코딩을 통해 다시 사람이 이해할 수 있는 형태로 변환된다.
살짝의 실습을 해보자, 아스키코드로 인코딩해볼까?
testStr ="Velog"
testStr_binary = ' '.join(format(x, 'b') for x in bytearray(testStr, 'ascii'))
print("스트링to바이너리:", testStr_binary)
# 결과값
# 스트링to바이너리: 1010110 1100101 1101100 1101111 1100111
다시 디코딩도 해봐야겠지?
def BinaryToDecimal(binary):
# 2진수를 10진수로 바꿔바꿔
string = int(binary, 2)
return string
str_data =' '
for i in range(0, len(testStr_binary), 7):
#아스키 코드가 7비트로 나오니까 끊어서 디코딩해야지!
temp_data = testStr_binary[i:i + 7]
# 10진수로 바꾸고
decimal_data = BinaryToDecimal(temp_data)
# 10진수 문자로 다시 디코딩
str_data = str_data + chr(decimal_data)
print("스트링 to 바이너리:", testStr_binary)
print("바이너리 to 스트링:", str_data)
# 결과값
# 스트링 to 바이너리: 10101101100101110110011011111100111
# 바이너리 to 스트링: Velog
아스키 코드 외에도 다양한 인코딩 방식으로 변환할 수 있어야겠지? 근데 주의할 점! 각각의 인코딩 방식이 포함하고 있지 않은 문자를 인코딩을 시도하면 오류가 난다는 점이다.. 꽤 재밌다
근데 chr()함수는 10진수로 표현된 아스키 코드를 디코딩하는 함수라 일반적으로 내가 인코딩한 방식으로 만든 문자를 되돌릴 때는 .decode('utf-8')와 같이 디코딩하니까 참고하자!
<에필로그>
기초 중의 기초인 것일까,,ㅋㅋ큐ㅠ
재밌는 실습 하나로 마무리 하자
ASCII 아트 실습! 이전에 썼던 이모티콘을 기억하십니까 ㅋㅋㅋ (0.0)7 뭐 이런 거 ㅋㅋㅋㅋ이런거 다 ASCII 아트다
for i in range(5):
print(" " * (4 - i) + "/" + " " * i + "\\")
print(" " + "========")
# 결과값
/\
/ \
/ \
/ \
/ \
========
이진수부터 디코딩해서 만들어보려면 위 함수를 참고해서 해보는 것을 추천한다!!