日本語を語に切るには辞書が要ります。KuromojiはJavaScriptだけで動き、辞書も同梱されています。
実際に入れて測りました。品詞で絞ると索引は51.6%になります。一方で、業務で使う語10個のうち7個が2つ以上に割れました。
実際に入れて動かしました。品詞という情報が取れるので、索引に入れる語を選べます。
Kuromojiを実際に入れて動かし、品詞で索引を絞るとどれだけ小さくなるかを測りました。使ったのは社内規程を模した文書12件です。
導入は1コマンドで終わりました。READMEもわずか5行のコードで文を語に切れるとしています。実際、辞書の場所を渡すだけで動きます。
const KEEP = ['名詞', '動詞', '形容詞']; const rows = [ ['絞らない', (s) => tokenizer.tokenize(s).map((x) => x.surface_form)], ['名詞・動詞・形容詞だけ', (s) => tokenizer.tokenize(s).filter((x) => KEEP.includes(x.pos)).map((x) => x.surface_form)], ['名詞だけ', (s) => tokenizer.tokenize(s).filter((x) => x.pos === '名詞').map((x) => x.surface_form)], ['名詞だけ・基本形にそろえる', (s) => tokenizer.tokenize(s).filter((x) => x.pos === '名詞').map((x) => x.basic_form)], ];
入れるもの 語の総数 語の種類 絞らない場合との比 絞らない 246個 110種 100.0% 名詞・動詞・形容詞だけ 152個 91種 61.8% 名詞だけ 127個 80種 51.6% 名詞だけ・基本形にそろえる 127個 68種 51.6% 落とした語の例(助詞・助動詞・記号) の(助詞) は(助詞) と(助詞) 。(記号) 超(接頭詞) は(助詞) と(助詞) 。(記号)
上の表を見てください。名詞だけに絞ると、索引に入る語は246個から127個になりました。半分ちょうどくらいです。
落ちているのは助詞と記号です。「の」「は」「と」「。」といった語は、どの文書にも出てくるので検索の役に立ちません。
こうした語を落とせるのは、品詞という情報が付いてくるからです。区切るだけの仕組みでは選べません。
最後の行は基本形にそろえた場合です。総数は同じ127個ですが、語の種類が80種から68種に減りました。
活用の違いが1つにまとまるので、書き方が違っても同じ語として当たります。索引の種類が減るぶん、探すのも速くなります。
品詞で絞ると半分。基本形にそろえると種類が減る。
JavaScriptだけで動く日本語の形態素解析器です。追加の実行環境も、外部のサービスも要りません。
Kuromojiは、日本語を語に切って、品詞や読みを付ける仕組みです。READMEも、日本語形態素解析器のJavaScript実装であり、Kuromojiの純粋なJavaScript移植であるとしています。
日本語の解析器は、実行環境の用意が要ることが多いです。KuromojiはJavaScriptだけで完結します。
READMEも、必要なのは組み立てたファイルと辞書のファイルだけだとしています。前の節の計測でも、入れてすぐ動きました。
宿泊 品詞=名詞 基本形=宿泊 読み=シュクハク 費 品詞=名詞 基本形=費 読み=ヒ の 品詞=助詞 基本形=の 読み=ノ 上限 品詞=名詞 基本形=上限 読み=ジョウゲン は 品詞=助詞 基本形=は 読み=ハ 1 品詞=名詞 基本形=* 読み=-
語といっしょに品詞・基本形・読みが付いてきます。前の節で索引を絞れたのは、この品詞があるからです。
読みが取れるのも実務では効きます。ふりがなでの検索や、読みが同じ語の対応に使えます。
使う前に辞書を読み込みます。前の節と同じ環境で測ったところ、176.4ミリ秒でした。
処理のたびに読むわけではありません。起動時に一度読んで、あとは使い回します。短命な処理で毎回起動する構成では、この時間が積み上がります。
この記事の計測は、Kuromojiに同梱されている辞書をそのまま使っています。辞書を差し替えると結果は変わります。また、本体の依存には入れていません。辞書だけで17MBあるためです。区切り方そのものの話は日本語トークナイザの記事で扱っています。
JavaScript implementation of Japanese morphological analyzer. This is a pure JavaScript porting of Kuromoji.原文kuromoji.js README この内容の有効期限2027-02-18
辞書に載っていない語は割れます。一般語に見えるものでも割れるので、目で見て確かめる必要があります。
Kuromojiで自社の用語がどう扱われるかを、実際に走らせて確かめました。業務で使いそうな語を10個並べています。
語 分割 1語か 未知語を含むか ServiceDock ServiceDock はい はい サービスドック サービス|ドック いいえ いいえ 出張旅費精算書 出張|旅費|精算|書 いいえ いいえ 越境物販 越境|物販 いいえ いいえ 営業一課 営業|一|課 いいえ いいえ 宿泊費 宿泊|費 いいえ いいえ 所属長 所属|長 いいえ いいえ テレワーク手当 テレワーク|手当 いいえ はい サブスクリプション サブスクリプション はい はい 稟議 稟議 はい いいえ 10語のうち 7語が2つ以上に割れた。
上の表を見てください。10語のうち7語が2つ以上に割れました。
驚いたのは「宿泊費」が「宿泊」と「費」に割れたことです。社内用語でも造語でもありません。
同じく「所属長」も「所属」と「長」になります。辞書に1語として載っているかどうかがすべてで、語としての自然さは関係ありません。
「宿泊費」で検索したとき、索引には「宿泊」と「費」が入っています。「宿泊」を含む別の条文にも当たります。
逆の得もあります。「宿泊の費用」と書かれた文書にも当たるからです。広く当たるようになる代わりに、絞り込みが効かなくなります。
3番目が大事です。割れていても困らない語のほうが多いので、実際に検索で使われる語だけを選んでください。
辞書に載っているかどうかがすべて。
You only need the build/kuromoji.js and dict/*.dat.gz files原文kuromoji.js README この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る