Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

TensorFlow와 Python으로 단어 목록에서 RaggedTensor(비정형 텐서)를 구축하는 방법

TensorFlow에서 RaggedTensor(비정형 텐서)는 길이가 서로 다른 시퀀스 데이터를 효율적으로 다루기 위한 자료구조입니다. 자연어 처리에서처럼 문장마다 단어 수가 다르고 단어마다 문자 수가 다른 경우, 일반적인 밀집 텐서(dense tensor) 대신 RaggedTensor를 사용하면 패딩 없이 가변 길이 데이터를 그대로 표현할 수 있습니다.

단어 목록에서 RaggedTensor 만들기

RaggedTensor는 문장에 포함된 단어들의 시작 오프셋(starting offsets)을 활용해 손쉽게 구축할 수 있습니다. 작업 순서는 다음과 같습니다.

  • 먼저 문장 내 모든 단어의 각 문자에 대한 코드 포인트(code point)를 구성합니다.
  • 다음으로 생성된 결과를 콘솔에 출력합니다.
  • 마지막으로 해당 문장의 단어 개수를 계산하고, 단어의 시작 위치를 나타내는 오프셋을 결정합니다.

유니코드 문자열은 Python으로 표현할 수 있으며, 표준 문자열 연산의 유니코드 등가물(Unicode equivalents)을 사용해 자유롭게 조작할 수 있습니다. 우선 스크립트 감지(script detection)를 기반으로 유니코드 문자열을 토큰 단위로 분리하는 작업부터 진행합니다.

실행 환경: Google Colaboratory

아래 코드는 Google Colaboratory(Colab)에서 실행됩니다. Colab은 브라우저에서 바로 Python 코드를 실행할 수 있게 해주며, 별도의 설정이 필요 없고 GPU(그래픽 처리 장치)에도 무료로 접근할 수 있습니다. Colaboratory는 Jupyter Notebook을 기반으로 구축된 서비스입니다.

예제 코드

print("Get the code point of every character in every word")
word_char_codepoint = tf.RaggedTensor.from_row_starts(
    values=sentence_char_codepoint.values,
    row_starts=word_starts)
print(word_char_codepoint)
print("Get the number of words in the specific sentence")
sentence_num_words = tf.reduce_sum(tf.cast(sentence_char_starts_word, tf.int64), axis=1)

코드 출처: https://www.tensorflow.org/tutorials/load_data/unicode

출력 결과

Get the code point of every character in every word
<tf.RaggedTensor [[72, 101, 108, 108, 111], [44, 32], [116, 104, 101, 114, 101], [46], [19990, 30028], [12371, 12435, 12395, 12385, 12399]]>
Get the number of words in the specific sentence

코드 설명

  • tf.RaggedTensor.from_row_starts를 사용해 문장 내 모든 단어의 각 문자에 대한 코드 포인트를 담은 비정형 텐서가 생성됩니다. 여기서 row_starts는 각 단어가 시작되는 위치를 지정합니다.
  • 생성된 코드 포인트 목록이 콘솔에 출력됩니다. 출력 결과를 보면 영어 단어 "Hello", ", ", "there", "."뿐만 아니라 한자 "世界"와 일본어 "こんにちは"까지 각 언어별 코드 포인트로 정확히 분리된 것을 확인할 수 있습니다.
  • tf.reduce_sumtf.cast를 조합해 해당 문장에 포함된 단어의 개수가 계산됩니다. 불리언 마스크를 int64로 변환한 뒤 축(axis=1)을 따라 합산하는 방식입니다.

이처럼 RaggedTensor를 활용하면 언어나 문자 체계에 상관없이 가변 길이 텍스트 데이터를 깔끔하게 처리할 수 있으며, 유니코드 기반 텍스트 전처리 파이프라인을 구성할 때 특히 유용합니다.