Keras 3 API 文件 / 層 API / 預處理層 / 文字預處理 / TextVectorization 層

TextVectorization 層

[原始碼]

TextVectorization 類別

keras.layers.TextVectorization(
    max_tokens=None,
    standardize="lower_and_strip_punctuation",
    split="whitespace",
    ngrams=None,
    output_mode="int",
    output_sequence_length=None,
    pad_to_max_tokens=False,
    vocabulary=None,
    idf_weights=None,
    sparse=False,
    ragged=False,
    encoding="utf-8",
    name=None,
    **kwargs
)

一個預處理層,將文字特徵映射到整數序列。

這個層提供了在 Keras 模型中管理文字的基本選項。它將一批字串(一個範例 = 一個字串)轉換成符記索引列表(一個範例 = 整數符記索引的一維張量)或稠密表示(一個範例 = 代表該範例符記相關資料的浮點數值的一維張量)。這個層旨在處理自然語言輸入。若要處理簡單的字串輸入(類別字串或預先符記化的字串),請參閱 kers_core.layers.StringLookup

這個層的詞彙表必須在建構時提供或透過 adapt() 來學習。當這個層被調整時,它會分析資料集,判斷個別字串值的頻率,並從中建立詞彙表。此詞彙表可以是無限大小或有上限,取決於此層的組態選項;如果輸入中的唯一值數量超過最大詞彙表大小,則會使用最常見的詞彙來建立詞彙表。

每個範例的處理包含以下步驟

  1. 標準化每個範例(通常是小寫化 + 去除標點符號)
  2. 將每個範例分割成子字串(通常是單字)
  3. 將子字串重新組合成符記(通常是 n 元語法)
  4. 索引符記(將唯一的整數值與每個符記關聯)
  5. 使用此索引轉換每個範例,轉換成整數向量或稠密浮點向量。

關於傳遞可呼叫物件以自訂此層的分割和正規化的注意事項

  1. 任何可呼叫物件都可以傳遞到此層,但如果您想序列化此物件,您應該只傳遞註冊為 Keras 可序列化的函數(有關詳細資訊,請參閱 keras.saving.register_keras_serializable)。
  2. 當使用自訂的可呼叫物件進行 standardize 時,可呼叫物件收到的資料將與傳遞到此層的資料完全相同。可呼叫物件應傳回與輸入相同形狀的張量。
  3. 當使用自訂的可呼叫物件進行 split 時,可呼叫物件收到的資料會擠出第 1 個維度 - 可呼叫物件會看到 ["string to split", "another string to split"],而不是 [["string to split"], ["another string to split"]]。可呼叫物件應傳回 dtype 為 stringtf.Tensor,且第一個維度包含分割的符記 - 在此範例中,我們應該看到類似 [["string", "to", "split"], ["another", "string", "to", "split"]] 的內容。

注意: 此層在內部使用 TensorFlow。它不能用作任何後端(TensorFlow 除外)模型編譯計算圖的一部分。但是,在以 Eager 模式執行時,它可以與任何後端一起使用。它也可以始終用作任何後端(在模型本身之外)的輸入預處理管線的一部分,這是我們建議使用此層的方式。

注意: 此層可以在 tf.data 管線內安全使用(與您使用的後端無關)。

