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 函数了。 我尝试了两种不同的标记化策略:

  1. 在将 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).

  1. 将 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)