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

如何在TensorFlow中轻松处理CSV文件中的文本数据并完成编码?

解决方案:垃圾邮件数据集的文本与类别数字化处理

问题根源分析

  • 报错核心原因:dataset.unbatch().map(lambda x, y: x)返回的是包含Message的OrderedDict,而TextVectorization.adapt需要直接接收字符串Tensor;同时你写的标准化函数混用了Python原生操作(re、string.punctuation)和TensorFlow张量,导致类型不匹配。
  • 数据结构问题:make_csv_dataset返回的是**(特征字典, 标签)**的数据集结构,特征字典里的Message是字符串张量,标签Category是字符串张量数组。

分步实现方案

1. 修正数据集加载与文本标准化流程

用纯TensorFlow操作实现文本预处理,同时正确提取Message字段用于适配向量化层:

import tensorflow as tf
from tensorflow.keras import layers

# 加载数据集(保持你的原有加载逻辑)
dataset = tf.data.experimental.make_csv_dataset(
    file_pattern="directory_to_file",
    batch_size=32,
    column_names=['Category','Message'],
    column_defaults=[tf.string,tf.string],
    label_name='Category',
    field_delim=',',
    header=True,
    num_epochs=1,
)

# 纯TensorFlow实现文本标准化:避免混用Python原生操作
def standardize_text(text):
    # 转小写
    lowercase = tf.strings.lower(text)
    # 用TensorFlow正则移除标点符号
    return tf.strings.regex_replace(lowercase, '[!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~]', '')

# 定义文本向量化层
vectorization = layers.TextVectorization(
    standardize=standardize_text,
    max_tokens=1000,
    output_mode='int',
    output_sequence_length=200,
)

# 提取单独的Message张量,用于适配向量化层
message_dataset = dataset.unbatch().map(lambda x, y: x['Message'])
vectorization.adapt(message_dataset)

2. 类别(Category)的数字化编码

对于ham/spam二分类标签,用StringLookup层实现字符串到数字的映射:

# 方式1:已知类别集合时,手动指定词汇表
category_lookup = layers.StringLookup(
    vocabulary=['ham', 'spam'],
    output_mode='int',
    num_oov_indices=0  # 仅两类,不需要处理未知类别
)

# 方式2:未知类别时,从数据中自动适配
# category_dataset = dataset.unbatch().map(lambda x, y: y)
# category_lookup.adapt(category_dataset)

3. 整合完整的训练数据集管道

将文本向量化和类别编码整合到数据集映射中,得到可直接用于训练的数字格式数据集:

def preprocess_data(features, labels):
    # 处理文本特征
    vectorized_text = vectorization(features['Message'])
    # 处理标签
    vectorized_label = category_lookup(labels)
    # 可选:若使用categorical_crossentropy,可转为one-hot格式
    # vectorized_label = tf.one_hot(vectorized_label, depth=2)
    return vectorized_text, vectorized_label

# 应用预处理并开启预取优化
processed_dataset = dataset.map(preprocess_data).prefetch(tf.data.AUTOTUNE)

关键注意事项

  • 避免在TensorFlow图模式中混用Python原生操作:所有数据处理逻辑尽量用TensorFlow API实现(如tf.strings、tf.regex),保证兼容性。
  • 明确tf.data数据集结构:make_csv_dataset返回的是(特征字典, 标签)结构,必须提取对应字段再处理,不能直接传入整个字典到向量化层。
  • 类别编码灵活选择:已知类别时手动指定词汇表更高效;未知类别时用adapt自动识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:52:54