引數

  • max_tokens:此層的詞彙表最大大小。只有在調整詞彙表或設定 pad_to_max_tokens=True 時,才應指定此值。請注意,此詞彙表包含 1 個 OOV 符記,因此有效的符記數為 (max_tokens - 1 - (1 if output_mode == "int" else 0))
  • standardize:用於套用至輸入文字的標準化可選規格。值可以是
    • None:不進行標準化。
    • "lower_and_strip_punctuation":文字會轉換成小寫並移除所有標點符號。
    • "lower":文字會轉換成小寫。
    • "strip_punctuation":所有標點符號都會移除。
    • 可呼叫物件:輸入會傳遞至可呼叫函數,該函數應標準化並傳回。
  • split:用於分割輸入文字的可選規格。值可以是
    • None:不進行分割。
    • "whitespace":以空白分割。
    • "character":以每個 Unicode 字元分割。
    • 可呼叫物件:標準化的輸入會傳遞至可呼叫函數,該函數應分割並傳回。
  • ngrams:用於從可能已分割的輸入文字建立 n 元語法可選規格。值可以是 None、整數或整數元組;傳遞整數會建立最多該整數的 n 元語法,而傳遞整數元組會建立元組中指定值的 n 元語法。傳遞 None 表示不會建立任何 n 元語法。
  • output_mode:此層輸出的可選規格。值可以是 "int""multi_hot""count""tf_idf",如下設定此層
    • "int":輸出整數索引,每個分割的字串符記一個整數索引。當 output_mode == "int" 時,0 保留給遮罩位置;這會將詞彙大小縮減為 max_tokens - 2 而不是 max_tokens - 1
    • "multi_hot":每個批次輸出一個整數陣列,大小為 vocab_size 或 max_tokens,其中包含所有元素中的 1,其中對應到該索引的符記在批次項目中至少出現一次。
    • "count":類似 "multi_hot",但整數陣列包含該索引處符記在批次項目中出現次數的計數。
    • "tf_idf":類似 "multi_hot",但應用 TF-IDF 演算法來尋找每個符記位置中的值。對於 "int" 輸出,支援任何形狀的輸入和輸出。對於所有其他輸出模式,目前僅支援等級 1 的輸入(以及分割後的等級 2 輸出)。
  • output_sequence_length:僅在 INT 模式下有效。如果設定,則輸出時間維度會以 output_sequence_length 值精確填補或截斷,無論分割步驟產生多少符記,都會產生形狀為 (batch_size, output_sequence_length) 的張量。預設值為 None。如果 raggedTrue,則 output_sequence_length 仍可能會截斷輸出。
  • pad_to_max_tokens:僅在 "multi_hot""count""tf_idf" 模式下有效。如果為 True,則即使詞彙表中唯一符記的數量少於 max_tokens,輸出的特徵軸也會填補到 max_tokens,無論詞彙表大小為何,都會產生形狀為 (batch_size, max_tokens) 的張量。預設值為 False
  • vocabulary:選用。字串陣列或文字檔案的字串路徑。如果傳遞陣列,可以傳遞包含字串詞彙表詞彙的元組、列表、一維 NumPy 陣列或一維張量。如果傳遞檔案路徑,檔案的每行應包含詞彙表中的一個詞彙。如果設定了此引數,則無需 adapt() 此層。
  • idf_weights:僅在 output_mode"tf_idf" 時有效。與詞彙表長度相同的元組、列表、一維 NumPy 陣列或一維張量,包含浮點數逆向文件頻率權重,最終 tf_idf 權重將乘以每個樣本的詞彙計數。如果設定了 vocabulary 引數,且 output_mode"tf_idf",則必須提供此引數。
  • ragged:布林值。僅適用於 "int" 輸出模式。僅支援 TensorFlow 後端。如果為 True,則傳回 RaggedTensor 而不是稠密 Tensor,其中每個序列在字串分割後可能具有不同的長度。預設值為 False
  • sparse:布林值。僅適用於 "multi_hot""count""tf_idf" 輸出模式。僅支援 TensorFlow 後端。如果為 True,則傳回 SparseTensor 而不是稠密 Tensor。預設值為 False
  • encoding:選用。用於解讀輸入字串的文字編碼。預設值為 "utf-8"

範例

此範例實例化一個 TextVectorization 層,該層會將文字轉換為小寫、以空白分割、去除標點符號,並輸出整數詞彙索引。

>>> max_tokens = 5000  # Maximum vocab size.
>>> max_len = 4  # Sequence length to pad the outputs to.
>>> # Create the layer.
>>> vectorize_layer = TextVectorization(
...     max_tokens=max_tokens,
...     output_mode='int',
...     output_sequence_length=max_len)
>>> # Now that the vocab layer has been created, call `adapt` on the
>>> # list of strings to create the vocabulary.
>>> vectorize_layer.adapt(["foo bar", "bar baz", "baz bada boom"])
>>> # Now, the layer can map strings to integers -- you can use an
>>> # embedding layer to map these integers to learned embeddings.
>>> input_data = [["foo qux bar"], ["qux baz"]]
>>> vectorize_layer(input_data)
array([[4, 1, 3, 0],
       [1, 2, 0, 0]])

此範例透過將詞彙表詞彙列表傳遞至此層的 __init__() 方法來實例化一個 TextVectorization 層。

>>> vocab_data = ["earth", "wind", "and", "fire"]
>>> max_len = 4  # Sequence length to pad the outputs to.
>>> # Create the layer, passing the vocab directly. You can also pass the
>>> # vocabulary arg a path to a file containing one vocabulary word per
>>> # line.
>>> vectorize_layer = keras.layers.TextVectorization(
...     max_tokens=max_tokens,
...     output_mode='int',
...     output_sequence_length=max_len,
...     vocabulary=vocab_data)
>>> # Because we've passed the vocabulary directly, we don't need to adapt
>>> # the layer - the vocabulary is already set. The vocabulary contains the
>>> # padding token ('') and OOV token ('[UNK]')
>>> # as well as the passed tokens.
>>> vectorize_layer.get_vocabulary()
['', '[UNK]', 'earth', 'wind', 'and', 'fire']