Google Article
介绍 TF.Text
2019 年 6 月 10 日
作者:Robby Neale,软件工程师

TensorFlow 提供了大量操作,这些操作对从图像和视频构建模型非常有用。但是,许多模型都从文本开始,并且从这些模型构建的语言模型在将文本馈送到模型之前需要一些预处理。例如,文本分类教程 使用 IMDB 集,从已经转换为整数 ID 的文本数据开始。如果这种预处理是在图之外完成的,那么如果在训练和推理时有所不同,可能会导致偏差,并且需要额外的工作来协调这些预处理步骤。

TF.Text 是一个 TensorFlow 2.0 库,可以使用 PIP 轻松安装,旨在通过提供操作来处理文本模型中经常遇到的预处理,以及其他对核心 TensorFlow 未提供的语言建模有用的功能,来解决这个问题。这些操作中最常见的是文本分词。分词是将字符串分解为标记的过程。通常,这些标记是单词、数字和/或标点符号。

每个包含的分词器都返回 RaggedTensors,其中最内层维度的标记映射到原始单个字符串。因此,结果形状的秩增加了一。这将在下面说明,但如果你不熟悉 RaggedTensors,请参阅 Ragged 张量指南

分词器

我们最初将提供三个新的分词器(如最近的 RFC 中所述)。最基本的新分词器是空格分词器,它根据 ICU 定义的空格字符(例如空格、制表符、换行符)来分割 UTF-8 字符串。
tokenizer = tensorflow_text.WhitespaceTokenizer()
tokens = tokenizer.tokenize(['everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])
print(tokens.to_list())
[['everything', 'not', 'saved', 'will', 'be', 'lost.'], ['Sad\xe2\x98\xb9']]
初始版本还包含一个 Unicode 脚本分词器,它根据 Unicode 脚本边界来分割 UTF-8 字符串。Unicode 脚本是字符和符号的集合,这些字符和符号在历史上具有相关的语言派生。查看国际组件 for Unicode (ICU) 的 UScriptCode 值,了解完整的枚举集。值得注意的是,这类似于空格分词器,最明显的区别是它会将标点符号 USCRIPT_COMMON 从语言文本(例如 USCRIPT_LATINUSCRIPT_CYRILLIC 等)中分离出来。

tokenizer = tensorflow_text.UnicodeScriptTokenizer()
tokens = tokenizer.tokenize(['everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])
print(tokens.to_list())
[['everything', 'not', 'saved', 'will', 'be', 'lost', '.'], ['Sad', '\xe2\x98\xb9']]
TF.Text 发布中提供的最后一个分词器是 WordPiece 分词器。它是一个无监督文本分词器,需要预定的词汇表才能将标记进一步拆分为子词(前缀和后缀)。WordPiece 通常用于 BERT 模型。

def _CreateTable(vocab, num_oov=1):
  init = tf.lookup.KeyValueTensorInitializer(
      vocab,
      tf.range(tf.size(vocab, out_type=tf.int64), dtype=tf.int64),
      key_dtype=tf.string,
      value_dtype=tf.int64)
  return tf.lookup.StaticVocabularyTable(
      init, num_oov, lookup_key_dtype=tf.string)

vocab_table = _CreateTable(["great", "they", "the", "##'", "##re", "##est"])

tokens = [["they're", "the", "greatest"]]
tokenizer = tensorflow_text.WordpieceTokenizer(
        vocab_table, token_out_type=tf.string)
result = tokenizer.tokenize(tokens)
print(result.to_list())
[[['they', "##'", '##re'], ['the'], ['great', '##est']]]
这些分词器都对 UTF-8 编码字符串进行分词,并且包含一个选项用于获取原始字符串的字节偏移量。这允许调用者知道为每个创建的标记创建的原始字符串中的字节对齐。

tokenizer = tensorflow_text.UnicodeScriptTokenizer()
(tokens, offset_starts, offset_limits) = tokenizer.tokenize_with_offsets(['everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])
print(tokens.to_list())
print(offset_starts.to_list())
print(offset_limits.to_list())
[['everything', 'not', 'saved', 'will', 'be', 'lost', '.'], ['Sad', '\xe2\x98\xb9']]
[[0, 11, 15, 21, 26, 29, 33], [0, 3]]
[[10, 14, 20, 25, 28, 33, 34], [3, 6]]

结论

这只是 TF.Text 的表面。除了这些分词器,我们还包括用于规范化、n 元组、标记的序列约束等等的操作!我们鼓励您访问我们的 Github 存储库,并在您自己的模型开发中尝试使用这些操作。使用 PIP 安装很容易
pip install tensorflow-text
有关更深入的工作示例,请查看我们的 Colab 笔记本。它包含许多新提供的操作的代码片段,这些代码片段在这里没有讨论。我们期待继续这项工作,并提供更多工具,使您的语言模型在 TensorFlow 中更容易构建。


下一篇文章
Introducing TF.Text

作者:Robby Neale,软件工程师

TensorFlow 提供了大量操作,这些操作对从图像和视频构建模型非常有用。但是,许多模型都从文本开始,并且从这些模型构建的语言模型在将文本馈送到模型之前需要一些预处理。例如,文本分类教程 使用 IMDB 集,从已经转换为整数 ID 的文本数据开始…