有没有办法将字符串张量转换为小写,而不在会话中进行评估?某种tf.string_to_lower
op?
更具体地说,我正在从tfrecords
文件中读取数据,所以我的数据是由张量构成的。然后我想使用tf.contrib.lookup.index_table_from_*
来查找数据中单词的索引,我需要它不区分大小写。在将数据写入tfrecords
之前降低数据不是一种选择,因为它需要保持原始格式。一种选择是存储原始和降低,但我想尽可能避免这种情况。
答案 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字符,我有一个可行的解决方案(图中)。这个想法是:
可在此处找到具体示例: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'>