我有一个弦张量。一些示例字符串如下。
com.abc.display,com.abc.backend,com.xyz.forte,blah
com.pqr,npr.goog
我想进行一些预处理,将CSV拆分为一部分,然后在点处拆分每个部分,然后创建多个字符串,其中一个字符串是另一个字符串的前缀。此外,所有blah
都必须删除。
例如,给定第一个字符串com.abc.display,com.abc.backend,com.xyz.forte
,它将转换为以下字符串的数组/列表。
['com', 'com.abc', 'com.abc.display', 'com.abc.backend', 'com.xyz', 'com.xyz.forte']
结果列表没有重复项(这就是为什么前缀字符串com.abc.backend
未显示为已包含的原因-com
和com.abc
)。
我编写了以下python函数,给出了一个CSV字符串示例,即可完成上述操作。
def expand_meta(meta):
expanded_subparts = []
meta_parts = set([x for x in meta.split(',') if x != 'blah'])
for part in meta_parts:
subparts = part.split('.')
for i in range(len(subparts)+1):
expanded = '.'.join(subparts[:i])
if expanded:
expanded_subparts.append(expanded)
return list(set(expanded_subparts))
在第一个示例上调用此方法
expand_meta('com.abc.display,com.abc.backend,com.xyz.forte,blah')
退货
['com.abc.display',
'com.abc',
'com.xyz',
'com.xyz.forte',
'com.abc.backend',
'com']
我知道tensorflow有这种map_fn
方法。我希望使用它来变换张量的每个元素。但是,我收到以下错误。
File "mypreprocess.py", line 152, in expand_meta
meta_parts = set([x for x in meta.split(',') if x != 'blah'])
AttributeError: 'Tensor' object has no attribute 'split'
因此,似乎我不能使用常规的python函数,map_fn
因为它期望元素为tensor
s。我该怎么办?
(我的Tensorflow
版本是1.11.0)
我认为这可以满足您的需求:
import tensorflow as tf
# Function to process a single string
def make_splits(s):
s = tf.convert_to_tensor(s)
# Split by comma
split1 = tf.strings.split([s], ',').values
# Remove blahs
split1 = tf.boolean_mask(split1, tf.not_equal(split1, 'blah'))
# Split by period
split2 = tf.string_split(split1, '.')
# Get dense split tensor
split2_dense = tf.sparse.to_dense(split2, default_value='')
# Accummulated concatenations
concats = tf.scan(lambda a, b: tf.string_join([a, b], '.'),
tf.transpose(split2_dense))
# Get relevant concatenations
out = tf.gather_nd(tf.transpose(concats), split2.indices)
# Remove duplicates
return tf.unique(out)[0]
# Test
with tf.Graph().as_default(), tf.Session() as sess:
# Individual examples
print(make_splits('com.abc.display,com.abc.backend,com.xyz.forte,blah').eval())
# [b'com' b'com.abc' b'com.abc.display' b'com.abc.backend' b'com.xyz'
# b'com.xyz.forte']
print(make_splits('com.pqr,npr.goog').eval())
# [b'com' b'com.pqr' b'npr' b'npr.goog']
# Apply to multiple strings with a loop
data = tf.constant([
'com.abc.display,com.abc.backend,com.xyz.forte,blah',
'com.pqr,npr.goog'])
ta = tf.TensorArray(size=data.shape[0], dtype=tf.string,
infer_shape=False, element_shape=[None])
_, ta = tf.while_loop(
lambda i, ta: i < tf.shape(data)[0],
lambda i, ta: (i + 1, ta.write(i, make_splits(data[i]))),
[0, ta])
out = ta.concat()
print(out.eval())
# [b'com' b'com.abc' b'com.abc.display' b'com.abc.backend' b'com.xyz'
# b'com.xyz.forte' b'com' b'com.pqr' b'npr' b'npr.goog']
我不确定是否要像这样将所有结果串联起来,或者是否想将其应用于tf.unique
全局结果,但是无论如何,想法是相同的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句