하나를 둘로 자르기

PythonBeginner
지금 연습하기

소개

이 프로젝트에서는 자연어 처리 (Natural Language Processing, NLP) 작업에서 중요한 단계인 서브워드 토크나이저 (subword tokenizer) 를 구현하는 방법을 배우게 됩니다. 토큰화 (Tokenization) 는 텍스트 문자열을 개별 단어, 문자 또는 서브워드 (subword) 와 같은 더 작은 단위인 토큰 (token) 으로 분해하는 과정입니다. 이 프로젝트는 영어 및 기타 라틴어 기반 언어에서 일반적으로 사용되는 서브워드 수준의 토큰화에 중점을 둡니다.

👀 미리보기

['I', 'studied', 'in', 'LabEx', 'for', '1', '0', 'days', 'and', 'completed', 'the', '[UNK]', '[UNK]', 'course', '.']

🎯 과제

이 프로젝트에서는 다음을 배우게 됩니다:

  • 탐욕적 최장 일치 우선 알고리즘 (greedy longest-match-first algorithm) 을 사용하여 문자 수준 토큰화를 수행하는 서브워드 토크나이저 함수를 구현하는 방법
  • 제공된 예시로 서브워드 토크나이저를 테스트하고 출력을 분석하는 방법
  • 토큰화 알고리즘과 구현을 이해하는 방법

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다:

  • 자연어 처리 작업에서 토큰화의 중요성을 이해합니다.
  • 자연어 처리 파이프라인 (pipeline) 의 핵심 구성 요소를 구현합니다.
  • 문자 수준 토큰화와 서브워드 수준 토큰화를 구별합니다.
  • 탐욕적 최장 일치 우선 알고리즘을 적용하여 텍스트를 서브워드로 토큰화합니다.

토큰화 과정 이해하기

이 단계에서는 토큰화 과정과 자연어 처리 (Natural Language Processing, NLP) 작업에서의 중요성에 대해 배우게 됩니다.

토큰화 (Tokenization) 는 텍스트 문자열을 토큰 (token) 이라고 하는 더 작은 단위로 분해하는 과정입니다. 이러한 토큰은 사용되는 특정 토큰화 방법에 따라 개별 단어, 문자 또는 서브워드 (subword) 가 될 수 있습니다.

자연어 처리 작업에서 대부분의 기계 학습 모델은 문자열 데이터를 직접 지원하지 않습니다. 모델이 효과적으로 학습하려면 문자열 데이터를 수치화해야 하며, 이를 토큰화라고 합니다. 토큰화는 또한 수치화를 위한 준비 단계이며, 수치화에는 매핑 테이블 (mapping table) 에서 제공되는 매핑이 필요합니다.

문자 수준 토큰화 (character-level tokenization) 는 언어의 가장 작은 기호를 기준으로 문자열을 나누는 방법이며, 영어 토큰화에 일반적으로 사용됩니다.

서브워드 수준 토큰화 (subword-level tokenization) 는 영어 및 기타 라틴어 기반 언어에서 일반적으로 사용되며, 단어 수준 토큰화 (word-level tokenization) 의 개선된 형태입니다.

✨ 솔루션 확인 및 연습

서브워드 토크나이저 구현하기

이 단계에서는 탐욕적 최장 일치 우선 알고리즘 (greedy longest-match-first algorithm) 을 사용하여 영어 단어에 대한 문자 수준 토큰화를 수행하는 서브워드 토크나이저 함수를 구현합니다. 이 함수는 또한 입력 문자열에서 공백을 포함한 모든 기호를 제거합니다.

코드 편집기에서 subword_tokenizer.py 파일을 엽니다. 이 파일에는 subword_tokenizer() 함수의 뼈대가 포함되어 있습니다. 여러분의 과제는 함수의 누락된 부분을 채우는 것입니다.

이 함수는 다음과 같은 요구 사항을 충족해야 합니다:

  1. 함수는 문자열을 입력으로 받아야 합니다. 이 함수는 영어 문자, 숫자 및 구두점을 포함하는 문자열을 받습니다. 문자열은 이미 제공되었으며, 문자열의 내용을 변경할 수 없습니다.
  2. 함수는 토큰화 결과를 리스트로 반환해야 합니다.

다음은 subword_tokenizer() 함수의 전체 코드입니다:

import re

