查看原文
其他

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

TensorFlow TensorFlow 2021-07-26


概览

该模型可将中文文本分割为分词 (Token)。用户可在其 TensorFlow (TF) 计算图中执行中文分词,而不是使用与该 TF 图可能不同步的单独预处理流水线。


通过调用由 tensorflow_text 所提供的 HubModuleTokenizer 包装类即可便捷地使用本模型。

  • tensorflow_text
    https://tensorflow.google.cn/tutorials/tensorflow_text/intro



依赖要求与兼容性

本模型需要安装 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

  • RaggedTensor
    https://tensorflow.google.cn/guide/ragged_tensor


模型将以元组 (Tuple) 的方式返回三个元素:
  • tokens 是一个 RaggedTensor,由 UTF-8 字符串组成,其中tokens[i1...iN, j]input_text[i1...iN] 中第 j 个分词的字符串内容。直观地说,此张量(以及下方的其他两个张量)与 input_text 的形状相同,但多了分词的第 N+1 个维度。不同文本拥有不同的分词数量,因此该维度不规则。
  • startsint64RaggedTensor,其中 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
    https://catalog.ldc.upenn.edu/LDC2007T36



性能

遵循 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)

  • 使用小型前馈网络进行自然语言处理
    https://arxiv.org/pdf/1708.00214.pdf


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

  • tensorflow_text
    https://tensorflow.google.cn/tutorials/tensorflow_text/intro



适用范围及使用限制

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



许可证

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

  • Apache 2.0
    https://www.apache.org/licenses/LICENSE-2.0


发布人:Google

许可证:Apache-2.0

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

https://hub.tensorflow.google.cn/google/zh_segmentation/1



了解更多请点击 “阅读原文” 访问官网。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存