英文

模型概述

该模型可以对49种常见语言进行文本句子边界检测(SBD)。

这个模型可以将一个较长的、带标点的文本分割成一个或多个组成句子。

一个重要特点是该模型在推理时是多语言和语言无关的。因此,在输入中不需要使用语言标签,而且一个批次可以包含多种语言。

模型输入和输出

模型的输入应该是带标点的文本。

对于每个输入的子词 t ,该模型预测 t 成为句子最后一个标记(即句子边界)的概率。

使用示例

使用该模型最简单的方式是通过安装 punctuators

$ pip install punctuators
使用示例
from typing import List

from punctuators.models import SBDModelONNX

# Instantiate this model
# This will download the ONNX and SPE models. To clean up, delete this model from your HF cache directory.
m = SBDModelONNX.from_pretrained("sbd_multi_lang")

input_texts: List[str] = [
    # English (with a lot of acronyms)
    "the new d.n.a. sample has been multiplexed, and the gametes are already dividing. let's get the c.p.d. over there. dinner's at 630 p.m. see that piece on you in the l.a. times? chicago p.d. will eat him alive.",
    # Chinese
    "魔鬼兵團都死了?但是如果这让你不快乐就别做了。您就不能发个电报吗。我們都準備好了。",
    # Spanish
    "él es uno de aquellos. ¿tiene algo de beber? cómo el aislamiento no vale la pena.",
    # Thai
    "พวกเขาต้องโกรธมากเลยใช่ไหม โทษทีนะลูกของเราไม่เป็นอะไรใช่ไหม ถึงเจ้าจะลากข้าไปเจ้าก็ไม่ได้อะไรอยู่ดี ผมคิดว่าจะดีกว่านะถ้าคุณไม่ออกไปไหน",
    # Ukrainian
    "розігни і зігни, будь ласка. я знаю, ваши люди храбры. было приятно, правда? для начала, тебе нужен собственный свой самолет.",
    # Polish
    "szedłem tylko do. pamiętaj, nigdy się nie obawiaj żyć na krawędzi ryzyka. ćwiczę już od dwóch tygodni a byłem zabity tylko raz.",
]

# Run inference
results: List[List[str]] = m.infer(input_texts)

# Print each input and it's segmented outputs
for input_text, output_texts in zip(input_texts, results):
    print(f"Input: {input_text}")
    print(f"Outputs:")
    for text in output_texts:
        print(f"\t{text}")
    print()
预期输出
Input: the new d.n.a. sample has been multiplexed, and the gametes are already dividing. let's get the c.p.d. over there. dinner's at 630 p.m. see that piece on you in the l.a. times? chicago p.d. will eat him alive.
Outputs:
    the new d.n.a. sample has been multiplexed, and the gametes are already dividing.
    let's get the c.p.d. over there.
    dinner's at 630 p.m.
    see that piece on you in the l.a. times?
    chicago p.d. will eat him alive.

Input: 魔鬼兵團都死了?但是如果这让你不快乐就别做了。您就不能发个电报吗。我們都準備好了。
Outputs:
    魔鬼兵團都死了?
    但是如果这让你不快乐就别做了。
    您就不能发个电报吗。
    我們都準備好了。

Input: él es uno de aquellos. ¿tiene algo de beber? cómo el aislamiento no vale la pena.
Outputs:
    él es uno de aquellos.
    ¿tiene algo de beber?
    cómo el aislamiento no vale la pena.

Input: พวกเขาต้องโกรธมากเลยใช่ไหม โทษทีนะลูกของเราไม่เป็นอะไรใช่ไหม ถึงเจ้าจะลากข้าไปเจ้าก็ไม่ได้อะไรอยู่ดี ผมคิดว่าจะดีกว่านะถ้าคุณไม่ออกไปไหน
Outputs:
    พวกเขาต้องโกรธมากเลยใช่ไหม
    โทษทีนะลูกของเราไม่เป็นอะไรใช่ไหม
    ถึงเจ้าจะลากข้าไปเจ้าก็ไม่ได้อะไรอยู่ดี
    ผมคิดว่าจะดีกว่านะถ้าคุณไม่ออกไปไหน

Input: розігни і зігни, будь ласка. я знаю, ваши люди храбры. было приятно, правда? для начала, тебе нужен собственный свой самолет.
Outputs:
    розігни і зігни, будь ласка.
    я знаю, ваши люди храбры.
    было приятно, правда?
    для начала, тебе нужен собственный свой самолет.

Input: szedłem tylko do. pamiętaj, nigdy się nie obawiaj żyć na krawędzi ryzyka. ćwiczę już od dwóch tygodni a byłem zabity tylko raz.
Outputs:
    szedłem tylko do.
    pamiętaj, nigdy się nie obawiaj żyć na krawędzi ryzyka.
    ćwiczę już od dwóch tygodni a byłem zabity tylko raz.

