Zh_segmentation:基于 Chinese Treebank 6.0 构建的中文分词模型

概览

该模型可将中文文本分割为分词 (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 个维度。不同文本拥有不同的分词数量,因此该维度不规则。
  • startsint64 的 RaggedTensor,其中 start_offsets[i1...iN, j] 是 input_text[i1…iN] 中第 j 个分词开头的字节偏移量。
  • endsint64RaggedTensor,其中 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 倡导的测试内容进行检验,以词条为基准进行评估,本模型能达到下列水准:

  • 精度:94.76%
  • 召回率:94.91%
  • F1 值:94.83%

这说明,平均来看,预测分词有 94.76% 的概率正确(即与测试数据中的分词完全一致),而测试数据中的分词有 94.91% 的概率与模型报告的结果吻合。F1 值是精度和召回率指标的调和平均数。

如何引用

本分类器基于以下列论文构建:

此论文提出采用神经网络预测输入中各个 Unicode 字符的分割/合并标签,表明我们是否以该点作为新分词的开头。一个特殊的 tensorflow_text 算子使用这些标签生成实际分词和偏移量。单层卷积神经网络 (CNN) 即可拥有出众的推理速度,因此我们用其代替前馈神经网络。其他区别在于前者的嵌入向量尺寸更小,可以节省模型空间和计算成本,并且其训练使用更现代的 TensorFlow 工具。

适用范围及使用限制

  • 此模型适合用于分割以简体中文剧本书写的正式新闻类中文文本。
  • 此模型不适合用于非正式文本(例如短信)以及繁体中文字符文本。

许可证

此模型遵循 Apache 2.0。若您打算将其用于许可用途以外的目的,请提前咨询模型所有者。

发布人:Google
许可证:Apache-2.0

最后更新时间:2020 年 12 月 24 日

原文:zh_segmentation
中文:TensorFlow 公众号