🛥 Vaporetto: 基于高度加速的逐点预测的分词器
Vaporetto 是一个快速轻量级的基于逐点预测的分词器。 这个仓库包含了 Vaporetto 的 Rust crate API 和命令行前端。
Wasm 演示(加载模型需要一些时间。)
Python 封装版本可在这里获取。
使用示例
尝试分词
本软件使用 Rust 实现。请事先按照文档安装 rustc
和 cargo
。
Vaporetto 提供了三种生成分词模型的方法:
下载分发模型
第一种是最简单的方法,即下载我们已经训练好的模型。 模型可在这里获取。
我们选择 bccwj-suw+unidic_pos+pron
:
% wget https://github.com/daac-tools/vaporetto-models/releases/download/v0.5.0/bccwj-suw+unidic_pos+pron.tar.xz
每个文件都是包含模型文件和许可条款的压缩文件,因此你需要按以下命令解压下载的文件:
% tar xf ./bccwj-suw+unidic_pos+pron.tar.xz
要进行分词,请运行以下命令:
% echo 'ヴェネツィアはイタリアにあります。' | cargo run --release -p predict -- --model path/to/bccwj-suw+unidic_pos+pron.model.zst
将输出以下结果:
ヴェネツィア は イタリア に あり ます 。
Vaporetto API 注意事项
分发模型以 zstd 格式压缩。 如果你想使用 vaporetto API 加载这些压缩模型, 你必须在 API 外部解压它们。
// 需要 zstd crate 或 ruzstd crate
let reader = zstd::Decoder::new(File::open("path/to/model.zst")?)?;
let model = Model::read(reader)?;
你也可以使用现代 Linux 发行版自带的 unzstd 命令解压文件。
转换 KyTea 模型
第二种也是一种简单的方法,即转换由 KyTea 训练的模型。 首先,从 KyTea Models 页面下载你选择的模型。
我们选择 jp-0.4.7-5.mod.gz
:
% wget http://www.phontron.com/kytea/download/model/jp-0.4.7-5.mod.gz
每个文件都是压缩文件,因此你需要按以下命令解压下载的模型文件:
% gunzip ./jp-0.4.7-5.mod.gz
要将 KyTea 模型转换为 Vaporetto 模型,请在 Vaporetto 根目录下运行以下命令:
% cargo run --release -p convert_kytea_model -- --model-in path/to/jp-0.4.7-5.mod --model-out path/to/jp-0.4.7-5-tokenize.model.zst
现在你可以进行分词了。运行以下命令:
% echo 'ヴェネツィアはイタリアにあります。' | cargo run --release -p predict -- --model path/to/jp-0.4.7-5-tokenize.model.zst
将输出以下结果:
ヴェネツィア は イタリア に あ り ま す 。
训练你的模型
第三种方法主要面向研究人员,即准备训练语料库并训练你的分词模型。
Vaporetto 可以从两种类型的语料库进行训练:完全标注语料库和部分标注语料库。
完全标注语料库是指所有字符边界都被标注为词边界或词内部位置的语料库。 这是在词边界插入空格的形式,如下所示:
ヴェネツィア は イタリア に あり ます 。
火星 猫 の 生態 の 調査 結果
此外,部分标注语料库是指只有部分字符边界被标注的语料库。
每个字符边界都以 |
(词边界)、-
(非词边界)和
(未知)的形式标注。
以下是一个示例:
ヴ-ェ-ネ-ツ-ィ-ア|は|イ-タ-リ-ア|に|あ り ま す|。
火-星 猫|の|生-態|の|調-査 結-果
要训练模型,请使用以下命令:
% cargo run --release -p train -- --model ./你的模型.model.zst --tok 完整标注语料路径/full.txt --part 部分标注语料路径/part.txt --dict 词典路径/dict.txt --solver 5
--tok
参数指定一个完全标注的语料库,--part
参数指定一个部分标注的语料库。
你也可以用--dict
参数指定一个词典。
词典是一个按行列出单词的文件,可以根据需要添加标签:
トスカーナ
パンツァーノ
灯里/名词-专有名词-人名-名/アカリ
形態/名词-普通名词-一般/ケータイ
训练器不接受空行。 因此,在训练前请删除语料库中的所有空行。
你可以多次指定上述所有参数。
模型调整
有时,你的模型输出的结果可能与你的预期不同。
例如,在以下命令中外国人参政権
被错误地分词了。
我们使用--scores
选项来显示每个字符边界的分数:
% echo '外国人参政権と政権交代' | cargo run --release -p predict -- --scores --model 路径/到/bccwj-suw+unidic_pos+pron.model.zst
外国 人 参 政権 と 政権 交代
0:外国 -10784
1:国人 17935
2:人参 5308
3:参政 3833
4:政権 -3299
5:権と 14635
6:と政 17653
7:政権 -12705
8:権交 11611
9:交代 -5794
正确的分词是外国 人 参政 権
。
为了将外国人参政権
正确分词,按以下步骤调整模型,使参政権
的分数符号反转:
-
用以下命令导出词典:
% cargo run --release -p manipulate_model -- --model-in 路径/到/bccwj-suw+unidic_pos+pron.model.zst --dump-dict 路径/到/dictionary.csv
-
编辑词典。
词典是一个CSV文件。每行包含一个字符串模式、相应的权重数组和注释,顺序如下:
word
- 字符串模式(通常是一个词)weights
- 权重数组。当输入字符串包含该模式时,这些权重会被添加到模式范围内的字符边界。comment
- 不影响行为的注释。
当边界的总权重为正数时,Vaporetto会分割文本,所以我们添加一个新条目如下:
参撾,3328 -5545 3514, 参政,3328 -5545 3514, +参政権,0 -10000 10000 0,参政/権 参朝,3328 -5545 3514, 参校,3328 -5545 3514,
在这种情况下,
参
和政
之间会添加-10000
,政
和権
之间会添加10000
。 由于在模式两端指定了0
,所以这些位置不会添加分数。请注意,Vaporetto使用32位整数作为总权重,所以你要小心溢出。
此外,词典不能包含重复的词。 如果词典中已经包含该词,你必须编辑现有的权重。
-
替换模型文件的权重数据
% cargo run --release -p manipulate_model -- --model-in 路径/到/bccwj-suw+unidic_pos+pron.model.zst --replace-dict 路径/到/dictionary.csv --model-out 路径/到/bccwj-suw+unidic_pos+pron-new.model.zst
现在外国人参政権
被正确分词了。
% echo '外国人参政権と政権交代' | cargo run --release -p predict -- --scores --model 路径/到/bccwj-suw+unidic_pos+pron-new.model.zst
外国 人 参政 権 と 政権 交代
0:外国 -10784
1:国人 17935
2:人参 5308
3:参政 -6167
4:政権 6701
5:権と 14635
6:と政 17653
7:政権 -12705
8:権交 11611
9:交代 -5794
标签预测
Vaporetto 实验性地支持标注(例如,词性和发音标签)。
要训练标签,在数据集中的每个标记后添加斜线和标签,如下所示:
-
对于完全标注的语料库
この/连体词/コノ 人/名词/ヒト は/助词/ワ 火星/名词/カセイ 人/接尾词/ジン です/助动词/デス
-
对于部分标注的语料库
ヴ-ェ-ネ-ツ-ィ-ア/名词|は/助词|イ-タ-リ-ア/名词|に/助词|あ-り ま-す
你也可以像在语料库中一样在词典中指定标签信息。 当预测器无法使用模型预测标签时,将为标记添加词典中指定的标签。
如果数据集包含标签,train
命令会自动训练它们。
在预测时,默认不预测标签,所以如果需要,你必须为predict
命令指定--predict-tags
参数。
如果指定 --tag-scores
参数,将显示标签预测过程中计算的每个候选项的得分。
如果只有一个候选项,得分将为0。
% echo "花が咲く" | cargo run --release -p predict -- --model path/to/bccwj-suw+unidic_pos+pron.model.zst --predict-tags --tag-scores
花/名詞-普通名詞-一般/ハナ が/助詞-格助詞/ガ 咲く/動詞-一般/サク
花 名詞-普通名詞-一般:18613,接尾辞-名詞的-一般:-18613 ハナ:19973,バナ:-20377,カ:-20480,ゲ:-20410
が 助詞-接続助詞:-20408,助詞-格助詞:23543,接続詞:-25332 ガ:0
咲く 動詞-一般:0 サク:0
各种分词器的速度比较
Vaporetto 的速度是 KyTea 的 8.7 倍。
详细信息可以在这里找到。
Slack
我们有一个 Slack 工作区供开发者和用户提问并讨论各种话题。
- https://daac-tools.slack.com/
- 请从这里获取邀请。
许可证
选择以下任一许可证:
- Apache License, Version 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
贡献
请参阅贡献指南。
参考文献
整个分词器系统的技术细节:
-
Koichi Akabe, Shunsuke Kanda, Yusuke Oda, Shinsuke Mori. Vaporetto: Efficient Japanese Tokenization Based on Improved Pointwise Linear Classification. arXiv. 2024.
-
赤部 晃一, 神田 峻介, 小田 悠介, 森 信介. Vaporetto: 点预测法に基づく高速な日本語トークナイザ. 言語処理学会第28回年次大会 (NLP2022). 浜松. 2022年3月. (日语)
-
博客文章 (日语)
分词器系统底层的模式匹配算法 DAACs 的技术细节:
- Shunsuke Kanda, Koichi Akabe, and Yusuke Oda. Engineering faster double-array Aho-Corasick automata. Software: Practice and Experience (SPE), 53(6): 1332–1361, 2023 (arXiv)