서브워드 토크나이저 구현하기
이 단계에서는 탐욕적 최장 일치 우선 알고리즘 (greedy longest-match-first algorithm) 을 사용하여 영어 단어에 대한 문자 수준 토큰화를 수행하는 서브워드 토크나이저 함수를 구현합니다. 이 함수는 또한 입력 문자열에서 공백을 포함한 모든 기호를 제거합니다.
코드 편집기에서 subword_tokenizer.py 파일을 엽니다. 이 파일에는 subword_tokenizer() 함수의 뼈대가 포함되어 있습니다. 여러분의 과제는 함수의 누락된 부분을 채우는 것입니다.
이 함수는 다음과 같은 요구 사항을 충족해야 합니다:
- 함수는 문자열을 입력으로 받아야 합니다. 이 함수는 영어 문자, 숫자 및 구두점을 포함하는 문자열을 받습니다. 문자열은 이미 제공되었으며, 문자열의 내용을 변경할 수 없습니다.
- 함수는 토큰화 결과를 리스트로 반환해야 합니다.
다음은 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)