자연어 처리(인코딩, 디코딩)

푸른하늘·2024년 3월 18일
1

개발자 유아기

목록 보기
6/14

<Notes>

자연어 처리 수업 필기 + 보충 학습


🆗 Binary to Text Encoding

각각의 알파벳은 아스키 코드로 매칭이 된다.
그리고 아스키 코드 숫자를 바탕으로 모델 학습을 위한 이진수로 변환할 수 있다.

하지만 7비트로 정의한 아스키는 문제가 있었다.
영어를 바탕으로 7비트의 이진수로 변환하다 보니 표현할 수 있는 문자는 2의 7제곱인 128개 밖에 없는 것이다. 그러다보니 세계 다양한 언어를 7비트의 이진수로 변환하는 데 문제가 발생했다.

그렇게 유니코드가 탄생했다. 전 세계 모든 문자를 컴퓨터에서 일관되게 표현하고 다루기 위한 국제 표준이다. 16진수로 표현된 숫자로 아스키의 문자 인코딩 시스템의 제약을 극복할 수 있었다. 또한 글자, 이모지, 특수 기호, 수학 및 기술적 기호 등 다양한 문자를 표현할 수 있다.

유니코드를 인코딩하는 주요 방식에는 utf-8utf-16이 있다. 유니코드를 인코딩한 코드 테이블에 있어서 한국어, 일본어, 중국어는 매우 많은 분량을 차지한다. 조합형과(ㄱ,ㄴ) 완성형(가, 나)를 모두 받아야 하기 때문이다.

한글을 인코딩하는 기술도 있다. 대표적으로 euckrcp949가 있다. 유니코드로 인코딩하는 방식이 더욱 편리할 수 있어도 아직 한국의 많은 데이터들은 위 방식으로 인코딩되어 있기 때문에 짚고 넘어가야 한다.

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(" " + "========")

# 결과값
    /\
   /  \
  /    \
 /      \
/        \
 ========

이진수부터 디코딩해서 만들어보려면 위 함수를 참고해서 해보는 것을 추천한다!!

profile
천방지축 어리둥절 빙글빙글 돌아가는 내인생

0개의 댓글

관련 채용 정보