비정형 텐서의 단어 코드 포인트를 문장으로 되돌리기
비정형 텐서(ragged tensor)에 담긴 단어별 코드 포인트는 아래에서 소개하는 방법으로 문장 단위로 다시 묶을 수 있습니다. 여기서 말하는 세그멘테이션(segmentation)은 텍스트를 단어와 유사한 단위로 나누는 작업을 의미합니다. 대부분의 언어에서는 공백 문자를 기준으로 단어를 구분하지만, 중국어나 일본어처럼 단어 사이에 공백을 사용하지 않는 언어도 있습니다. 또한 독일어처럼 긴 합성어가 많아, 의미를 정확하게 분석하려면 단어를 더 잘게 분해해야 하는 경우도 있습니다.
단어의 코드 포인트를 다시 문장으로 되돌리려면, 먼저 각 단어를 구성하는 문자의 코드 포인트가 해당 문장 안에 실제로 존재하는지 확인해야 합니다. 존재한다면 이 정보를 바탕으로 비정형 텐서(ragged tensor)를 생성한 뒤, 그 결과를 표준 인코딩 방식인 UTF-8로 다시 인코딩하면 됩니다.
함께 읽으면 좋은 글: TensorFlow란 무엇이며, Keras는 TensorFlow와 어떻게 함께 작동하여 신경망을 구축할까요?
유니코드 문자열의 표현과 조작
Python에서 유니코드 문자열을 표현하고 이를 조작하는 방법을 살펴보겠습니다. 표준 문자열 연산의 유니코드 버전을 활용하면, 문자 체계(script) 감지를 기준으로 유니코드 문자열을 토큰 단위로 분리할 수 있습니다.
Google Colab 실행 환경
아래의 예제 코드는 Google Colaboratory(Colab)에서 실행되었습니다. Google Colab은 브라우저에서 별도의 설정 없이 Python 코드를 바로 실행할 수 있게 해주며, GPU(그래픽 처리 장치)를 무료로 사용할 수 있다는 큰 장점이 있습니다. Colaboratory는 Jupyter Notebook을 기반으로 만들어진 서비스입니다.
print("Segment the word code points back to sentences")
print("Check if code point for a character in a word is present in the sentence")
sentence_word_char_codepoint = tf.RaggedTensor.from_row_lengths(
values=word_char_codepoint,
row_lengths=sentence_num_words)
print(sentence_word_char_codepoint)
print("Encoding it back to UTF-8")
tf.strings.unicode_encode(sentence_word_char_codepoint, 'UTF-8').to_list()
코드 출처: https://www.tensorflow.org/tutorials/load_data/unicode
실행 결과
Segment the word code points back to sentences
Check if code point for a character in a word is present in the sentence
<tf.RaggedTensor [[[72, 101, 108, 108, 111], [44, 32], [116, 104, 101, 114, 101], [46]], [[19990, 30028], [12371, 12435, 12395, 12385, 12399]]]>
Encoding it back to UTF-8
[[b'Hello', b', ', b'there', b'.'],
[b'\xe4\xb8\x96\xe7\x95\x8c',
b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf']]
코드 설명
- 단어 수준의 코드 포인트들이 tf.RaggedTensor.from_row_lengths()를 통해 문장 단위로 재구성됩니다.
- 각 단어를 이루는 문자의 코드 포인트가 해당 문장에 포함되어 있는지 확인합니다.
- tf.strings.unicode_encode()를 사용해 디코딩된 데이터를 최종적으로 UTF-8 인코딩으로 다시 변환합니다.