記事一覧へ戻る
ライブラリ解説

kuromoji.js が日本語ツール群を支えている仕組み

NoSend Tools の漢字→ひらがな変換・ローマ字変換・分かち書き・ふりがな HTML・助数詞変換などの日本語ツールは、すべて kuromoji.js による形態素解析をブラウザ内で完結させています。12 MB の IPADIC 辞書が何を持っているのか、そしてクラウド API の代わりにブラウザで日本語 NLP を動かすことが何を意味するのかを整理します。

なぜ日本語処理に形態素解析が要るのか

英語やフランス語はスペース区切りで単語境界が明確なので、Unicode 標準 UAX #29 が定義するデフォルトのワードセグメンテーションアルゴリズムだけでも「単語を切り出す」操作はある程度成立します。しかし日本語にはスペースがなく、「日本語処理」を「にほんごしょり」「ニホンゴショリ」に変換するにも、まず「日本語 / 処理」と分割しなければなりません。漢字かな混じり文では一文字単位の切り出しでは意味を失い、辞書と文脈なしには正しい読みさえ確定できません。

形態素解析 (Morphological analysis) は、文を意味の最小単位 (形態素) に分割し、各形態素に品詞・読み・基本形などの情報を付与する処理です。ひらがな変換・ローマ字変換・ふりがな生成・助数詞のカウント、いずれも「どこで区切るか」「この漢字をどう読むか」の情報がなければ正確に動きません。NoSend Tools の日本語系ツール (kanji-to-hiragana / kanji-to-romaji / wakati-tokenize / furigana-html / japanese-counter-word) が形態素解析を必要とするのはこのためです。

kuromoji.js と IPADIC 辞書の中身

kuromoji.js は takuyaa 氏が開発した JavaScript 向け形態素解析ライブラリで、Java 実装の Kuromoji (Atilika 社) をブラウザ/Node.js で動く形に移植したものです。コアのアルゴリズムにはラティス (格子) 構造を用いたビタービ (Viterbi) アルゴリズムを採用しています。入力文字列に対して可能な分割パターンをすべてラティスに展開し、各遷移コストが最小になるパスを動的計画法で求めます。これにより「東京都に住む」を「東京 / 都 / に / 住む」ではなく「東京都 / に / 住む」と適切に切り出せます。

辞書は IPADIC (IPA 辞書) を圧縮したバイナリで、ブラウザにロードされる合計サイズは約 12 MB です。IPADIC には 30 万語以上のエントリが収録されており、各エントリに表層形・読み・発音・品詞・品詞細分類・活用型・活用形・基本形が格納されています。比較対象として言及されることの多い UniDic は国語研究所が整備する現代語辞書で、語彙・粒度・ライセンスが異なりますが、ブラウザ向けの kuromoji.js が標準で採用しているのは IPADIC です。kanji-to-romaji ツールがさらに kuroshiro ライブラリを重ねているのも、kuroshiro 自体が kuromoji.js を形態素解析バックエンドとして採用し、読みフィールドをヘボン式・訓令式などのローマ字表記に変換する層を追加しているためです。

12 MB の辞書ロードと「あなたのデータ」の分離

ツールを最初に開いたとき、kuromoji.js の辞書 (約 12 MB) がブラウザにダウンロードされます。このロードは 1 回限りで、ブラウザキャッシュに入ったあとは再取得されません。重要な区別は、この 12 MB に「あなたが入力したテキスト」は 1 バイトも含まれていないという点です。辞書はサイトの静的アセットとして CDN から配信されるだけで、あなたが打ち込んだ「機密事項が含まれる文書」や「未発表の日本語原稿」はサーバーに向かう経路がコードに存在しません。

クラウド API (Google Natural Language API や Yahoo! テキスト解析 API など) を使う場合、日本語テキストはそのまま外部サーバーに送信されます。形態素解析の精度ではクラウド API の方が優れる側面もありますが、テキストを送信した時点で利用規約上のデータ利用範囲・保存期間・学習利用の可否がサービス提供者の裁量に委ねられます。ブラウザ内で kuromoji.js を動かす設計を選んでいるのは、「テキストが端末の外に出ない」状態を構造として保証するためです。

送信ゼロを自分で確認する方法

DevTools の Network タブを記録状態にしたまま、kanji-to-hiragana や wakati-tokenize でテキストを変換してみてください。確認できるリクエストは、ページ初回ロード時の HTML / JS / CSS と kuromoji の辞書バイナリのみです。変換実行のタイミングで外向きの POST や XHR は発生しません。辞書ロード後の形態素解析はすべて同期的な JavaScript 処理として完結します。

これは「送らないと書いてある」以上の確認手段です。ブラウザは送信先 URL とリクエストボディを Network パネルに表示してくれるので、専用ツールなしに誰でも実施できます。実装を読みたい場合は otomomik/nosend-tools リポジトリが GitHub に公開されており、各ツールの形態素解析呼び出し部分を直接確認できます。