Pandas Dataframe,TensorFlow Dataset:在哪里进行 TensorFlow 标记化步骤?



我正在研究一个逻辑回归模型,在TensorFlow中的Keras的帮助下预测客户是商业客户还是非商业客户。目前,我可以在tf.feature_columns的帮助下使用纬度等列。现在我正在处理 NAME1 字段。该名称通常具有重复的部分,例如"GmbH"(例如"Mustermann GmbH"(,在这种情况下,其含义与Corp.相似,后者表示客户是商业客户。为了分离名称的所有不同部分并分别使用它们,我在函数的帮助下使用标记化text_to_word_sequence(). 我将数据导入 Pandas 数据帧,然后将该数据帧转换为具有函数from_tensor_slices()的 TensorFlow 数据集,以便我可以使用tf.feature_columns函数。 我尝试了两种不同的标记化策略:

  1. 将 pandas 数据帧转换为 TensorFlow 数据集之前的标记化导入数据帧后,我使用 Pandas 数据帧方法apply()在数据帧中创建一个新的标记化列: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

如您所见,该列表具有不同数量的条目,因此我在将数据帧转换为数据集时遇到问题:ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list).我还尝试了tf.ragged.constant()函数来创建允许此类列表的参差不齐的张量。 这是我用于将数据帧转换为数据集的函数:

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.

我还尝试将数据帧而不是 Serie 输入到tf.ragged.constant()中,以便我可以使用dict(rt_tok_names)传递标签,但随后我再次收到以下错误:ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list).

  1. 熊猫数据帧转换为 TensorFlow 数据集后的标记化我已经尝试了以下方法:

train_ds.map(lambda x, _: text_to_word_sequence(x['NAME1']))

但是我收到以下错误:AttributeError: 'Tensor' object has no attribute 'lower'

如您所见,我尝试了几种方法,但没有成功。我很乐意提供任何如何解决我的问题的建议。

谢谢!

我找到了解决问题的方法。我使用分词器将文本转换为序列,然后将每行序列的结果列表填充到最大长度 2。最后,我将这两个新列添加到数据帧中。之后,我能够将数据帧转换为数据集,然后在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)