概览
该模型可将中文文本分割为分词 (Token)。用户可在其 TensorFlow (TF) 计算图中执行中文分词,而不是使用与该 TF 图可能不同步的单独预处理流水线。
通过调用由 tensorflow_text 所提供的 HubModuleTokenizer
包装类即可便捷地使用本模型。
依赖要求与兼容性
本模型需要安装 2.4.0b0 或更高版本的 tensorflow_text,可以同时以 TF2 或 TF1 兼容模式运行(详见下方示例)。在大多数系统中,可以通过下方命令安装所需的依赖要求:
pip install "tensorflow_text>=2.4.0b0"
此命令会同时安装 TensorFlow 2 版本的相关依赖(即 tensorflow_text 的依赖库)。
注:即使您不使用 HubModuleTokenizer
包装类,您仍需安装 tensorflow_text,因为本模型会调用由 tensorflow_text 中自定义的算子。
模型 API
我们强烈建议您通过 HubModuleTokenizer
包装类来使用此模型,原因如下:
首先,实例化一个 HubModuleTokenizer
:
import tensorflow_text as text
# 设定模型的 UR
MODEL_HANDLE = "https://hub.tensorflow.google.cn/google/zh_segmentation/1"
segmenter = text.HubModuleTokenizer(MODEL_HANDLE)
接下来,通过以下调用执行分词化 (Tokenization)
tokens, starts, ends = segmenter.tokenize_with_offsets(input_text)
input_text
应当为 Tensor 或由 UTF-8 字符串组成的 RaggedTensor。输入的秩可为任意值(即不一定为 1);本节其余部分中,假定 input_text
的秩为N
。
模型将以元组 (Tuple) 的方式返回三个元素:
tokens
是一个RaggedTensor
,由 UTF-8 字符串组成,其中tokens[i1...iN, j]
是input_text[i1...iN]
中第j
个分词的字符串内容。直观地说,此张量(以及下方的其他两个张量)与input_text
的形状相同,但多了分词的第N+1
个维度。不同文本拥有不同的分词数量,因此该维度不规则。starts
是int64
的 RaggedTensor,其中start_offsets[i1...iN, j]
是 input_text[i1…iN] 中第 j 个分词开头的字节偏移量。ends
是int64
的RaggedTensor
,其中end_offsets[i1...iN, j]
是紧随input_text[i...iN]
中第j
个分词结尾的字节偏移量。
注:分词开头/结尾偏移量以字节(而非 Unicode 字符数)为单位,并且是指针对 input_text
中对应元素开头的相对偏移量(第一个字节的偏移量为 0)。
如果您不需要此类偏移量,有一种更为简便调用方式:
tokens = segmenter.tokenize(input_text)
示例
下方示例使用 Python 3 和以下设定:
MODEL_HANDLE = "https://hub.tensorflow.google.cn/google/zh_segmentation/1"
原生 TF2,Eager 模式
import tensorflow_text as text
# 实例化 HubModuleTokenizer 需要一定时间,因此最好创建
# 一个实例,将其(重复)用于多个查询。
segmenter = text.HubModuleTokenizer(MODEL_HANDLE)
# 分割由两个字符串组成的单个批次。
input_text = ["新华社北京", "北京"]
tokens, starts, ends = segmenter.tokenize_with_offsets(input_text)
# 预期结果为:
assert tokens.to_list() == [
["新华社".encode("utf-8"), "北京".encode("utf-8")],
["北京".encode("utf-8")]
]
assert starts.to_list() == [[0, 9], [0]]
assert ends.to_list() == [[9, 15], [6]]
# 可以使用“segmenter”处理更多字符串。
...
第一段文本(“新华社北京”)将分割为两个分词:“新华社"和"北京”。第一个分词开头的字节偏移量为 0,结尾恰好落在相对于输入字符串开头字节偏移量为 9 的位置前(即字节偏移量为 8 的位置)。第二个分词开头的字节偏移量为 9,结尾恰好落在字节偏移量为 15 的位置前。请注意,这些偏移量以字节(而非 Unicode 字符数)为单位。第二段文本(“北京”)仅由一个分词组成。
TF1 兼容模式
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import tensorflow_text as text
# 构建 TensorFlow 图
segmentation_graph = tf.Graph()
with segmentation_graph.as_default():
input_text = tf.placeholder(dtype=tf.string, shape=(None,))
segmenter = text.HubModuleTokenizer(MODEL_HANDLE)
tokens, starts, ends = segmenter.tokenize_with_offsets(input_text)
with tf.Session(graph=segmentation_graph) as sess:
# 执行初始化
sess.run(tf.tables_initializer())
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
# 使用 TF 图分割两个字符串
results = sess.run(
[tokens, starts, ends],
feed_dict={input_text: ["新华社北京", "北京"]})
# 预期结果为:
assert results[0].to_list() == [
["新华社".encode("utf-8"), "北京".encode("utf-8")],
["北京".encode("utf-8")]
]
assert results[1].to_list() == [[0, 9], [0]]
assert results[2].to_list() == [[9, 15], [6]]
# 可以使用 segmentation_graph 处理更多字符串。
训练数据
此模型基于 Chinese TreeBank 6.0 训练,这是标准汉语新闻报道的数据集,数据来自新华社、光华杂志、香港特别行政区网站和各类广播新闻节目。
- Chinese TreeBank 6.0
Chinese Treebank 6.0 - Linguistic Data Consortium
性能
遵循 Chinese TreeBank 6.0 倡导的测试内容进行检验,以词条为基准进行评估,本模型能达到下列水准:
- 精度:94.76%
- 召回率:94.91%
- F1 值:94.83%
这说明,平均来看,预测分词有 94.76% 的概率正确(即与测试数据中的分词完全一致),而测试数据中的分词有 94.91% 的概率与模型报告的结果吻合。F1 值是精度和召回率指标的调和平均数。
如何引用
本分类器基于以下列论文构建:
- Jan A. Botha、Emily Pitler、Ji Ma、Anton Bakalov、Alex Salcianu、David Weiss、Ryan McDonald、Slav Petrov:《使用小型前馈网络进行自然语言处理》(Natural Language Processing with Small Feed-Forward Networks)
此论文提出采用神经网络预测输入中各个 Unicode 字符的分割/合并标签,表明我们是否以该点作为新分词的开头。一个特殊的 tensorflow_text 算子使用这些标签生成实际分词和偏移量。单层卷积神经网络 (CNN) 即可拥有出众的推理速度,因此我们用其代替前馈神经网络。其他区别在于前者的嵌入向量尺寸更小,可以节省模型空间和计算成本,并且其训练使用更现代的 TensorFlow 工具。
适用范围及使用限制
- 此模型适合用于分割以简体中文剧本书写的正式新闻类中文文本。
- 此模型不适合用于非正式文本(例如短信)以及繁体中文字符文本。
许可证
此模型遵循 Apache 2.0。若您打算将其用于许可用途以外的目的,请提前咨询模型所有者。
发布人:Google
许可证:Apache-2.0最后更新时间:2020 年 12 月 24 日