garu-ko 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -65,7 +65,32 @@ export class Garu {
65
65
  }
66
66
  // Construct the WASM analyzer
67
67
  const wasmInstance = new wasmModule.GaruWasm(modelBytes);
68
- return new Garu(wasmInstance, modelBytes.byteLength);
68
+ // Load CNN reranker
69
+ let cnnBytes = null;
70
+ try {
71
+ if (isNode) {
72
+ const { readFile } = await import('fs/promises');
73
+ const { fileURLToPath } = await import('url');
74
+ const { join, dirname } = await import('path');
75
+ const dir = dirname(fileURLToPath(import.meta.url));
76
+ const buf = await readFile(join(dir, '..', 'models', 'cnn2.bin'));
77
+ cnnBytes = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
78
+ }
79
+ else {
80
+ const cnnUrl = new URL('../models/cnn2.bin', import.meta.url).href;
81
+ const cnnResp = await fetch(cnnUrl);
82
+ if (cnnResp.ok) {
83
+ cnnBytes = new Uint8Array(await cnnResp.arrayBuffer());
84
+ }
85
+ }
86
+ }
87
+ catch {
88
+ // CNN loading is best-effort
89
+ }
90
+ if (cnnBytes) {
91
+ wasmInstance.load_cnn(cnnBytes);
92
+ }
93
+ return new Garu(wasmInstance, modelBytes.byteLength + (cnnBytes?.byteLength ?? 0));
69
94
  }
70
95
  /**
71
96
  * Analyze Korean text, returning morphological tokens with scores.
@@ -133,7 +158,7 @@ export class Garu {
133
158
  return {
134
159
  version: this._wasm.constructor.version(),
135
160
  size: this._modelSize,
136
- accuracy: 0.908,
161
+ accuracy: 0.910,
137
162
  };
138
163
  }
139
164
  /**
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "garu-ko",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Ultra-lightweight Korean morphological analyzer for the web (1.2MB model, WASM 119KB, F1 93.5%)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -6,6 +6,10 @@ export class GaruWasm {
6
6
  [Symbol.dispose](): void;
7
7
  analyze(text: string): any;
8
8
  analyze_topn(text: string, n: number): any;
9
+ /**
10
+ * Load CNN reranker model.
11
+ */
12
+ load_cnn(cnn_data: Uint8Array): void;
9
13
  constructor(model_data: Uint8Array);
10
14
  tokenize(text: string): any;
11
15
  static version(): string;
@@ -18,6 +22,7 @@ export interface InitOutput {
18
22
  readonly __wbg_garuwasm_free: (a: number, b: number) => void;
19
23
  readonly garuwasm_analyze: (a: number, b: number, c: number) => [number, number, number];
20
24
  readonly garuwasm_analyze_topn: (a: number, b: number, c: number, d: number) => [number, number, number];
25
+ readonly garuwasm_load_cnn: (a: number, b: number, c: number) => [number, number];
21
26
  readonly garuwasm_new: (a: number, b: number) => [number, number, number];
22
27
  readonly garuwasm_tokenize: (a: number, b: number, c: number) => [number, number, number];
23
28
  readonly garuwasm_version: () => [number, number];
package/pkg/garu_wasm.js CHANGED
@@ -38,6 +38,18 @@ export class GaruWasm {
38
38
  }
39
39
  return takeFromExternrefTable0(ret[0]);
40
40
  }
41
+ /**
42
+ * Load CNN reranker model.
43
+ * @param {Uint8Array} cnn_data
44
+ */
45
+ load_cnn(cnn_data) {
46
+ const ptr0 = passArray8ToWasm0(cnn_data, wasm.__wbindgen_malloc);
47
+ const len0 = WASM_VECTOR_LEN;
48
+ const ret = wasm.garuwasm_load_cnn(this.__wbg_ptr, ptr0, len0);
49
+ if (ret[1]) {
50
+ throw takeFromExternrefTable0(ret[0]);
51
+ }
52
+ }
41
53
  /**
42
54
  * @param {Uint8Array} model_data
43
55
  */
@@ -82,7 +94,7 @@ export class GaruWasm {
82
94
  }
83
95
  }
84
96
  if (Symbol.dispose) GaruWasm.prototype[Symbol.dispose] = GaruWasm.prototype.free;
85
- import * as import1 from "./snippets/garu-core-2da6ed4f058f2483/inline0.js"
97
+ import * as import1 from "./snippets/garu-core-dc89881188f44ead/inline0.js"
86
98
 
87
99
  function __wbg_get_imports() {
88
100
  const import0 = {
@@ -143,7 +155,7 @@ function __wbg_get_imports() {
143
155
  return {
144
156
  __proto__: null,
145
157
  "./garu_wasm_bg.js": import0,
146
- "./snippets/garu-core-2da6ed4f058f2483/inline0.js": import1,
158
+ "./snippets/garu-core-dc89881188f44ead/inline0.js": import1,
147
159
  };
148
160
  }
149
161
 
Binary file
@@ -4,6 +4,7 @@ export const memory: WebAssembly.Memory;
4
4
  export const __wbg_garuwasm_free: (a: number, b: number) => void;
5
5
  export const garuwasm_analyze: (a: number, b: number, c: number) => [number, number, number];
6
6
  export const garuwasm_analyze_topn: (a: number, b: number, c: number, d: number) => [number, number, number];
7
+ export const garuwasm_load_cnn: (a: number, b: number, c: number) => [number, number];
7
8
  export const garuwasm_new: (a: number, b: number) => [number, number, number];
8
9
  export const garuwasm_tokenize: (a: number, b: number, c: number) => [number, number, number];
9
10
  export const garuwasm_version: () => [number, number];
package/pkg/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "garu-wasm",
3
3
  "type": "module",
4
- "version": "0.4.0",
4
+ "version": "0.4.1",
5
5
  "files": [
6
6
  "garu_wasm_bg.wasm",
7
7
  "garu_wasm.js",
@@ -0,0 +1 @@
1
+ export function performance_now() { return performance.now(); }