Skip to content

Latest commit

 

History

History
111 lines (79 loc) · 3.99 KB

File metadata and controls

111 lines (79 loc) · 3.99 KB

Suzume

CI npm codecov License C++17

WebAssemblyでブラウザ上で動作する軽量な日本語トークナイザー。大規模辞書の代わりに特徴量ベースの解析を行います。

ドキュメント | デモ

概要

Suzumeは、MeCabやKuromojiなどの従来の形態素解析器が使う大規模辞書(20〜50MB超)の代わりに、文字パターン・接続規則・小規模辞書(約400KB)で日本語テキストをトークン化します。WASMビルドはgzip圧縮で400KB未満です。

従来の形態素解析器 Suzume
バンドルサイズ 20〜50MB超(辞書) 400KB未満(gzip)
ブラウザ対応 限定的または非対応 対応(WASM)
サーバー必須 通常は必要 不要
品詞タグ あり あり
原形復元 あり あり

トレードオフ

  • 軽量 — 大規模辞書のダウンロードが不要。フロントエンド、エッジ、サーバーレス環境に適する
  • 未知語に対応 — 特徴量ベースのため、辞書にない単語でも解析が破綻しにくい
  • 精度の限界 — 専門用語や複雑な言語解析では、従来の辞書ベース解析器の方が高精度

インストール

npm install @libraz/suzume

または yarn/pnpm/bun:

yarn add @libraz/suzume
pnpm add @libraz/suzume
bun add @libraz/suzume

クイックスタート

JavaScript / TypeScript

import { Suzume } from '@libraz/suzume'

const suzume = await Suzume.create()

const tokens = suzume.analyze('すもももももももものうち')
for (const t of tokens) {
  console.log(`${t.surface} [${t.posJa}]`)
}

// タグ抽出({ tag, pos } オブジェクトの配列を返す)
const tags = suzume.generateTags('東京スカイツリーに行きました')
// → [{ tag: '東京', pos: 'noun' }, { tag: 'スカイツリー', pos: 'noun' }, { tag: '行く', pos: 'verb' }]

// 名詞のみ
suzume.generateTags('美味しいラーメンを食べた', { pos: ['noun'] })
// → [{ tag: 'ラーメン', pos: 'noun' }]

// 基本語除外(する、ある、いい などひらがなのみの原形を除外)
suzume.generateTags('今日はいい天気ですね', { excludeBasic: true })
// → [{ tag: '今日', pos: 'noun' }, { tag: '天気', pos: 'noun' }]

ブラウザ(CDN)

<script type="module">
  import { Suzume } from 'https://esm.sh/@libraz/suzume'

  const suzume = await Suzume.create()
  console.log(suzume.analyze('こんにちは'))
</script>

C++

#include "suzume.h"

suzume::Suzume tokenizer;
auto tokens = tokenizer.analyze("東京に行きました");

for (const auto& t : tokens) {
    std::cout << t.surface << "\t" << t.lemma << std::endl;
}

ソースからビルド(C++17、CMake 3.15+が必要):

make          # ビルド
make test     # テスト実行

ドキュメント

ライセンス

Apache License 2.0