サブワードトークナイザを実装する
このステップでは、貪欲な最長一致優先アルゴリズムを使って英単語に対して文字レベルのトークナイゼーションを行うサブワードトークナイザ関数を実装します。この関数は、入力文字列からスペースを含むすべての記号を削除します。
コードエディタで 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)