Tensorflow - 数据集中的字符串处理 API
Tensorflow - String processing in Dataset API
我在 <text>\t<label>
格式的目录中有 .txt
个文件。我正在使用 TextLineDataset
API 来使用这些文本记录:
filenames = ["/var/data/file1.txt", "/var/data/file2.txt"]
dataset = tf.contrib.data.Dataset.from_tensor_slices(filenames)
dataset = dataset.flat_map(
lambda filename: (
tf.contrib.data.TextLineDataset(filename)
.map(_parse_data)))
def _parse_data(line):
line_split = tf.string_split([line], '\t')
features = {"raw_text": tf.string(line_split.values[0].strip().lower()),
"label": tf.string_to_number(line_split.values[1],
out_type=tf.int32)}
parsed_features = tf.parse_single_example(line, features)
return parsed_features["raw_text"], raw_features["label"]
我想在 raw_text 功能上做一些字符串 cleaning/processing。当我尝试 运行 line_split.values[0].strip().lower()
时,出现以下错误:
AttributeError: 'Tensor' object has no attribute 'strip'
对象 lines_split.values[0]
是一个 tf.Tensor
对象,代表 line
的第 0 个拆分。它不是 Python 字符串,因此它没有 .strip()
或 .lower()
方法。相反,您必须将 TensorFlow 操作应用于张量才能执行转换。
TensorFlow 目前没有很多 string operations, but you can use the tf.py_func()
op 到 运行 一些 Python 代码 tf.Tensor
:
def _parse_data(line):
line_split = tf.string_split([line], '\t')
raw_text = tf.py_func(
lambda x: x.strip().lower(), line_split.values[0], tf.string)
label = tf.string_to_number(line_split.values[1], out_type=tf.int32)
return {"raw_text": raw_text, "label": label}
请注意,问题中的代码还有其他几个问题:
- 不要使用
tf.parse_single_example()
。此操作仅用于解析 tf.train.Example
协议缓冲区字符串;解析文本时不需要使用它,可以直接从_parse_data()
. 中return提取特征
- 使用
dataset.map()
instead of dataset.flat_map()
。当映射函数的结果是 Dataset
对象时,您只需要使用 flat_map()
(因此 return 值需要 展平 到单个数据集)。当结果是一个或多个 tf.Tensor
个对象时,您必须使用 map()
。
我在 <text>\t<label>
格式的目录中有 .txt
个文件。我正在使用 TextLineDataset
API 来使用这些文本记录:
filenames = ["/var/data/file1.txt", "/var/data/file2.txt"]
dataset = tf.contrib.data.Dataset.from_tensor_slices(filenames)
dataset = dataset.flat_map(
lambda filename: (
tf.contrib.data.TextLineDataset(filename)
.map(_parse_data)))
def _parse_data(line):
line_split = tf.string_split([line], '\t')
features = {"raw_text": tf.string(line_split.values[0].strip().lower()),
"label": tf.string_to_number(line_split.values[1],
out_type=tf.int32)}
parsed_features = tf.parse_single_example(line, features)
return parsed_features["raw_text"], raw_features["label"]
我想在 raw_text 功能上做一些字符串 cleaning/processing。当我尝试 运行 line_split.values[0].strip().lower()
时,出现以下错误:
AttributeError: 'Tensor' object has no attribute 'strip'
对象 lines_split.values[0]
是一个 tf.Tensor
对象,代表 line
的第 0 个拆分。它不是 Python 字符串,因此它没有 .strip()
或 .lower()
方法。相反,您必须将 TensorFlow 操作应用于张量才能执行转换。
TensorFlow 目前没有很多 string operations, but you can use the tf.py_func()
op 到 运行 一些 Python 代码 tf.Tensor
:
def _parse_data(line):
line_split = tf.string_split([line], '\t')
raw_text = tf.py_func(
lambda x: x.strip().lower(), line_split.values[0], tf.string)
label = tf.string_to_number(line_split.values[1], out_type=tf.int32)
return {"raw_text": raw_text, "label": label}
请注意,问题中的代码还有其他几个问题:
- 不要使用
tf.parse_single_example()
。此操作仅用于解析tf.train.Example
协议缓冲区字符串;解析文本时不需要使用它,可以直接从_parse_data()
. 中return提取特征
- 使用
dataset.map()
instead ofdataset.flat_map()
。当映射函数的结果是Dataset
对象时,您只需要使用flat_map()
(因此 return 值需要 展平 到单个数据集)。当结果是一个或多个tf.Tensor
个对象时,您必须使用map()
。