<!-- markdownlint-disable MD014 -->
# BudouX
[![PyPI](https://img.shields.io/pypi/v/budoux?color=blue)](https://pypi.org/project/budoux/) [![npm](https://img.shields.io/npm/v/budoux?color=yellow)](https://www.npmjs.com/package/budoux) [![Maven Central](https://img.shields.io/maven-central/v/com.google.budoux/budoux)](https://mvnrepository.com/artifact/com.google.budoux/budoux)
独立的。小巧。语言中立。
BudouX 是 [Budou](https://github.com/google/budou) 的升级版,使用机器学习技术的换行组织工具。
![Example](https://yellow-cdn.veclightyear.com/2b54e442/0e94e829-eda8-4704-b937-6bf273d2e629.png)
它是 **独立的**。它无需依赖第三方分词器,比如 Google Cloud 自然语言 API。
它是 **小巧的**。它的体积只有大约 15 KB,包括其机器学习模型。即使在客户端使用也是合理的。
它是 **语言中立的**。通过向 BudouX 的训练脚本提供数据集,您可以为任何语言训练模型。
最后但并非最不重要的是,BudouX 支持 HTML 输入。
## 演示
<https://google.github.io/budoux>
## 默认支持的自然语言
- 日语
- 简体中文
- 繁体中文
- 泰语
## 支持的编程语言
- Python
- [JavaScript](https://github.com/google/budoux/tree/main/javascript/)
- [Java](https://github.com/google/budoux/tree/main/java/)
## Python 模块
### 安装
```shellsession
$ 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。
CLI
您还可以使用 budoux
命令在终端上格式化输入。
$ budoux 本日は晴天です。 # 默认: 日语
本日は
晴天です。
$ 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 是 Budou 的继任者,
使用机器学习技术的换行整理工具。
位置参数:
TXT 文本 (默认: 无)
可选参数:
-h, --help 显示此帮助信息并退出
-H, --html HTML 模式 (默认: False)
-m JSON, --model JSON 自定义模型文件路径 (默认: /path/to/budoux/models/ja.json)
-l LANG, --lang LANG 自定义模型的语言 (默认: 无)
-d STR, --delim STR 文本模式中的输出分隔符 (默认: ---)
-V, --version 显示程序版本号并退出
支持的 `-l` `--lang` 语言:
- ja
- zh-hans
- zh-hant
- th
警告
BudouX 支持 HTML 输入并输出带有标记的 HTML 字符串以包裹短语,但它并不意味着用于 HTML 消毒。BudouX 不会对任何输入进行消毒。 恶意的 HTML 输入会产生恶意的 HTML 输出。如果您不信任输入内容,请使用合适的消毒库。
背景
英文文本有许多线索,比如空格和连字符,可以实现漂亮且可读的换行。然而,一些 CJK 语言缺乏这些线索,因此处理起来特别困难。换行可能会随机发生,并且通常在没有更仔细处理的情况下出现在词或短语的中间。这是 Web 排版中的一个长期问题,导致可读性下降。
2016 年,Budou 被提出作为这个问题的解决方案。它自动将 CJK 句子翻译成带有词汇短语包裹在不间断标记中的 HTML,从而以语义上控制换行。Budou 在某种程度上解决了这个问题,但它在与现代 web 生产工作流程的集成中仍存在一些问题。
将 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
的完成时间取决于您的计算机资源。
好消息是训练算法是一个 anytime algorithm,因此即使中断执行,您也可以获得权重文件。在这种情况下,您可以通过将该权重文件传递给 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 # 解压后得到 KNBC_v1.0_090925_utf8 目录
$ python scripts/prepare_knbc.py KNBC_v1.0_090925_utf8 -o source_knbc.txt
作者
免责声明
这不是谷歌官方支持的产品。