[Rust] LinderaをWasmで動かしてみる

April 24, 2022

Rustを勉強し始めたのだけど、作るものが決まっていない。 ひとまず形態素解析を動かしてみる。

いくつかライブラリがあるみたいだが、以下の記事を見るとLinderaならWasmで問題なく動きそうな気配だったので、Linderaにする。

Rust×WASMに入門する(Linderaでブラウザから形態素解析)

※ 以下の手順はwasm-packのドキュメントで言うManual Setupで非推奨な手順。wasm-pack new ( cargo generate ) を使うのを推奨
 https://rustwasm.github.io/docs/wasm-pack/tutorials/npm-browser-packages/getting-started/manual-setup.html

1
2
$ cargo new hello_lindera_wasm --lib
$ cd hello_lindera_wasm

Cargo.toml

1
2
3
4
5
6
[lib]
crate-type = ["cdylib", "rlib"]

[dependencies]
lindera = { version = "0.13", features = ["ipadic"] }
wasm-bindgen = { version = "0.2", features = ["serde-serialize"] }

src/lib.rs

1
2
3
4
5
6
#[wasm_bindgen]
pub fn tokenize(text: &str) -> JsValue {
    let tokenizer = Tokenizer::new().unwrap();
    let tokens = tokenizer.tokenize(text).unwrap();
    JsValue::from_serde(&tokens).unwrap()
}

wasm-packでビルドする。

1
$ wasm-pack build --target web

これでJSから呼べる。

1
2
3
4
import init, { tokenize } from '/pkg/hello_lindera_wasm.js';
init().then(() => {
  console.log(tokenize('すもももももももものうち'));
});

HTML/JSを少し整えるなどして無事動いた。

サイズ

hello_lindera_wasm_bg.wasm が 70MBなのだけど、ChromeのDevToolsだと12.2MBになる謎。

1
2
3
4
5
6
7
$ ls -lh pkg
total 164408
-rw-r--r--  1 tnantoka  staff   818B Apr 24 16:04 hello_lindera_wasm.d.ts
-rw-r--r--  1 tnantoka  staff   4.4K Apr 24 16:04 hello_lindera_wasm.js
-rw-r--r--  1 tnantoka  staff    70M Apr 24 16:04 hello_lindera_wasm_bg.wasm
-rw-r--r--  1 tnantoka  staff   270B Apr 24 16:04 hello_lindera_wasm_bg.wasm.d.ts
-rw-r--r--  1 tnantoka  staff   266B Apr 24 16:04 package.json

Safariだと70MBまでカウントアップされて、ダウンロードが終わると同じく12.2MB表示になった。

12.2MBだったら許容範囲なんだけどなぁ。

コード

https://github.com/tnantoka/my_rust_sandbox/tree/main/hello_lindera_wasm