def subword_tokenizer(text, vocab) -> list:
    """
    제공된 어휘를 기반으로 입력 텍스트를 서브워드로 토큰화합니다.

    인수:
    - text (str): 토큰화할 입력 텍스트.
    - vocab (list): 서브워드를 포함하는 어휘 목록.

    반환값:
    - list: 서브워드 토큰의 목록.
    """

    def is_in_vocab(word) -> bool:
        """
        주어진 단어가 어휘에 있는지 확인합니다.

        인수:
        - word (str): 확인할 단어.

        반환값:
        - bool: 단어가 어휘에 있으면 True, 그렇지 않으면 False.
        """
        return word in vocab

    def find_longest_match(word) -> tuple:
        """
        어휘에서 주어진 단어에 대한 가장 긴 일치하는 서브워드를 찾습니다.

        인수:
        - word (str): 일치하는 항목을 찾을 단어.

        반환값:
        - tuple: 가장 긴 일치하는 서브워드와 단어의 나머지 부분을 포함하는 튜플.
        """
        for i in range(len(word), 0, -1):
            subword = word[:i]
            if is_in_vocab(subword):
                return subword, word[i:]
        return "[UNK]", ""

    tokens = []
    ## 영숫자가 아닌 문자를 제거하고 텍스트를 단어로 분할합니다.
    words = re.findall(r"\b\w+\b", text)

    for word in words:
        while word:
            subword, remaining = find_longest_match(word)
            tokens.append(subword)
            word = remaining

    return tokens


if __name__ == "__main__":
    ## 예시 사용법:
    vocab = [
        "I",
        "studied",
        "in",
        "LabEx",
        "for",
        "1",
        "0",
        "days",
        "and",
        "completed",
        "the",
        "course",
    ]
    text = "I studied in LabEx for 10 days and completed the TensorFlow Serving course."

    tokenization_result = subword_tokenizer(text, vocab)
    print(tokenization_result)
✨ 솔루션 확인 및 연습

서브워드 토크나이저 테스트

이 단계에서는 제공된 예시를 사용하여 subword_tokenizer() 함수를 테스트하고 출력을 확인합니다.

터미널에서 subword_tokenizer.py 스크립트를 실행합니다:

python3 subword_tokenizer.py

출력은 다음과 유사해야 합니다:

['I', 'studied', 'in', 'LabEx', 'for', '1', '0', 'days', 'and', 'completed', 'the', '[UNK]', '[UNK]', 'course', '.']

출력을 관찰하고 토큰화 프로세스가 예상대로 작동하는지 확인합니다. 함수는 입력 텍스트를 서브워드 목록으로 토큰화해야 하며, 여기서 알 수 없는 단어는 [UNK] 토큰으로 표시됩니다.

✨ 솔루션 확인 및 연습

토큰화 알고리즘 이해

이 단계에서는 subword_tokenizer() 함수의 구현을 더 자세히 살펴보고 토큰화 알고리즘을 이해합니다.

subword_tokenizer() 함수는 탐욕적 최장 일치 우선 알고리즘 (greedy longest-match-first algorithm) 을 사용하여 입력 텍스트를 토큰화합니다. 알고리즘은 다음과 같이 작동합니다:

  1. 함수는 먼저 입력 텍스트에서 모든 영숫자가 아닌 문자를 제거하고 텍스트를 개별 단어로 분할합니다.
  2. 각 단어에 대해 함수는 제공된 어휘에서 가장 긴 일치하는 서브워드를 찾으려고 시도합니다.
  3. 어휘에서 서브워드가 발견되면 토큰 목록에 추가됩니다. 서브워드가 발견되지 않으면 [UNK] 토큰이 목록에 추가됩니다.
  4. 입력 텍스트의 모든 단어가 토큰화될 때까지 프로세스가 계속됩니다.

is_in_vocab() 함수는 주어진 단어가 제공된 어휘에 있는지 확인하는 도우미 함수입니다.

find_longest_match() 함수는 토큰화 알고리즘의 핵심입니다. 가능한 가장 긴 서브워드부터 시작하여 단어를 반복하고 현재 서브워드가 어휘에 있는지 확인합니다. 일치하는 항목이 발견되면 서브워드와 단어의 나머지 부분을 반환합니다. 일치하는 항목이 없으면 [UNK] 토큰과 빈 문자열을 반환합니다.

토큰화 알고리즘을 이해하면 서브워드 토크나이저를 더욱 개선하거나 다른 사용 사례에 적용하는 데 도움이 됩니다.

✨ 솔루션 확인 및 연습

요약

축하합니다! 이 프로젝트를 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.