模型架构

这是一种数据驱动的 SBD 方法。该模型使用了 SentencePiece 分词器、BERT-style 编码器和线性分类器,来预测哪些子词是句子的边界。

鉴于这是一个相对简单的自然语言处理任务,模型包含了约 900 万个参数(其中大约 820 万个是嵌入层参数)。因此,该模型在推理时非常快速和高效,这就是 SBD 的特点。

BERT 编码器的配置如下:

  • 8 个注意力头
  • 4 层
  • 128 个隐藏维度
  • 512 个中间/前馈维度
  • 64000 个嵌入/词汇标记

模型训练

该模型是基于 NeMo 的个人分支进行训练的,具体来说是该 sbd 分支。

模型在每种语言上使用了大约 100 万行文本数据(总共约 4900 万行),全局批量大小为 256 个样本,进行了数十万个步骤的训练。批次是多语言的,通过对每种语言进行随机采样生成。

训练数据

该模型使用了 OpenSubtitles 数据集进行训练。

尽管该语料库存在很多噪音,但是它是少数几个被手动分段的大规模文本语料库之一。

自动分段的语料库有两个不可取的原因:

  • 数据驱动模型只会简单地模仿用于分割语料库的系统,无法获取比原始系统更多的知识(可能是一个简单的基于规则的系统)。
  • 基于规则的系统对于某些语言会发生灾难性的失败,但这对于非该语言的使用者来说很难检测到(比如我自己)。
  • 进行了一些启发式处理来尝试清理训练数据。以下是一些清理的示例:

    • 放弃以小写字母开头的句子。假设这些行是有错误的。
    • 对于没有以句号结尾的输入,添加该语言的默认句号。假设对于单句陈述句,句号对于字幕是不重要的。
    • 放弃掉超过 20 个词(或者对于连续书写的语言,超过 32 个字符)的输入。假设这些行包含多个句子,因此我们无法创建可靠的目标。
    • 放弃掉明显垃圾行:所有的标点符号/特殊字符、空行等。
    • 标准化标点符号:不超过一个连续的标点符号记号(除了西班牙语,在非反转标点符号之后可能出现反转标点符号)。

    训练示例生成

    为了为模型创建示例,我们

  • 假设每个输入行正好是一个句子
  • 将句子连接在一起,连接点成为句子边界的目标
  • 对于这个特定的模型,每个示例由 1 到 9 个句子连接在一起,模型之间显示了 0 到 8 个正向目标(句子边界)。选择要使用的句子数量是随机且均匀的,因此每个示例平均有 4 个句子边界。

    该模型使用了最大序列长度为 256,对于 OpenSubtitles 来说是相对较长的。如果在连接句子后,一个示例包含超过 256 个标记,那么序列将被截断为前 256 个子词。

    对于 50% 的输入文本,使用了小写字母,无论是对于分词器还是分类模型。这提供了一些增强,但更重要的是允许将此模型插入到 NLP 流水线中,在真正大小写之前或之后进行大小写处理。在真正大小写之前使用这个模型将允许真正大小写模型利用大小写对句子边界的条件概率。

    语言特定规则

    训练数据已经针对特定语言的标点和间隔规则进行了预处理。

    在训练过程中使用了以下准则。如果推理输入与之不同,模型的性能可能会较差。

    • 所有连续脚本语言(中文、日文)中的空格都被删除。
    • 中文:中文和日文使用全角句号 "。",问号 "?" 和逗号 ","。
    • 印度语/孟加拉语:这些语言使用了圆点 "।" 作为句号,而不是英文的 "."。
    • 阿拉伯语:使用的是倒置问号 "؟",而不是英文的 "?"。

    局限性和已知问题

    嘈杂的训练数据

    该模型是在 OpenSubtitles 上进行训练的,这个数据集的噪音很多。模型可能从这个数据中学到了一些不好的习惯。

    在训练过程中,假设每个输入行正好是一个句子。然而,事实并非总是如此。因此,模型可能会产生一些错误的负面结果,这可以解释为训练数据中的一些行包含多个句子。

    语言特定的期望

    如前文所述,每种语言应该符合该语言的格式和标点规则。

    例如,中文文本应该包含全角句号,而不是英文字母句号,而且不应该包含空格。

    在实践中,数据通常不遵循这些规则,但是该模型并没有被修改来处理这个潜在问题。

    指标

    由于我们依赖输入数据每行只包含一个句子,因此很难对该模型进行正确评估。实际上,迄今为止使用的数据集具有噪音,并且经常包含多个句子。

    目前还没有发布指标,评估仅限于手动抽查。

    目前正在寻找足够的测试数据来进行这个分析。