自然言語処理の文脈でルックアップテーブルが頻繁に出てくるので何なのかまとめm
どんなときに使うのか
-
文字列→数値ID変換
自然言語処理で「単語」や「トークン」を ID に置き換えるとき。 -
カテゴリ変数の前処理
ユーザー属性や商品のカテゴリなどを下流のモデルに渡す前に整数にマッピング。 -
未知語(OOV: Out-Of-Vocabulary)の扱い
語彙に存在しないキーが来たときにデフォルト値を返して処理を安定化。 -
高速アクセスが必要なとき
学習中や推論中に何度も同じマッピングを呼び出す場合に効率よくルックアップ可能。
作成方法
1. 低レベル API (tf.lookup
)
import tensorflow as tf
# ① キー/値のテンソルを用意
keys = tf.constant(["apple", "banana", "cherry"])
values = tf.constant([0, 1, 2])
# ② Initializer を作成
initializer = tf.lookup.KeyValueTensorInitializer(
keys=keys,
values=values,
key_dtype=tf.string,
value_dtype=tf.int64
)
# ③ StaticHashTable を構築(OOV は -1 を返す)
table = tf.lookup.StaticHashTable(
initializer,
default_value=-1
)
# ④ 使ってみる
inputs = tf.constant(["banana", "durian"])
ids = table.lookup(inputs) # → [1, -1]
2. 高レベル API (Keras 前処理レイヤー)
-
StringLookup
:文字列を整数 ID に自動変換 -
IntegerLookup
:整数カテゴリを該当レンジに再マッピング
from tensorflow import keras
# 語彙リストを渡すだけで内部テーブルを自動生成
lookup = keras.layers.StringLookup(
vocabulary=["apple", "banana", "cherry"],
mask_token=None, # マスクトークンを使わない
oov_token="[UNK]" # 未知語は [UNK]→ID 1 にマッピング
)
# 変換例
ids = lookup(tf.constant(["banana", "durian"]))
# → [2, 1] ('durian' は OOV として ID=1)
まとめ
- ルックアップテーブルは「キー→値」の高速マッピング機構で、文字列やカテゴリをモデルで扱いやすい数値に変換するときに使います。
-
低レベル API(
tf.lookup.StaticHashTable
など)は柔軟に初期化方法を指定可能。 -
高レベル API(
StringLookup
/IntegerLookup
)は語彙リストを渡すだけで簡単に使えて、前処理パイプラインに組み込みやすいです。 - 未登録キーへの対応や、学習済み埋め込み行列の初期化なども含めて、幅広い前処理シナリオで活躍します。