Python Tensorflow变换字符串张量的每个元素

Python Tensorflow变换字符串张量的每个元素,python,tensorflow,Python,Tensorflow,我有一个弦的张量。下面是一些示例字符串 com.abc.display,com.abc.backend,com.xyz.forte,blah com.pqr,npr.goog 我想做一些预处理,将CSV拆分成它的一部分,然后在点处拆分每个部分,然后创建多个字符串,其中一个字符串是另一个字符串的前缀。此外,所有的废话都必须删除 例如,给定第一个字符串com.abc.display、com.abc.backend、com.xyz.forte,它将转换为以下字符串的数组/列表 ['com', 'co

我有一个弦的张量。下面是一些示例字符串

com.abc.display,com.abc.backend,com.xyz.forte,blah
com.pqr,npr.goog
我想做一些预处理,将CSV拆分成它的一部分,然后在点处拆分每个部分,然后创建多个字符串,其中一个字符串是另一个字符串的前缀。此外,所有的
废话都必须删除

例如,给定第一个字符串
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\u 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'
因此,我似乎无法使用带有
map\u fn
的常规python函数,因为它期望元素是
tensor
s。我该怎么做我想在这里做的事


(我的
Tensorflow
版本是1.11.0)

我想这正是你想要的:

将tensorflow导入为tf
#函数来处理单个字符串
def make_拆分:
s=tf。将_转换为_张量(s)
#用逗号分开
split1=tf.strings.split([s],“,”).values
#除去废话
split1=tf.boolean_掩码(split1,tf.not_equal(split1,'blah'))
#按时段划分
split2=tf.string_split(split1,“.”)
#得到稠密分裂张量
split2\u densite=tf.sparse.to\u densite(split2,默认值=“”)
#累加连接
concats=tf.scan(lambda,b:tf.string_join([a,b],'.'),
tf.转置(split2_)
#获取相关的连接
out=tf.gather\u nd(tf.transpose(concats),split2.index)
#删除重复项
返回tf.unique(out)[0]
#试验
将tf.Graph()作为默认值(),将tf.Session()作为sess:
#个别例子
打印(进行拆分('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']
打印(进行分割('com.pqr,npr.goog').eval())
#[b'com'b'com.pqr'b'npr'b'npr.goog']
#应用于具有循环的多个字符串
data=tf.constant([
'com.abc.display,com.abc.backend,com.xyz.forte,诸如此类',
'com.pqr,npr.goog'])
ta=tf.TensorArray(size=data.shape[0],dtype=tf.string,
推断形状=假,元素形状=[无])
_,ta=tf.while\u循环(
λi,ta:i

我不确定您是否希望总结果像这样串联起来,或者您希望对全局结果应用
tf.unique
,但在任何情况下,想法都是一样的。

您的输入数据是一个逗号分隔的字符串,还是一个包含多个逗号分隔的字符串的张量?如果是第二种情况,预期的输出是什么?因为每个字符串将给出不同数量的结果。而且,1.11.0已经很老了,你有没有可能升级,即使是在1.x之内?我认为1.12已经在字符串函数中引入了一些改进。我希望我们可以升级到1.15,但这不取决于我。我们正在努力实现这一目标,但我怀疑这将在未来几个月内实现。所以,我必须坚持使用1.11。输入是一个带有多个CSV字符串的张量。基本上,它来自一个SQL列,其中的列值可以是我在文章中提到的类型的字符串。预期的输出将是字符串列表的张量。