wtpsplit🪓
分割任意文本 - 稳健、高效、可适应⚡
本仓库允许您将文本分割成句子或其他语义单位。它实现了以下论文中的模型:
- SaT — 《Segment Any Text: 一种通用的稳健、高效和可适应的句子分割方法》,作者:Markus Frohmann、Igor Sterner、Benjamin Minixhofer、Ivan Vulić 和 Markus Schedl(最先进,推荐使用)。
- WtP — 《Where's the Point? 自监督多语言无标点句子分割》,作者:Benjamin Minixhofer、Jonas Pfeiffer 和 Ivan Vulić(先前版本,为了可重复性而维护)。
为保持一致性,保留了WtP这个名称。我们的新后续工作SaT提供了在85种语言中更稳健、高效和可适应的句子分割,性能更高,计算成本更低。查看我们的《Segment any Text》论文中展示的8个不同语料库和85种语言的最先进结果。
安装
pip install wtpsplit
使用方法
from wtpsplit import SaT
sat = SaT("sat-3l")
# 可选择在GPU上运行以获得更好的性能
# 也支持通过sat.to("xla:0")在TPU上运行,在这种情况下,向sat.split传递`pad_last_batch=True`参数
sat.half().to("cuda")
sat.split("这是一个测试 这是另一个测试。")
# 返回 ["这是一个测试 ", "这是另一个测试。"]
# 为了获得更好的性能,请这样做而不是对每个文本单独调用sat.split
sat.split(["这是一个测试 这是另一个测试。", "还有更多文本..."])
# 返回一个迭代器,为每个文本生成句子列表
# 对于一般的句子分割任务,使用我们的'-sm'模型
sat_sm = SaT("sat-3l-sm")
sat_sm.half().to("cuda") # 可选,见上文
sat_sm.split("这是一个测试 这是另一个测试")
# 返回 ["这是一个测试 ", "这是另一个测试"]
# 使用训练好的lora模块可以很好地适应语言和领域/风格
sat_adapted = SaT("sat-3l", style_or_domain="ud", language="en")
sat_adapted.half().to("cuda") # 可选,见上文
sat_adapted.split("This is a test This is another test.")
# 返回 ['This is a test ', 'This is another test']
可用模型
如果您需要通用的句子分割模型,请使用-sm
模型(例如sat-3l-sm
)
对于对速度敏感的应用,我们推荐使用3层模型(sat-3l
和sat-3l-sm
)。它们在速度和性能之间提供了很好的平衡。
最佳模型是我们的12层模型:sat-12l
和sat-12l-sm
。
模型 | 英语得分 | 多语言得分 |
---|---|---|
sat-1l | 88.5 | 84.3 |
sat-1l-sm | 88.2 | 87.9 |
sat-3l | 93.7 | 89.2 |
sat-3l-lora | 96.7 | 94.8 |
sat-3l-sm | 96.5 | 93.5 |
sat-6l | 94.1 | 89.7 |
sat-6l-sm | 96.9 | 95.1 |
sat-9l | 94.3 | 90.3 |
sat-12l | 94.0 | 90.4 |
sat-12l-lora | 97.3 | 95.9 |
sat-12l-sm | 97.4 | 96.0 |
得分是所有可用数据集的"英语"宏平均F1分数,以及所有数据集和语言的"多语言"宏平均F1分数。"adapted"表示通过LoRA进行适应;详情请查看论文。
作为比较,以下是一些其他工具的英语得分:
模型 | 英语得分 |
---|---|
PySBD | 69.6 |
SpaCy (sentencizer; 单语) | 92.9 |
SpaCy (sentencizer; 多语) | 91.5 |
Ersatz | 91.4 |
Punkt (nltk.sent_tokenize ) | 92.2 |
WtP (3l) | 93.9 |
请注意,该库还支持之前的WtP
模型。
你可以基本上以与SaT
模型相同的方式使用它们:
from wtpsplit import WtP
wtp = WtP("wtp-bert-mini")
# 与SaT模型类似的功能
wtp.split("这是一个测试 这是另一个测试。")
有关WtP的更多详细信息和复现细节,请参阅WtP文档。
段落分割
由于SaT经过训练可以预测换行概率,除了分句外,它们还可以将文本分割成段落。
# 返回一个段落列表,每个段落包含一个句子列表
# 通过`paragraph_threshold`参数调整段落阈值。
sat.split(text, do_paragraph_segmentation=True)
适应性调整
SaT可以通过LoRA进行领域和风格适应。我们为Universal Dependencies、OPUS100、Ersatz和TED(即ASR风格的转录演讲)句子风格提供了81种语言的sat-3l
和sat-12l
训练好的LoRA模块。此外,我们还提供了6种语言的法律文件(法律和判决)、4种语言对的代码切换以及3种语言的推文的LoRA模块。详情请参阅我们的论文。
我们还为sat-12-no-limited-lookahead
提供了16种体裁的诗句分割模块。
这样加载LoRA模块:
# 需要同时提供lang_code和style_or_domain
# 可用的选项请查看<model_repository>/loras文件夹
sat_lora = SaT("sat-3l", style_or_domain="ud", language="en")
sat_lora.split("你好 这是一个测试 但现在情况不同了 现在下一个开始了哈哈哈")
# 现在针对一个高度独特的领域
sat_lora_distinct = SaT("sat-12l", style_or_domain="code-switching", language="es-en")
sat_lora_distinct.split("早上在那边 每次我说什么 他就对我说什么")
你还可以自由调整分割阈值,较高的阈值会导致更保守的分割:
sat.split("这是一个测试 这是另一个测试。", threshold=0.4)
# 对于lora也类似工作;但阈值更高
sat_lora.split("你好 这是一个测试 但现在情况不同了 现在下一个开始了哈哈哈", threshold=0.7)
高级用法
获取文本的换行或句子边界概率:
# 返回换行概率(支持批处理!)
sat.predict_proba(text)
在HuggingFace transformers
中加载SaT模型:
# 导入库以注册自定义模型
import wtpsplit
from transformers import AutoModelForTokenClassification
model = AutoModelForTokenClassification.from_pretrained("segment-any-text/sat-3l-sm") # 或其他模型名称;请参见 https://huggingface.co/segment-any-text
通过LoRA适应你自己的语料库
我们的模型可以通过LoRA进行高效的适应性调整。仅需10-100个训练分割的训练句子就应该能显著提高性能。操作如下:
克隆仓库并安装依赖:
git clone https://github.com/segment-any-text/wtpsplit
cd wtpsplit
pip install -r requirements.txt
pip install adapters==0.2.1 --no-dependencies
cd ..
按此格式创建数据:
import torch
torch.save(
{
"language_code": {
"sentence": {
"dummy-dataset": {
"meta": {
"train_data": ["训练句子1", "训练句子2"],
},
"data": [
"测试句子1",
"测试句子2",
]
}
}
}
},
"dummy-dataset.pth"
)
创建/调整配置;通过model_name_or_path
提供基础模型,通过text_path
提供训练数据.pth:
configs/lora/lora_dummy_config.json
训练LoRA:
python3 wtpsplit/train/train_lora.py configs/lora/lora_dummy_config.json
训练完成后,将你保存的模块路径提供给SaT:
sat_lora_adapted = SaT("使用的模型", lora_path="dummy_lora_path")
sat_lora_adapted.split("一些特定领域或风格的文本")
根据你的需求调整上述数据集名称、语言和模型。
复现论文
configs/
包含论文中基础模型和sm模型以及LoRA模块的运行配置。按以下方式为每个配置启动训练:
python3 wtpsplit/train/train.py configs/<config_name>.json
python3 wtpsplit/train/train_sm.py configs/<config_name>.json
python3 wtpsplit/train/train_lora.py configs/<config_name>.json
此外:
wtpsplit/data_acquisition
包含获取评估数据和从 mC4 语料库获取原始文本的代码。wtpsplit/evaluation
包含以下代码:- 通过
intrinsic.py
进行评估(即句子分割结果)。 - 通过
intrinsic_pairwise.py
进行短序列评估(即句子对/k-mer 的句子分割结果)。 - LLM 基准评估(
llm_sentence.py
),法律基准评估(legal_baselines.py
) - 基准(PySBD、nltk 等)评估结果在
intrinsic_baselines.py
和intrinsic_baselines_multi.py
中 - JSON 格式的原始结果也在
evaluation_results/
中 - 统计显著性测试代码和结果在
stat_tests/
中 - 标点符号注释实验在
punct_annotation.py
和punct_annotation_wtp.py
(仅 WtP)中 - 机器翻译的外部评估在
extrinsic.py
(仅 WtP)中
- 通过
请确保事先安装 requirements.txt
中的软件包。
支持的语言
支持的语言表格
iso | 名称 |
---|---|
af | 南非荷兰语 |
am | 阿姆哈拉语 |
ar | 阿拉伯语 |
az | 阿塞拜疆语 |
be | 白俄罗斯语 |
bg | 保加利亚语 |
bn | 孟加拉语 |
ca | 加泰罗尼亚语 |
ceb | 宿务语 |
cs | 捷克语 |
cy | 威尔士语 |
da | 丹麦语 |
de | 德语 |
el | 希腊语 |
en | 英语 |
eo | 世界语 |
es | 西班牙语 |
et | 爱沙尼亚语 |
eu | 巴斯克语 |
fa | 波斯语 |
fi | 芬兰语 |
fr | 法语 |
fy | 西弗里西亚语 |
ga | 爱尔兰语 |
gd | 苏格兰盖尔语 |
gl | 加利西亚语 |
gu | 古吉拉特语 |
ha | 豪萨语 |
he | 希伯来语 |
hi | 印地语 |
hu | 匈牙利语 |
hy | 亚美尼亚语 |
id | 印度尼西亚语 |
ig | 伊博语 |
is | 冰岛语 |
it | 意大利语 |
ja | 日语 |
jv | 爪哇语 |
ka | 格鲁吉亚语 |
kk | 哈萨克语 |
km | 中央高棉语 |
kn | 卡纳达语 |
ko | 韩语 |
ku | 库尔德语 |
ky | 吉尔吉斯语 |
la | 拉丁语 |
lt | 立陶宛语 |
lv | 拉脱维亚语 |
mg | 马达加斯加语 |
mk | 马其顿语 |
ml | 马拉雅拉姆语 |
mn | 蒙古语 |
mr | 马拉地语 |
ms | 马来语 |
mt | 马耳他语 |
my | 缅甸语 |
ne | 尼泊尔语 |
nl | 荷兰语 |
no | 挪威语 |
pa | 旁遮普语 |
pl | 波兰语 |
ps | 普什图语 |
pt | 葡萄牙语 |
ro | 罗马尼亚语 |
ru | 俄语 |
si | 僧伽罗语 |
sk | 斯洛伐克语 |
sl | 斯洛文尼亚语 |
sq | 阿尔巴尼亚语 |
sr | 塞尔维亚语 |
sv | 瑞典语 |
ta | 泰米尔语 |
te | 泰卢固语 |
tg | 塔吉克语 |
th | 泰语 |
tr | 土耳其语 |
uk | 乌克兰语 |
ur | 乌尔都语 |
uz | 乌兹别克语 |
vi | 越南语 |
xh | 科萨语 |
yi | 意第绪语 |
yo | 约鲁巴语 |
zh | 中文 |
zu | 祖鲁语 |
详情请参阅我们的分割任意文本论文。
引用
对于 SaT
模型,请引用我们的论文:
@article{frohmann2024segment,
title={Segment Any Text: A Universal Approach for Robust, Efficient and Adaptable Sentence Segmentation},
author={Frohmann, Markus and Sterner, Igor and Vuli{\'c}, Ivan and Minixhofer, Benjamin and Schedl, Markus},
journal={arXiv preprint arXiv:2406.16678},
year={2024},
doi={10.48550/arXiv.2406.16678},
url={https://doi.org/10.48550/arXiv.2406.16678},
}
对于库和 WtP 模型,请引用:
@inproceedings{minixhofer-etal-2023-wheres,
title = "Where{'}s the Point? Self-Supervised Multilingual Punctuation-Agnostic Sentence Segmentation",
author = "Minixhofer, Benjamin and
Pfeiffer, Jonas and
Vuli{\'c}, Ivan",
booktitle = "Proceedings of the 61st Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)",
month = jul,
year = "2023",
address = "Toronto, Canada",
publisher = "Association for Computational Linguistics",
url = "https://aclanthology.org/2023.acl-long.398",
pages = "7215--7235"
}
致谢
本研究得到了奥地利科学基金会(FWF)的全部或部分资助:P36413、P33526和DFH-23,以及上奥地利州和联邦教育、科学和研究部通过LIT-2021-YOU-215拨款的支持。此外,Ivan Vulic和Benjamin Minixhofer还得到了皇家学会大学研究奖学金"面向真正多语言世界的包容性和可持续语言技术"(编号221137)的支持,该奖学金授予Ivan Vulić。本研究还得到了Google TPU研究云(TRC)提供的Cloud TPU支持。这项工作还得到了Cohere For AI研究资助的计算积分支持,这些资助旨在支持学术合作伙伴开展研究,目标是发布科学成果和数据以用于有益项目。我们还要感谢Simone Teufel的富有成效的讨论。
如有任何问题,请创建一个问题或发送电子邮件至markus.frohmann@gmail.com,我会尽快回复您。