19
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

BudouX を Go と Rust で使えるようにした

Posted at

少し前に 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 の処理は外部 (フレームワーク) に任せた方がよいと思った

また、同梱している本家由来のモデルは日本語で学習されているため英語をうまく処理できないようです。(元の用途的に空白で区切られている英語をさらに分割する必要がないからかもしれません)
用途によってはカスタムモデルを用意するか後処理を追加したほうがいいかもしれません。

  1. https://cloud.google.com/appengine/docs/standard/go/go-differences

19
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?