将字符串张量转换为小写

时间:2017-06-28 00:33:35

标签: tensorflow

有没有办法将字符串张量转换为小写,而不在会话中进行评估?某种tf.string_to_lower op?

更具体地说,我正在从tfrecords文件中读取数据,所以我的数据是由张量构成的。然后我想使用tf.contrib.lookup.index_table_from_*来查找数据中单词的索引,我需要它不区分大小写。在将数据写入tfrecords之前降低数据不是一种选择,因为它需要保持原始格式。一种选择是存储原始和降低,但我想尽可能避免这种情况。

5 个答案:

答案 0 :(得分:1)

您可以使用tf.py_func来使用操作字符串的python函数,并使用图形执行它。

您可以执行以下操作:

# I suppose your string tensor is tensorA
lower = tf.py_func(lambda x: x.lower(), [tensorA], tf.string, stateful=False)

# Starting from TF 2.0 `tf.py_func` is deprecated so correct code will be
lower = tf.py_function(lambda x: x.numpy().lower(), [tensorA], tf.string)

答案 1 :(得分:1)

这是一个使用tensorflow操作的实现:

def lowercase(s):
    ucons = tf.constant_initializer([chr(i) for i in range(65, 91)])
    lcons = tf.constant_initializer([chr(i) for i in range(97, 123)])

    upchars = tf.constant(ucons, dtype=tf.string)
    lchars = tf.constant(lcons, dtype=tf.string)

    upcharslut = tf.contrib.lookup.index_table_from_tensor(mapping=upchars, num_oov_buckets=1, default_value=-1)
    splitchars = tf.string_split(tf.reshape(s, [-1]), delimiter="").values
    upcharinds = upcharslut.lookup(splitchars)
    return tf.reduce_join(tf.map_fn(lambda x: tf.cond(x[0] > 25, lambda: x[1], lambda: lchars[x[0]]), (upcharinds, splitchars), dtype=tf.string))

if __name__ == "__main__":
    s = "komoDO DragoN "
    sess = tf.Session()
    x = lowercase(s)
    sess.run(tf.global_variables_initializer())
    sess.run(tf.tables_initializer())
    print(sess.run([x]))

返回[b'komodo dragon ']

答案 2 :(得分:0)

如果你使用的字符仅限于ASCII字符,我有一个可行的解决方案(图中)。这个想法是:

  1. 创建一个查找表,其值为[32,127],而值相同,[65,91]中的值除以[97,123]。方法:tf.contrib.lookup.HashTable。
  2. 将字符串拆分为字符。方法:tf.string_split
  3. 使用lookup将大写字符映射到小写字符。方法:case_table.lookup(如果HashTable被称为case_table)。
  4. 将字符加入字符串。方法:tf.reduce_join。
  5. 可在此处找到具体示例:https://github.com/bshao001/ChatLearner/blob/master/chatbot/tokenizeddata.py

    这种方法应该能够扩展到其他字符集。请注意,如果您尝试仅转换那些需要更改的字符(例如26个英文大写字符),则会更难(不确定是否可行),因为您必须使用tf.cond方法并检查是否字符是否在键集中,效率也会降低。

答案 3 :(得分:0)

不幸的是,tf.py_func并非在所有情况下都可以用作服务或TFT。以下代码段是一个简单的图表内TF解决方案。

import tensorflow as tf

def to_lower_case(text):
    chars = tf.strings.unicode_decode(text, input_encoding='UTF-8')
    capital_mask = tf.logical_and(tf.greater_equal(chars, 65), tf.less(chars, 91))
    chars = chars + tf.cast(capital_mask, tf.int32) * 32
    return tf.strings.unicode_encode(chars, output_encoding='UTF-8')

with tf.Session() as sess:
    print(sess.run(to_lower_case('Test')))

答案 4 :(得分:0)

在Tensorflow 1.14中,添加了一个较低的op。简短的代码段(处于急切执行模式下)如下所示:

astring = tf.constant('A String', dtype=tf.string)
tf.strings.lower(astring)

<tf.Tensor: id=79, shape=(), dtype=string, numpy=b'a string'>