zonuexe / budoux
一个小巧、独立且语言中立的换行组织器。
Requires
- php: ^8.0
- ext-mbstring: *
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^11.0
README
BudouX for PHP
独立。小巧。语言中立。
BudouX 是 Budou 的继任者,Budou 是一种由机器学习支持的换行组织工具。
它是 独立的。它无需依赖第三方分词器(如 Google Cloud Natural Language API)即可运行。
它是 小巧的。包括机器学习模型在内,它只占用大约 15 KB 的空间。即使在客户端使用也是合理的。
它是 语言中立的。您可以通过向 BudouX 的训练脚本提供数据集来为任何语言训练一个模型。
最后但同样重要的是,BudouX 支持 HTML 输入。
演示
https://google.github.io/budoux
默认支持的自然语言
- 日语
- 简体中文
- 繁体中文
- 泰语
支持的编程语言
- PHP (Packagist: zonuexe/budoux)
以下语言由原始的 BudouX 提供。
- Python
- JavaScript
- Java
Python 模块
安装
$ pip install budoux
使用
库
您可以通过将句子输入到解析器中来获取短语列表。最简单的方法是为每种语言加载默认解析器。
日语
import budoux parser = budoux.load_default_japanese_parser() print(parser.parse('今日は天気です。')) # ['今日は', '天気です。']
简体中文
import budoux parser = budoux.load_default_simplified_chinese_parser() print(parser.parse('今天是晴天。')) # ['今天', '是', '晴天。']
繁体中文
import budoux parser = budoux.load_default_traditional_chinese_parser() print(parser.parse('今天是晴天。')) # ['今天', '是', '晴天。']
泰语
import budoux parser = budoux.load_default_thai_parser() print(parser.parse('วันนี้อากาศดี')) # ['วัน', 'นี้', 'อากาศ', 'ดี']
您还可以将 HTML 字符串翻译成包含非断行标记的短语。默认解析器使用零宽空格(U+200B)来分隔短语。
print(parser.translate_html_string('今日は<b>とても天気</b>です。')) # <span style="word-break: keep-all; overflow-wrap: anywhere;">今日は<b>\u200bとても\u200b天気</b>です。</span>
请注意,示例上方的分隔符表示为 \u200b
,仅为说明目的,但实际输出是一个不可见的字符串,因为它是一个零宽空格。
如果您有一个自定义模型,可以使用以下方式使用它。
with open('/path/to/your/model.json') as f: model = json.load(f) parser = budoux.Parser(model)
BudouX 的模型文件是一个包含由机器学习训练提取的特征及其得分的 JSON 文件。每个得分代表特征在决定是否在特定点断句中的重要性。
有关 JavaScript 模型的更多详细信息,请参阅 JavaScript 模块 README。
命令行界面
您还可以使用 budoux
命令在终端上格式化输入。
$ budoux 本日は晴天です。 # default: japanese 本日は 晴天です。 $ budoux -l ja 本日は晴天です。 本日は 晴天です。 $ budoux -l zh-hans 今天天气晴朗。 今天 天气 晴朗。 $ budoux -l zh-hant 今天天氣晴朗。 今天 天氣 晴朗。 $ budoux -l th วันนี้อากาศดี วัน นี้ อากาศ ดี
$ echo $'本日は晴天です。\n明日は曇りでしょう。' | budoux 本日は 晴天です。 --- 明日は 曇りでしょう。
$ budoux 本日は晴天です。 -H <span style="word-break: keep-all; overflow-wrap: anywhere;">本日は\u200b晴天です。</span>
请注意,示例上方的分隔符表示为 \u200b
,仅为说明目的,但实际输出是一个不可见的字符串,因为它是一个零宽空格。
如果您想查看帮助,请运行 budoux -h
。
$ budoux -h usage: budoux [-h] [-H] [-m JSON | -l LANG] [-d STR] [-V] [TXT] BudouX is the successor to Budou, the machine learning powered line break organizer tool. positional arguments: TXT text (default: None) optional arguments: -h, --help show this help message and exit -H, --html HTML mode (default: False) -m JSON, --model JSON custom model file path (default: /path/to/budoux/models/ja.json) -l LANG, --lang LANG language of custom model (default: None) -d STR, --delim STR output delimiter in TEXT mode (default: ---) -V, --version show program's version number and exit supported languages of `-l`, `--lang`: - ja - zh-hans - zh-hant - th
注意事项
BudouX 支持HTML输入并输出带有短语包装的HTML字符串,但它不是为了用作HTML净化器。《strong>BudouX 不净化任何输入。恶意HTML输入会产生恶意HTML输出。如果您不相信输入,请使用适当的净化库。
背景
英文文本有许多线索,如间距和连字符,这些线索有助于实现美观和可读的换行。然而,一些 CJK 语言缺少这些线索,因此处理起来更为困难。换行可能随机发生,通常在单词或短语中间,如果没有更谨慎的方法,就会这样。这是 Web 排版中一个长期存在的问题,导致可读性下降。
2016年,Budou被提出作为解决这个问题的方案。它能够自动将CJK句子翻译成HTML,使用非断开标记包裹的词汇短语,以实现语义上的行断控制。Budou在一定程度上解决了这个问题,但它仍然存在一些与现代网络生产工作流程集成的问题。
将Budou应用于网站的最大障碍是它依赖于第三方词分割器。通常,词分割器是一个大型程序,对于每个网页请求来说下载是不切实际的。考虑到速度和成本,每句话都向基于云的词分割服务发送请求也不是一个好的选择。这就是为什么我们需要一个独立的行断组织工具,它配备了自己的分割引擎,足够小,可以捆绑在客户端JavaScript代码中的原因。
BudouX是Budou的后继产品,旨在与您的网站无缝集成。
工作原理
BudouX使用AdaBoost算法将句子分割成短语,将任务视为一个二元分类问题,以预测在所有字符之间是否应该断行。它使用诸如断点周围的字符、它们的Unicode块以及它们的组合等特征来做出预测。输出机器学习模型,编码为JSON文件,存储特征及其显著性分数的配对。BudouX解析器接受一个模型文件来构建一个分割器,并将输入句子转换为短语列表。
构建自定义模型
您可以通过准备目标语言中的训练数据来为任何语言构建自定义模型。训练数据集是一个大文本文件,由短语分隔的句子组成,分隔符号为"▁"(U+2581),如下所示。
私は▁遅刻魔で、▁待ち合わせに▁いつも▁遅刻してしまいます。
メールで▁待ち合わせ▁相手に▁一言、▁「ごめんね」と▁謝れば▁どうにか▁なると▁思っていました。
海外では▁ケータイを▁持っていない。
假设文本文件保存为mysource.txt
,您可以通过运行以下命令构建自己的自定义模型。
$ pip install .[dev] $ python scripts/encode_data.py mysource.txt -o encoded_data.txt $ python scripts/train.py encoded_data.txt -o weights.txt $ python scripts/build_model.py weights.txt -o mymodel.json
请注意,train.py
的完成时间取决于您的计算机资源。好消息是,训练算法是一个任何时间算法,因此即使您中断执行,您也可以获得权重文件。即使在这种情况下,您也可以通过将权重文件传递给build_model.py
来构建有效的模型文件。
从KNBC语料库构建针对日语的训练数据集
日语的默认模型(budoux/models/ja.json
)使用KNBC语料库构建。您可以通过运行以下命令从语料库中创建一个训练数据集,例如,我们将其命名为source_knbc.txt
。
$ curl -o knbc.tar.bz2 https://nlp.ist.i.kyoto-u.ac.jp/kuntt/KNBC_v1.0_090925_utf8.tar.bz2 $ tar -xf knbc.tar.bz2 # outputs KNBC_v1.0_090925_utf8 directory $ python scripts/prepare_knbc.py KNBC_v1.0_090925_utf8 -o source_knbc.txt
作者
免责声明
这不是一个官方支持的Google产品。