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

一世

我有一个弦张量。一些示例字符串如下。

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未显示为已包含的原因-comcom.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因为它期望元素为tensors。我该怎么办?

(我的Tensorflow版本是1.11.0)

Jdehesa

我认为这可以满足您的需求:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Tensorflow:字符串化张量作为一个整体(而不会产生串的张量)

来自分类Dev

在每个与字符串匹配的元素中获取正确的元素

来自分类Dev

双射字符串排序变换

来自分类Dev

获取Raphael元素的完整当前变换状态(作为对象或字符串)

来自分类Dev

比较字符串和每个li元素

来自分类Dev

在指定向量的每个元素处分割字符串

来自分类Dev

C#计算字符串数组中的每个元素

来自分类Dev

计算字符串中每个元素的每次出现

来自分类Dev

php:将数组的每个元素显示为字符串

来自分类Dev

计算字符串数组中的每个元素

来自分类Dev

将字符串批处理成每个元素发布的数组和子字符串

来自分类Dev

将字符串批处理成每个元素发布的数组和子字符串

来自分类Dev

删除字符串以及包含特定字符串的每个元素之后的所有内容

来自分类Dev

Excel:分割定界的字符串并检索字符串中每个元素的数值

来自分类Dev

如何在tensorflow中将字符串张量填充到目标长度

来自分类Dev

从字符串中提取张量

来自分类Dev

反序列化每个字符串元素的元素的 XML 列表

来自分类Dev

向字符串/字符向量中的每个元素添加可变长度的填充

来自分类Dev

如何在字符串中的每个元素之前和之后添加字符

来自分类Dev

将字符串的每个元素与第二个字符串合并

来自分类Dev

从字符串获取元素

来自分类Dev

如何在C ++中将字符串数组转换为字符串类型,如将每个元素连接成一个字符串,并在字符串上使用子字符串?

来自分类Dev

如何遍历字符串列表中的每个字符串并对其元素进行操作

来自分类Dev

Ruby将字符串追加到数组中的每个元素

来自分类Dev

PHP html字符串以DOMDocument数组不返回每个元素

来自分类Dev

拆分字符串数组,然后分别使用每个元素

来自分类Dev

如何检查将字符串值与数组中的每个元素进行比较?

来自分类Dev

PHP html字符串以DOMDocument数组不返回每个元素

来自分类Dev

form.serializeArray()将每个元素转换为字符串

Related 相关文章

  1. 1

    Tensorflow:字符串化张量作为一个整体(而不会产生串的张量)

  2. 2

    在每个与字符串匹配的元素中获取正确的元素

  3. 3

    双射字符串排序变换

  4. 4

    获取Raphael元素的完整当前变换状态(作为对象或字符串)

  5. 5

    比较字符串和每个li元素

  6. 6

    在指定向量的每个元素处分割字符串

  7. 7

    C#计算字符串数组中的每个元素

  8. 8

    计算字符串中每个元素的每次出现

  9. 9

    php:将数组的每个元素显示为字符串

  10. 10

    计算字符串数组中的每个元素

  11. 11

    将字符串批处理成每个元素发布的数组和子字符串

  12. 12

    将字符串批处理成每个元素发布的数组和子字符串

  13. 13

    删除字符串以及包含特定字符串的每个元素之后的所有内容

  14. 14

    Excel:分割定界的字符串并检索字符串中每个元素的数值

  15. 15

    如何在tensorflow中将字符串张量填充到目标长度

  16. 16

    从字符串中提取张量

  17. 17

    反序列化每个字符串元素的元素的 XML 列表

  18. 18

    向字符串/字符向量中的每个元素添加可变长度的填充

  19. 19

    如何在字符串中的每个元素之前和之后添加字符

  20. 20

    将字符串的每个元素与第二个字符串合并

  21. 21

    从字符串获取元素

  22. 22

    如何在C ++中将字符串数组转换为字符串类型,如将每个元素连接成一个字符串,并在字符串上使用子字符串?

  23. 23

    如何遍历字符串列表中的每个字符串并对其元素进行操作

  24. 24

    Ruby将字符串追加到数组中的每个元素

  25. 25

    PHP html字符串以DOMDocument数组不返回每个元素

  26. 26

    拆分字符串数组,然后分别使用每个元素

  27. 27

    如何检查将字符串值与数组中的每个元素进行比较?

  28. 28

    PHP html字符串以DOMDocument数组不返回每个元素

  29. 29

    form.serializeArray()将每个元素转换为字符串

热门标签

归档