少し前に BudouX というライブラリが公開されました。
日本語の文章を与えると適切な改行位置を推測してくれるライブラリで、 Python と JavaScript に対応しています。
これを Go で使いたい!
と、思って移植しました。
ついでに Rust にも移植しました。
この記事では移植したライブラリについて軽く紹介したいと思います。
(使い方とかは README を読んだほうが早いかもしれません)
本家 BudouX の中身
オリジナルの BudouX は次の要素で構成されています。
- 機械学習モデルを訓練するための Python スクリプト
- JSON 形式の学習済み機械学習モデル (約 10 KB)
- 機械学習モデルを使用した予測処理の Python 実装
- 機械学習モデルを使用した予測処理の TypeScript 実装 (Web component を含む)
BudouX の機械学習モデルは次の情報を feature として使用しています。
- 過去の予測結果
- 対象付近にある文字
- 対象付近にある文字の UNICODE ブロック
- 他の feature の組み合わせ
JSON 形式の学習済み機械学習モデルには feature をキー、スコアを値にした連想配列が格納されており、予測処理では入力を feature に変換してスコアの合計を算出、閾値を超えたところを区切りとみなしています。
予測処理は外部ライブラリに依存していません。
つまり BudouX と同じように feature に変換してスコアの合計を算出できれば他言語でも動くことになります。
Go への移植 (BudouX-Go)
本家由来の機械学習モデルを同梱しており次のようなコードですぐに利用可能です。
(本家は HTML の入出力をサポートしていますが BudouX-Go はプレーンテキストのみをサポートしています)
model := models.DefaultJapaneseModel()
words := budoux.Parse(model, "これはテストです。")
fmt.Printf("%q", words)
// Output:
// ["これは" "テストです。"]
Go への移植版である BudouX-Go は本家 BudouX から次の JSON ファイルを取得して UNICODE のブロック情報と学習済みモデルの Go コードを生成しています。
取得とコード生成処理は gen/generate.go
に実装されています。
(エラー処理の問題があり Go 1.13 未満では動かないようにしています)
本体は Go 1.11 の標準パッケージのみで動くようになっており GAE/Go 1.11 に魂を縛られている同志 1 も安心してご利用いただけます。
デモページは go-app を使用した wasm で動いています。
(go-app は Go 1.17 以降が必要なため go.mod
を用意して別モジュールに分離しています)
Rust への移植 (BudouX-rs)
本家由来の機械学習モデルを同梱しており次のようなコードですぐに利用可能です。
(本家は HTML の入出力をサポートしていますが BudouX-rs はプレーンテキストのみをサポートしています)
let model = budoux::models::default_japanese_model();
let words = budoux::parse(model, "これはテストです。");
assert_eq!(words, vec!["これは", "テストです。"])
Rust への移植である BudouX-rs は BudouX-Go をベースに開発しました。
実は Rust を書くのが初めてなので変なところがあるかもしれません。
BudouX-Go と同様に本家 BudouX から JSON ファイルを取得して UNICODE のブロック情報と学習済みモデルの Rust コードを生成しています。
取得とコード生成処理は Go (gen/generate.go
) で実装されており、生成されたコードは rustfmt
で整形しています。
本体はできる限り依存をなくしたかったのですが機械学習モデルをスタティックな領域に保持するため once_cell を使用しています。
デモページは Yew を使用した wasm で動いています。
(Cargo.toml
のワークスペース機能で別クレートに分離しています)
他言語への移植
Swift に移植した方がいるようです。
その他
本家は HTML の入出力をサポートしていますが移植版は次の理由でプレーンテキストしかサポートしていません。
- 依存関係を最小にしたかった
- HTML の処理は外部 (フレームワーク) に任せた方がよいと思った
また、同梱している本家由来のモデルは日本語で学習されているため英語をうまく処理できないようです。(元の用途的に空白で区切られている英語をさらに分割する必要がないからかもしれません)
用途によってはカスタムモデルを用意するか後処理を追加したほうがいいかもしれません。