TensorFlow unicode 文本编码-解码

Posted

技术标签:

【中文标题】TensorFlow unicode 文本编码-解码【英文标题】:Tensorflow unicode text encoding-decoding 【发布时间】:2021-12-13 19:30:58 【问题描述】:

我刚开始使用西里尔文字。文本预处理后无法正确打印俄语文本。如何在文本加载期间设置编码?

import pathlib
text = pathlib.Path('rus.txt').read_text(encoding='utf-8')

lines = text.splitlines()
pairs = [line.split('\t') for line in lines]
inp = [inp for targ, inp, tag in pairs]
targ = [targ for targ, inp, tag in pairs]
inp[:20]

输出1:

['Марш!',  'Иди.',  'Идите.',  'Здравствуйте.',  'Привет!',  'Хай.', 
   'Здрасте.',  'Здоро́во!',  'Приветик!',  'Беги!',  'Бегите!',...

创建数据集:

BUFFER_SIZE = len (inp)
BATCH_SIZE = 64
    
dataset = tf.data.Dataset.from_tensor_slices((inp, targ)).shuffle(BUFFER_SIZE)
dataset = dataset.batch(BATCH_SIZE)

for example_input_batch, example_target_batch in dataset.take(1):
  print(example_input_batch[:5]) --Russian input
  print()
  print(example_target_batch[:5]) --English target
  break

输出2:

 tf.Tensor(
    [b'\xd0\xa2\xd0\xbe\xd0\xbc \xd0\xbf\xd0\xbe\xd1\x81\xd1\x82\xd1\x83\xd0\xbf\xd0\xb8\xd0\xbb \xd1\x85\xd0\xbe\xd1\x80\xd0\xbe\xd1\x88\xd0\xbe.'
     b'\xd0\xa2\xd1\x8b \xd1\x81\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0\xd0\xbb\xd0\xb0 \xd1\x8d\xd1\x82\xd0\xbe \xd1\x81\xd0\xbf\xd0\xb5\xd1\x86\xd0\xb8\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xbe.'
     b'\xd0\xa2\xd0\xbe\xd0\xbc \xd0\xb5\xd1\x89\xd1\x91 \xd0\xbd\xd0\xb5 \xd0\xbc\xd0\xbe\xd0\xb6\xd0\xb5\xd1\x82 \xd1\x85\xd0\xbe\xd0\xb4\xd0\xb8\xd1\x82\xd1\x8c \xd1\x81\xd0\xb0\xd0\xbc.'
     b'\xd0\x94\xd1\x83\xd0\xbc\xd0\xb0\xd1\x8e, \xd0\xbf\xd0\xbe\xd1\x80\xd0\xb0 \xd0\xbc\xd0\xbd\xd0\xb5 \xd0\xbf\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xb2\xd0\xbe\xd1\x80\xd0\xb8\xd1\x82\xd1\x8c \xd0\xbe\xd0\xb1 \xd1\x8d\xd1\x82\xd0\xbe\xd0\xb9 \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb5\xd0\xbc\xd0\xb5 \xd1\x81 \xd0\xbd\xd0\xb0\xd1\x87\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xb8\xd0\xba\xd0\xbe\xd0\xbc.'
     b'\xd0\xaf \xd0\xbc\xd0\xbe\xd0\xb3\xd1\x83 \xd1\x8d\xd1\x82\xd0\xbe \xd1\x83\xd0\xbb\xd0\xb0\xd0\xb4\xd0\xb8\xd1\x82\xd1\x8c.'], shape=(5,), dtype=string)

tf.Tensor(
[b'Tom did a good thing.' b'You did that on purpose.'
 b"Tom can't walk on his own yet."
 b"I think it's time for me to talk to the boss about this problem."
 b'I can arrange that.'], shape=(5,), dtype=string)

你能告诉我这里打印俄语文本有什么问题吗?英文文本打印正常。

【问题讨论】:

问题本身是什么?第一输出和第二输出在结构上不一样。我的意思是,第一个输出只有一个字符串列表,但第二个输出包含两个tf.Tensors 问题出在第二个输出 - 不正确的俄语文本输出(第一个张量)。我不明白为什么它会打印带有未知字符串(如'\xd0\xa2\xd0\xbe\xd0\xbc')的俄语文本。我怎样才能让它正确打印。 【参考方案1】:

看似无意义的字符串实际上是 UTF-8 编码的。详情请见this post。

例如张量中的第一个字符串

\xd0\xa2\xd0\xbe\xd0\xbc \xd0\xbf\xd0\xbe\xd1\x81\xd1\x82\xd1\x83\xd0\xbf\xd0\xb8\xd0\xbb \xd1\x85\xd0\xbe\xd1\x80\xd0\xbe\xd1\x88\xd0\xbe.

这是垃圾吗

Том поÑÑÑпил ÑоÑо

实际上可以正确解码,像这样:

s = '\xd0\xa2\xd0\xbe\xd0\xbc \xd0\xbf\xd0\xbe\xd1\x81\xd1\x82\xd1\x83\xd0\xbf\xd0\xb8\xd0\xbb \xd1\x85\xd0\xbe\xd1\x80\xd0\xbe\xd1\x88\xd0\xbe.'
decoded = bytes(s, encoding='latin').decode()
print(decoded)

输出:

Том поступил хорошо.

我不确定如何使用 Tensorflow 做到这一点,但也许 tf.strings.unicode_decode 可以提供帮助。

【讨论】:

【参考方案2】:

我使用 tf.strings.unicode_decode() 函数将编码的 '\xd0\xa2\xd0\xbe\xd0\xbc' 类似值转换为整数张量,如 [1053, 1077, 32, 1076,... 。我还将结果转换为 numpy 数组,使其适用于将 unicode 整数转换为 unicode 符号的 chr() 函数。

def decode_string(ints):
  strs = [chr(i) for i in ints]
  joined = [''.join(strs)]
  return joined

decoded = tf.strings.unicode_decode(example_input_batch[:5], 'utf-8').numpy()
decoded_list = [decode_string(ex) for ex in decoded]
print(decoded_list)

结果是:

[['Том был окружён дельфинами.'], ['Бразилия была колонией Португалии.'], ['Скажи Тому, чтобы поторопился.'], ['Я слишком многого прошу?'],...

【讨论】:

以上是关于TensorFlow unicode 文本编码-解码的主要内容,如果未能解决你的问题,请参考以下文章

确定文本文件是否为Unicode编码

windows操作系统unicode文本编码格式是UTF-8还是UTF-16??现在的系统

该文件含有unicode格式的字符,当文件保存为ANSI编码的文本文件时,该字符将丢失.

使用 RPostgreSQL 进行 UTF-8 / Unicode 文本编码

unicode汉语翻译是啥意思

Qt写入unicode编码格式的文本(用QChar写入BOM标记,并且列出所有Qt支持的字符集)