使用 DataFrame 列表列初始化 Keras StringLookup

Initialise Keras StringLookup with DataFrame list column

我在 pd.DataFrame 列中有以下格式的数据:

   col
0  ['str1', 'str2', 'str3']
1  []
2  ['str1']
3  ['str20']

我使用下面的代码构造一个查找层:

lookup_layer = tf.keras.layers.StringLookup(max_tokens=335)
lookup_layer.adapt(df.col)

失败:

ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list).

我还尝试将列连接到一个列表中,因为错误表明嵌套列表是问题所在:

lookup_layer.adapt(itertools.chain(*df.col))

这导致:

AttributeError: 'str' object has no attribute 'shape'

我也尝试了各种 tf.cast/tf.convert_to_tensor 电话,但无济于事。

如何将我的 DataFrame 字符串列表列转换为 Tensorflow 接受的内容?

您必须将您的字符串列表列表转换为单个列表,然后您的 StringLookup 层应该可以工作:

import pandas as pd
import tensorflow as tf
import numpy as np

d = {'col': [['str1', 'str2', 'str3'], [], ['str1', 'str2', 'str3'], ['str1', 'str2', 'str3']]}
df = pd.DataFrame(data=d)

lookup_layer = tf.keras.layers.StringLookup(max_tokens=335)
flattened_data = sum(list(df.col), [])
lookup_layer.adapt(flattened_data)
print(lookup_layer.get_vocabulary())
['[UNK]', 'str3', 'str2', 'str1']

另请查看此 post 关于不同列表展平方法的性能。

作为替代方案,您可以使用 tf.ragged.constant 而不是 col pd.Series.

lookup_layer = tf.keras.layers.StringLookup(max_tokens=335)
lookup_layer.adapt(tf.ragged.constant(df.col))