TF.Text 来啦!
TensorFlow 提供了一系列算子,帮助用户构建应用于视频和图像数据的模型。然而,许多模型都应用于文本,从这些模型构建的语言模型需要进行一些预处理,才能将文本喂给模型。例如,基于 IMDB 数据集的文本分类教程,需要将文本数据转换成整数 ID 再用作输入。若模型训练和推理时的数据预处理有所差异,则需要额外的精力来进行协调。
简介
TF.Text 是一个 TensorFlow 2.0 库,可以使用 pip 命令轻松安装,旨在提供用于处理文本模型中常见的预处理任务的运算,以及 TensorFlow 核心组件所无法提供的其他语言建模的实用功能,进而缓解这一问题。其中最常见的功能就是文本的词条化 (text tokenization)。词条化是将字符串分解为 token 的过程。这些 token 可能是单词、数字和标点符号,或是上述几种元素的组合。
每个所含的分词器 (tokenizers) 均会返回不规则张量 (RaggedTensors),其中最内层维度的 token 会映射到各个初始字符串。由此,所产生的形状便会增加一个等级。具体如下图所示,但若您不熟悉不规则张量,请参阅 不规则张量指南(https://github.com/tensorflow/model-optimization)。
分词器
我们现阶段提供三种新的分词器(如近期的 RFC 中所提出的)。其中最基本的是空白分词器 (whitespace tokenizer),可在 ICU 定义的空白字符(如空格、制表符和换行符)上拆分 UTF-8 字符串。
1tokenizer = tensorflow_text.WhitespaceTokenizer()
2tokens = tokenizer.tokenize(['everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])
3print(tokens.to_list())
1[['everything', 'not', 'saved', 'will', 'be', 'lost.'], ['Sad\xe2\x98\xb9']]
初始版本还包括 Unicode script 分词器 (unicode script tokenizer),可根据 Unicode script 边界拆分 UTF-8 字符串。Unicode script 是具有历史相关语言派生的字符和符号的集合。请查看 Unicode 国际化组件 (ICU) UScriptCode 值,了解完整的枚举集合。值得注意的是,它和空白分词器很类似,两者最明显的区别在于后者可以从标准文本(如 USCRIPT_LATIN、USCRIPT_CYRILLIC 等)中分割出标点符号 USCRIPT_COMMON。
1tokenizer = tensorflow_text.UnicodeScriptTokenizer()
2tokens = tokenizer.tokenize(['everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])
3print(tokens.to_list())
1[['everything', 'not', 'saved', 'will', 'be', 'lost', '.'], ['Sad', '\xe2\x98\xb9']]
1def _CreateTable(vocab, num_oov=1):
2 init = tf.lookup.KeyValueTensorInitializer(
3 vocab,
4 tf.range(tf.size(vocab, out_type=tf.int64), dtype=tf.int64),
5 key_dtype=tf.string,
6 value_dtype=tf.int64)
7 return tf.lookup.StaticVocabularyTable(
8 init, num_oov, lookup_key_dtype=tf.string)
9
10vocab_table = _CreateTable(["great", "they", "the", "##'", "##re", "##est"])
11
12tokens = [["they're", "the", "greatest"]]
13tokenizer = tensorflow_text.WordpieceTokenizer(
14 vocab_table, token_out_type=tf.string)
15result = tokenizer.tokenize(tokens)
16print(result.to_list())
1[[['they', "##'", '##re'], ['the'], ['great', '##est']]]
上述各分词器都可对 UTF-8 编码字符串进行标记,并提供了将字节偏移量转换为原始字符串的选项。调用者可以了解创建的 token 的原始字符串中的字节对齐。
1tokenizer = tensorflow_text.UnicodeScriptTokenizer()
2(tokens, offset_starts, offset_limits) = tokenizer.tokenize_with_offsets(['everything not saved will be lost.', u'Sad☹'.encode('UTF-8')])
3print(tokens.to_list())
4print(offset_starts.to_list())
5print(offset_limits.to_list())
1[['everything', 'not', 'saved', 'will', 'be', 'lost', '.'], ['Sad', '\xe2\x98\xb9']]
2[[0, 11, 15, 21, 26, 29, 33], [0, 3]]
3[[10, 14, 20, 25, 28, 33, 34], [3, 6]]
结论
本文仅对 TF.Text 做了一个简单介绍。除以上分词器外,我们还会提供用于归一化、N-Gram 以及标签序列约束等更多功能的算子!欢迎您访问我们的 Github 代码库,并在您的模型开发中尝试使用这些算子。PIP 十分易于安装:
1pip install tensorflow-text
有关更深入的实例,可以查看 Colab notebook 内容,其中包含许多本文中未讨论的新的可用算子的各种代码段。我们将不断提供更多的新工具,让使用 TensorFlow 构建语言模型变得更加方便。
如果您想详细了解 TensorFlow 的相关内容,请参阅以下文档。这些文档深入探讨了这篇文章中提及的许多主题:
文本分类教程
(https://www.tensorflow.org/tutorials/keras/basic_text_classification)
RFC
(https://github.com/tensorflow/community/pull/98)
UScriptCode values
(http://icu-project.org/apiref/icu4c/uscript_8h.html)
BERT models
(https://ai.googleblog.com/2018/11/open-sourcing-bert-state-of-art-pre.html)
Colab notebook
(https://github.com/tensorflow/text/blob/master/examples/intro.ipynb)
Github 代码库
(https://github.com/tensorflow/text)