TensorFlow에서 유니코드 연산을 수행하려면 먼저 문자열의 길이를 구하고, 길이 계산 단위를 기본값인 '바이트(BYTE)'에서 다른 값으로 지정하는 방식을 사용합니다. 또한 'encode' 메서드를 활용하면 코드 포인트(code point) 벡터를 인코딩된 문자열 스칼라로 변환할 수 있으며, 이 과정을 통해 인코딩된 각 문자열 안에 어떤 유니코드 코드 포인트가 들어 있는지 파악할 수 있습니다.
자연어 처리와 유니코드의 관계
자연어를 처리하는 딥러닝 모델은 서로 다른 문자 집합을 사용하는 다양한 언어를 동시에 다루어야 하는 경우가 많습니다. 유니코드는 전 세계 거의 모든 언어의 문자를 표현할 수 있는 표준 인코딩 시스템으로, 모든 문자가 0부터 0x10FFFF 사이의 고유한 정수 코드 포인트로 매핑됩니다. 즉, 하나의 유니코드 문자열은 0개 이상의 코드 포인트로 이루어진 시퀀스라고 정의할 수 있습니다.
이번 글에서는 Python으로 유니코드 문자열을 표현하는 방법과 이를 조작하는 방법을 살펴보고, 나아가 표준 문자열 연산의 유니코드 버전을 활용해 스크립트(script) 감지를 기반으로 유니코드 문자열을 토큰 단위로 분리하는 방식까지 소개합니다.
실행 환경: Google Colaboratory
아래 예제 코드는 Google Colaboratory(Colab)에서 실행되었습니다. Google Colab은 브라우저에서 바로 Python 코드를 실행할 수 있게 해주는 환경으로, 별도의 설정이 필요 없으며 무료로 GPU(그래픽 처리 장치)를 사용할 수 있다는 큰 장점이 있습니다. Colaboratory는 Jupyter Notebook을 기반으로 구축되었습니다.
print("마지막 문자는 UTF-8 인코딩에서 약 4바이트를 차지합니다")
thanks = u'Hello 😊'.encode('UTF-8')
num_bytes = tf.strings.length(thanks).numpy()
num_chars = tf.strings.length(thanks, unit='UTF8_CHAR').numpy()
print('{} bytes; {} UTF-8 characters'.format(num_bytes, num_chars))
코드 출처: https://www.tensorflow.org/tutorials/load_data/unicode
실행 결과
마지막 문자는 UTF-8 인코딩에서 약 4바이트를 차지합니다
10 bytes; 7 UTF-8 characters
코드 설명
- tf.strings.length 연산에는 unit이라는 매개변수가 있으며, 문자열 길이를 계산하는 방식을 지정합니다.
- unit의 기본값은 "BYTE"이지만, 필요에 따라 "UTF8_CHAR" 또는 "UTF16_CHAR" 같은 다른 값으로 설정할 수 있습니다.
- 위 예제에서 'Hello 😊' 문자열은 일반 문자 6개와 이모지 1개로 총 7개의 UTF-8 문자로 구성되며, 이모지가 4바이트를 차지하기 때문에 전체 바이트 수는 10바이트가 됩니다.
- 이처럼 unit 옵션을 활용하면 인코딩된 각 문자열에 포함된 유니코드 코드 포인트의 개수를 정확하게 구할 수 있습니다.
더 읽어보기
TensorFlow란 무엇이며, Keras는 TensorFlow와 어떻게 연동되어 신경망을 구축할까요?