许可证:Apache-2.0
语言:
- 英语
标签:
- 文本生成
- 标点恢复
- 大小写校正
- 句子边界检测
- 自然语言处理
小部件示例:
- 文本:"嘿,最近怎么样?好久不见,晚上六点一起喝一杯吧"
- 文本:"你好用户,这是一个示例输入。这段文本应被拆分为多个句子,包括一个最终疑问句。成功了吗?"
库名称:通用
推理支持:是
模型概述
该模型接收小写无标点的英文文本作为输入,一次性完成标点恢复、大小写校正(首字母大写)和句子边界检测(分段)。
与许多类似模型不同,本模型通过特殊的"缩写词"类别预测带标点的缩写(如"U.S."),并通过多标签大小写预测支持任意大小写形式的单词(如NATO、McDonald's等)。
小部件说明:文本生成小部件似乎不保留换行符。相反,模型会在预测的句子边界处插入换行标记\n
。
使用方法
推荐安装punctuators包快速使用:
pip install punctuators
若包出现问题,请在社区标签页反馈(我会频繁更新模型可能导致兼容性问题)。
以下示例展示如何为周末回忆添加标点,以及处理包含缩写和虚构句子的情况:
示例代码
from typing import List
from punctuators.models import PunctCapSegModelONNX
m = PunctCapSegModelONNX.from_pretrained("pcs_en")
input_texts: List[str] = [
"我早上6点起床带狗去metacomet山脉徒步,我们喜欢周末早晨探险",
"尽管已是三月中旬,康涅狄格州从夜间到清晨都在下雪,山区的雪比Farmington山谷更厚",
"回家后我在Lambda Cloud的A100 GPU上训练了这个模型,使用了约1000万行文本,总成本不到5美元",
"乔治·HW·布什担任了8年美国总统",
"我在商店见到史密斯先生,他正选购新割草机,我推荐了新型电池款,它们安静多了",
"我去FGw商店买了TG光学瞄准镜",
"ITMA是BBC 1939至1949年播出的广播喜剧节目,以Tommy Handley为核心,讽刺战时官僚主义"
]
results: List[List[str]] = m.infer(input_texts)
for input_text, output_texts in zip(input_texts, results):
print(f"输入: {input_text}")
print("输出:")
for text in output_texts:
print(f"\t{text}")
预期输出
输入: 我早上6点起床带狗去metacomet山脉徒步...
输出:
我早上6点起床带狗去Metacomet山脉徒步。
我们喜欢周末早晨探险。
输入: 尽管已是三月中旬...
输出:
尽管已是三月中旬,康涅狄格州从夜间到清晨都在下雪。
山区的雪比Farmington山谷更厚。
...(其余输出省略)
技术细节
模型架构包含以下关键步骤:
- 编码:使用32k词表的SentencePiece分词器处理文本,6层Transformer编码器(维度512)生成表征
- 标点预测:前馈网络逐子词预测标点(支持缩写词如"U.S.")
- 句子边界检测:结合标点嵌入预测分句位置
- 大小写校正:基于句子边界信息的多字符分类网络(支持特殊大小写如"NATO")
最大处理长度为256子词,但punctuators包会自动分段处理长文本。
标点符号表
标记 |
说明 |
NULL |
无标点 |
ACRONYM |
缩写词点号 |
. |
句号 |
, |
逗号 |
? |
问号 |
训练信息
- 框架:基于NeMo分支训练
- 数据:WMT新闻爬取数据(约1000万行,混合2021和2012年数据以减少COVID话题偏差)
局限性
- 领域适应:新闻数据训练,对话/非正式文本效果可能不佳
- 数据噪声:未人工清洗,缩写形式存在变体(如"US"出现37,332次,"U.S."85,324次)
- 句子边界:训练数据存在多句同行情况,可能影响分句准确性
评估指标
在3000条10句组合的测试集上:
- 标点恢复:F1 97.21(微平均)
- 大小写校正:使用预测标点时F1 99.50,使用真实标点时提升至99.66
- 分句检测:预测标点条件下F1 99.09,真实标点下可达99.97
趣味发现
标点嵌入分析显示:
- 句号"?"与问号"?"表征完全一致(均表示句子结束)
- 逗号","与NULL表征相同(均不影响分句)
- 缩写词嵌入介于句号和NULL之间(因缩写可能作为句尾或句中成分)