You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow TextVectorization处理UTF-8文本时出现编码错误求助

UTF-8文本适配TextVectorization层时的ASCII编码错误解决方法

问题描述

执行以下代码尝试用UTF-8编码文本适配TensorFlow的TextVectorization层时:

encoder = tf.keras.layers.TextVectorization(
    max_tokens=VOCAB_SIZE,
    standardize="lower",
)

encoder.adapt(train.map(
    lambda doc, label : doc
))

触发如下编码错误:

UnicodeEncodeError: 'ascii' codec can't encode character '\u2122' in position 49: ordinal not in range(128)

输入文本为UTF-8编码,按预期应与TensorFlow兼容。

环境信息

  • TensorFlow版本:2.10.0
  • Python版本:3.10.8
  • 平台:Linux

完整回溯信息

InvalidArgumentError                      Traceback (most recent call last)
Cell In [10], line 8
      1 VOCAB_SIZE = 5000
      3 encoder = tf.keras.layers.TextVectorization(
      4     max_tokens=VOCAB_SIZE,
      5     standardize="lower",
      6 )
----> 8 encoder.adapt(train.map(
      9     lambda doc, label : doc
     10 ))

File ~/.local/lib/python3.10/site-packages/keras/layers/preprocessing/text_vectorization.py:467, in TextVectorization.adapt(self, data, batch_size, steps)
    417 def adapt(self, data, batch_size=None, steps=None):
    418     """Computes a vocabulary of string terms from tokens in a dataset.
    419 
    420     Calling `adapt()` on a `TextVectorization` layer is an alternative to
   (...)
    465           argument is not supported with array inputs.
    466     """
--> 467     super().adapt(data, batch_size=batch_size, steps=steps)

File ~/.local/lib/python3.10/site-packages/keras/engine/base_preprocessing_layer.py:258, in PreprocessingLayer.adapt(self, data, batch_size, steps)
    256 with data_handler.catch_stop_iteration():
    257     for _ in data_handler.steps():
--> 258         self._adapt_function(iterator)
    259         if data_handler.should_sync:
    260             context.async_wait()

File ~/.local/lib/python3.10/site-packages/tensorflow/python/util/traceback_utils.py:153, in filter_traceback.<locals>.error_handler(*args, **kwargs)
    151 except Exception as e:
    152   filtered_tb = _process_traceback_frames(e.__traceback__)
--> 153   raise e.with_traceback(filtered_tb) from None
    154 finally:
    155   del filtered_tb

File ~/.local/lib/python3.10/site-packages/tensorflow/python/eager/execute.py:54, in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     52 try:
     53   ctx.ensure_initialized()
--> 54   tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
     55                                       inputs, attrs, num_outputs)
     56 except core._NotOkStatusException as e:
     57   if name is not None:

InvalidArgumentError: Graph execution error:

2 root error(s) found.
  (0) INVALID_ARGUMENT:  UnicodeEncodeError: 'ascii' codec can't encode character '\xae' in position 401: ordinal not in range(128)
Traceback (most recent call last):

  File "/home/moss/.local/lib/python3.10/site-packages/tensorflow/python/ops/script_ops.py", line 279, in __call__
    return [self._convert(x) for x in ret]

  File "/home/moss/.local/lib/python3.10/site-packages/tensorflow/python/ops/script_ops.py", line 279, in <listcomp>
    return [self._convert(x) for x in ret]

  File "/home/moss/.local/lib/python3.10/site-packages/tensorflow/python/ops/script_ops.py", line 237, in _convert
    return result.astype(np.bytes_)

UnicodeEncodeError: 'ascii' codec can't encode character '\xae' in position 401: ordinal not in range(128)


     [[{{node PyFunc}}]]
     [[IteratorGetNext]]
     [[UniqueWithCounts/_6]]
  (1) INVALID_ARGUMENT:  UnicodeEncodeError: 'ascii' codec can't encode character '\xae' in position 401: ordinal not in range(128)
Traceback (most recent call last):

  File "/home/moss/.local/lib/python3.10/site-packages/tensorflow/python/ops/script_ops.py", line 279, in __call__
    return [self._convert(x) for x in ret]

  File "/home/moss/.local/lib/python3.10/site-packages/tensorflow/python/ops/script_ops.py", line 279, in <listcomp>
    return [self._convert(x) for x in ret]

  File "/home/moss/.local/lib/python3.10/site-packages/tensorflow/python/ops/script_ops.py", line 237, in _convert
    return result.astype(np.bytes_)

UnicodeEncodeError: 'ascii' codec can't encode character '\xae' in position 401: ordinal not in range(128)


     [[{{node PyFunc}}]]
     [[IteratorGetNext]]
0 successful operations.
0 derived errors ignored. [Op:__inference_adapt_step_195]

解决方法

该问题源于TensorFlow处理字符串时,系统默认编码被设置为ASCII,可通过以下方式解决:

1. 强制设置UTF-8环境编码

在运行脚本前设置环境变量:

export PYTHONIOENCODING=utf-8
export LC_ALL=C.UTF-8
export LANG=C.UTF-8

或者在Python代码开头添加:

import os
os.environ['PYTHONIOENCODING'] = 'utf-8'
os.environ['LC_ALL'] = 'C.UTF-8'
os.environ['LANG'] = 'C.UTF-8'

2. 自定义标准化函数过滤特殊字符

如果不想修改环境变量,可自定义标准化逻辑,过滤或替换无法用ASCII编码的特殊字符:

import tensorflow as tf

def custom_standardize(input_data):
    # 转换为小写
    lowercase = tf.strings.lower(input_data)
    # 保留字母、数字、空格及常见标点,移除其他特殊Unicode字符
    cleaned = tf.strings.regex_replace(lowercase, r'[^a-zA-Z0-9\s.,!?]', '')
    return cleaned

encoder = tf.keras.layers.TextVectorization(
    max_tokens=VOCAB_SIZE,
    standardize=custom_standardize,
)

encoder.adapt(train.map(lambda doc, label: doc))

3. 升级TensorFlow版本

该编码问题在TensorFlow 2.11及以上版本中已被修复,直接升级到最新稳定版即可解决:

pip install --upgrade tensorflow

内容的提问来源于stack exchange,提问作者Moss Richardson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:15:34