はじめに
このプロジェクトでは、自然言語処理タスクにおける重要なステップであるサブワードトークナイザを実装する方法を学びます。トークナイゼーションとは、文章文字列を個々の単語、文字、またはサブワードなどの小さな単位に分解するプロセスです。このプロジェクトでは、英語やその他のラテン文字系言語で一般的に使用されるサブワードレベルのトークナイゼーションに焦点を当てています。
👀 プレビュー
['I', 'studied', 'in', 'LabEx', 'for', '1', '0', 'days', 'and', 'completed', 'the', '[UNK]', '[UNK]', 'course', '.']
🎯 タスク
このプロジェクトでは、以下のことを学びます。
- 貪欲な最長一致優先アルゴリズムを使用して文字レベルのトークナイゼーションを行うサブワードトークナイザ関数を実装する方法
- 提供された例を使ってサブワードトークナイザをテストし、出力を分析する方法
- トークナイゼーションアルゴリズムとその実装を理解する方法
🏆 成果
このプロジェクトを完了すると、以下のことができるようになります。
- 自然言語処理タスクにおけるトークナイゼーションの重要性を理解する
- 自然言語処理パイプラインのコアコンポーネントを実装する
- 文字レベルとサブワードレベルのトークナイゼーションの違いを識別する
- 貪欲な最長一致優先アルゴリズムを適用して文章をサブワードにトークナイズする
トークナイゼーションプロセスを理解する
このステップでは、トークナイゼーションプロセスとその自然言語処理タスクにおける重要性について学びます。
トークナイゼーションとは、文章文字列をトークンと呼ばれる小さな単位に分解するプロセスです。これらのトークンは、使用される特定のトークナイゼーション方法に応じて、個々の単語、文字、またはサブワードであることができます。
自然言語処理タスクでは、ほとんどの機械学習モデルは直接文字列データをサポートしていません。モデルが効果的に学習するためには、文字列データを数値化する必要があり、これはトークナイゼーションと呼ばれるプロセスです。トークナイゼーションはまた、数値化のための準備でもあり、数値化にはマッピングテーブルによって提供されるマッピングが必要です。
文字レベルのトークナイゼーションは、言語の最小の記号に基づいて文字列を分割する方法であり、英語のトークナイゼーションにおいて一般的に使用されます。
サブワードレベルのトークナイゼーションは、英語やその他のラテン文字系言語で一般的に使用されており、単語レベルのトークナイゼーションの改良版です。
サブワードトークナイザを実装する
このステップでは、貪欲な最長一致優先アルゴリズムを使って英単語に対して文字レベルのトークナイゼーションを行うサブワードトークナイザ関数を実装します。この関数は、入力文字列からスペースを含むすべての記号を削除します。
コードエディタで 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)
サブワードトークナイザをテストする
このステップでは、提供された例を使って 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() 関数は、入力テキストをトークナイズするために貪欲な最長一致優先アルゴリズムを使用しています。このアルゴリズムの動作方法は以下の通りです。
- 関数は最初に、入力テキストからすべての非アルファベット数字の文字を削除し、テキストを個々の単語に分割します。
- 各単語に対して、関数は提供された語彙内で最も長い一致するサブワードを探そうとします。
- 語彙内にサブワードが見つかれば、それはトークンのリストに追加されます。サブワードが見つからなければ、
[UNK]トークンがリストに追加されます。 - このプロセスは、入力テキスト内のすべての単語がトークナイズされるまで続けられます。
is_in_vocab() 関数は、与えられた単語が提供された語彙に含まれているかどうかを確認するためのヘルパー関数です。
find_longest_match() 関数は、トークナイゼーションアルゴリズムの核心部分です。これは、可能な最長のサブワードから始めて単語を反復し、現在のサブワードが語彙に含まれているかどうかを確認します。一致が見つかれば、そのサブワードと単語の残りの部分を返します。一致が見つからなければ、[UNK] トークンと空の文字列を返します。
トークナイゼーションアルゴリズムを理解することで、サブワードトークナイザをさらに改善したり、異なる使用ケースに適応させることができます。
まとめ
おめでとうございます!このプロジェクトを完了しました。実力を向上させるために、LabEx でさらに多くの実験を行って練習してください。



