Pandas Dataframe、TensorFlow 数据集:在哪里执行 TensorFlow 标记化步骤?
Pandas Dataframe, TensorFlow Dataset: Where to do the TensorFlow Tokenization step?
我正在研究逻辑回归模型,以在 TensorFlow 中的 Keras 的帮助下预测客户是企业客户还是非企业客户。目前,我可以在 tf.feature_columns
的帮助下使用像纬度这样的列。现在我正在处理 NAME1 字段。该名称通常有重复的部分,如“GmbH”(例如“Mustermann GmbH”),在这种情况下,它与 Corp. 具有相似的含义,表明客户是企业客户。为了分隔名称的所有不同部分并分别使用它们,我在函数 text_to_word_sequence()
的帮助下使用标记化。
我将数据导入 Pandas Dataframe,然后将此 Dataframe 转换为具有函数 from_tensor_slices()
的 TensorFlow Dataset,这样我就可以使用 tf.feature_columns
函数了。
我尝试了两种不同的标记化策略:
- 在将 pandas 数据帧转换为 TensorFlow 数据集之前进行标记化
导入 Dataframe 后,我使用 Pandas Dataframe 方法
apply()
在 Dataframe 中创建一个新的标记化列:
data['NAME1TOKENIZED'] = data['NAME1'].apply(lambda x: text_to_word_sequence(x))
新列具有以下结构:
0 [palle]
1 [pertl]
2 [graf, robert]
3 [löberbauer, stefanie, asg]
4 [stauber, martin, asg]
...
99995 [truber]
99996 [mesgec]
99997 [mesgec]
99998 [miedl]
99999 [millegger]
Name: NAME1TOKENIZED, Length: 100000, dtype: object
如您所见,列表中的条目数量不同,因此我无法将 Dataframe 转换为 Dataset:
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list).
我还尝试了 tf.ragged.constant()
函数来创建一个允许这种类型列表的参差不齐的张量。
这是我将 DataFrame 转换为 Dataset 的函数:
def df_to_dataset(dataframe, shuffle=True, batch_size=32):
dataframe = dataframe.copy()
tok_names = dataframe.loc[:,'NAME1TOKENIZED']
del dataframe['NAME1TOKENIZED']
rt_tok_names = tf.ragged.constant(tok_names)
labels = dataframe.pop('RECEIVERTYPE')
labels = labels - 1
ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), rt_tok_names, labels))
if shuffle:
ds = ds.shuffle(buffer_size=len(dataframe))
ds = ds.batch(batch_size)
return ds
这很好用,但正如您想象的那样,现在我在另一侧遇到了问题。当我现在尝试使用以下功能时:
name_embedding = tf.feature_column.categorical_column_with_hash_bucket('NAME1TOKENIZED', hash_bucket_size=2500)
我收到以下错误:
ValueError: Feature NAME1TOKENIZED is not in features dictionary.
我还尝试将 Dataframe 而不是 Serie 输入到 tf.ragged.constant()
中,这样我就可以使用 dict(rt_tok_names)
来传递标签,但是我再次收到以下错误:
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list)
.
- 将 pandas 数据帧转换为 TensorFlow 数据集后的标记化
我试过例如以下:
train_ds.map(lambda x, _: text_to_word_sequence(x['NAME1']))
但是我得到了以下错误:
AttributeError: 'Tensor' object has no attribute 'lower'
如您所见,我尝试了几种方法但没有成功。我很乐意就如何解决我的问题提出任何建议。
谢谢!
我找到了解决问题的办法。我使用 Tokenizer 将文本转换为序列,然后将生成的每行序列列表填充到最大长度为 2。最后,我将这两个新列添加到 Dataframe 中。之后我能够将 Dataframe 转换为 Dataset 然后我在 tf.feature_column
的帮助下使用了这两列
相关代码在这里:
t = Tokenizer(num_words=name_num_words)
t.fit_on_texts(data['NAME1PRO'])
name1_tokenized = t.texts_to_sequences(data['NAME1PRO'])
name1_tokenized_pad = tf.keras.preprocessing.sequence.pad_sequences(name1_tokenized, maxlen=2, truncating='pre')
data = pd.concat([data, pd.DataFrame(name1_tokenized_pad, columns=['NAME1W1', 'NAME1W2'])], axis=1)
我正在研究逻辑回归模型,以在 TensorFlow 中的 Keras 的帮助下预测客户是企业客户还是非企业客户。目前,我可以在 tf.feature_columns
的帮助下使用像纬度这样的列。现在我正在处理 NAME1 字段。该名称通常有重复的部分,如“GmbH”(例如“Mustermann GmbH”),在这种情况下,它与 Corp. 具有相似的含义,表明客户是企业客户。为了分隔名称的所有不同部分并分别使用它们,我在函数 text_to_word_sequence()
的帮助下使用标记化。
我将数据导入 Pandas Dataframe,然后将此 Dataframe 转换为具有函数 from_tensor_slices()
的 TensorFlow Dataset,这样我就可以使用 tf.feature_columns
函数了。
我尝试了两种不同的标记化策略:
- 在将 pandas 数据帧转换为 TensorFlow 数据集之前进行标记化
导入 Dataframe 后,我使用 Pandas Dataframe 方法
apply()
在 Dataframe 中创建一个新的标记化列:data['NAME1TOKENIZED'] = data['NAME1'].apply(lambda x: text_to_word_sequence(x))
新列具有以下结构:
0 [palle]
1 [pertl]
2 [graf, robert]
3 [löberbauer, stefanie, asg]
4 [stauber, martin, asg]
...
99995 [truber]
99996 [mesgec]
99997 [mesgec]
99998 [miedl]
99999 [millegger]
Name: NAME1TOKENIZED, Length: 100000, dtype: object
如您所见,列表中的条目数量不同,因此我无法将 Dataframe 转换为 Dataset:
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list).
我还尝试了 tf.ragged.constant()
函数来创建一个允许这种类型列表的参差不齐的张量。
这是我将 DataFrame 转换为 Dataset 的函数:
def df_to_dataset(dataframe, shuffle=True, batch_size=32):
dataframe = dataframe.copy()
tok_names = dataframe.loc[:,'NAME1TOKENIZED']
del dataframe['NAME1TOKENIZED']
rt_tok_names = tf.ragged.constant(tok_names)
labels = dataframe.pop('RECEIVERTYPE')
labels = labels - 1
ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), rt_tok_names, labels))
if shuffle:
ds = ds.shuffle(buffer_size=len(dataframe))
ds = ds.batch(batch_size)
return ds
这很好用,但正如您想象的那样,现在我在另一侧遇到了问题。当我现在尝试使用以下功能时:
name_embedding = tf.feature_column.categorical_column_with_hash_bucket('NAME1TOKENIZED', hash_bucket_size=2500)
我收到以下错误:
ValueError: Feature NAME1TOKENIZED is not in features dictionary.
我还尝试将 Dataframe 而不是 Serie 输入到 tf.ragged.constant()
中,这样我就可以使用 dict(rt_tok_names)
来传递标签,但是我再次收到以下错误:
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list)
.
- 将 pandas 数据帧转换为 TensorFlow 数据集后的标记化 我试过例如以下:
train_ds.map(lambda x, _: text_to_word_sequence(x['NAME1']))
但是我得到了以下错误:
AttributeError: 'Tensor' object has no attribute 'lower'
如您所见,我尝试了几种方法但没有成功。我很乐意就如何解决我的问题提出任何建议。
谢谢!
我找到了解决问题的办法。我使用 Tokenizer 将文本转换为序列,然后将生成的每行序列列表填充到最大长度为 2。最后,我将这两个新列添加到 Dataframe 中。之后我能够将 Dataframe 转换为 Dataset 然后我在 tf.feature_column
的帮助下使用了这两列
相关代码在这里:
t = Tokenizer(num_words=name_num_words)
t.fit_on_texts(data['NAME1PRO'])
name1_tokenized = t.texts_to_sequences(data['NAME1PRO'])
name1_tokenized_pad = tf.keras.preprocessing.sequence.pad_sequences(name1_tokenized, maxlen=2, truncating='pre')
data = pd.concat([data, pd.DataFrame(name1_tokenized_pad, columns=['NAME1W1', 'NAME1W2'])], axis=1)