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

TensorFlow와 Python으로 문장의 모든 단어 코드 포인트 얻는 방법

문장에 포함된 모든 단어의 코드 포인트(code point)를 얻으려면, 먼저 해당 위치가 단어의 시작인지 여부를 확인해야 합니다. 이어서 각 문자의 인덱스가, 모든 문장에서 평탄화(flatten)된 문자 목록 안에서 특정 단어의 시작 인덱스와 일치하는지 검사합니다. 이 과정이 확인되면 아래의 방법을 사용해 모든 단어를 구성하는 각 문자의 코드 포인트를 얻을 수 있습니다.

스크립트(script) 식별자는 단어 경계(word boundary)를 어디에 추가해야 하는지 판단하는 데 도움을 줍니다. 단어 경계는 문장의 시작 부분과, 바로 앞 문자와 스크립트가 서로 다른 각 문자 앞에 추가됩니다. 이렇게 구한 시작 오프셋(start offset)은 RaggedTensor를 생성하는 데 활용할 수 있으며, 이 RaggedTensor에는 전체 배치(batch)에 속한 단어들의 목록이 담기게 됩니다.

유니코드 문자열 처리 개요

Python으로 유니코드 문자열을 표현하고, 표준 문자열 연산에 대응하는 유니코드 연산들을 사용해 이를 조작하는 방법을 살펴보겠습니다. 먼저 스크립트 감지(script detection)를 기반으로 유니코드 문자열을 토큰(token) 단위로 분리합니다.

더 읽어보기: TensorFlow란 무엇이며, Keras는 어떻게 TensorFlow와 함께 신경망을 만드는가?

실행 환경: Google Colaboratory

아래 코드는 Google Colaboratory에서 실행합니다. Google Colab(Colaboratory)은 브라우저에서 별도의 설정 없이 Python 코드를 실행할 수 있도록 도와주며, GPU(그래픽 처리 장치)에 무료로 접근할 수 있다는 장점이 있습니다. Colaboratory는 Jupyter Notebook을 기반으로 만들어졌습니다.

print("문장이 단어의 시작인지 확인")
sentence_char_starts_word = tf.concat(
    [tf.fill([sentence_char_script.nrows(), 1], True),
     tf.not_equal(sentence_char_script[:, 1:], sentence_char_script[:, :-1])],
    axis=1)
print("모든 문장의 평탄화된 문자 목록에서 문자의 인덱스가 특정 단어의 시작 인덱스인지 확인")
word_starts = tf.squeeze(tf.where(sentence_char_starts_word.values), axis=1)
print(word_starts)
print("모든 단어의 모든 문자에 대한 코드 포인트 얻기")
word_char_codepoint = tf.RaggedTensor.from_row_starts(
    values=sentence_char_codepoint.values,
    row_starts=word_starts)
print(word_char_codepoint)

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

출력 결과

문장이 단어의 시작인지 확인
모든 문장의 평탄화된 문자 목록에서 문자의 인덱스가 특정 단어의 시작 인덱스인지 확인
tf.Tensor([ 0  5  7 12 13 15], shape=(6,), dtype=int64)
모든 단어의 모든 문자에 대한 코드 포인트 얻기
<tf.RaggedTensor [[72, 101, 108, 108, 111], [44, 32], [116, 104, 101, 114, 101], [46], [19990, 30028], [12371, 12435, 12395, 12385, 12399]]>

설명

  • 스크립트 식별자는 단어 경계를 어디에 추가해야 하는지 결정하는 데 활용됩니다.
  • 단어 경계는 모든 문장의 시작 부분과, 바로 앞 문자와 스크립트가 다른 각 문자 앞에 추가됩니다.
  • 다음으로, 이렇게 구한 시작 오프셋을 사용하여 RaggedTensor를 생성합니다.
  • 이 RaggedTensor에는 전체 배치에 포함된 단어들의 목록이 저장됩니다.