13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

辞書構造を工夫したMigemo実装の紹介

Last updated at Posted at 2022-06-08

Migemoとは、ローマ字のまま日本語をインクリメンタル検索するためのツールです。
Migemoにより、かな漢字変換をすることなく、漢字を含んだ日本語の検索を快適に行うことができます。

高林哲氏により、2000年に初版が公開されて以降、様々な発展を遂げました。
現在広く利用されているMigemo実装は、KoRoN氏によって公開されたC/Migemoでしょう。

拙作ながらも、私ogunaもMigemo実装を公開しています。
このサイトでは、Migemoの機能を説明し、次世代へと繋がるMigemo実装の紹介をしていきます。

Migemoとは

日本語の文章や単語は、IMEによりローマ字を漢字に変換しながら入力します。
Migemoでは、このIMEによる変換をすることなく、単語の検索をすることができます。

例として、「吾輩は猫である」中の「獰悪」の文字を検索するとします。
Migemoがない場合、検索窓にカーソルを移動させ、IMEをオンにし、「douaku」とローマ字入力した後に、変換候補の中から「獰悪」を選択します。
一方、Migemoでは、検索窓にカーソルを移動させたのち、「doua」と入力するだけで「獰悪」にカーソルが移ります(下図で獰悪がピンクにハイライト)。
このようにキーボードの操作が大幅に削減されるため、快適に検索を行うことができるのです。

117541047-005d0a80-b04d-11eb-818c-4236e158e6cf.png

上記を含むMigemoの簡単なデモは、以下のサイトで試すことができます。

省メモリなMigemo

Migemoは内部に「かな→漢字」変換用の辞書を格納しています。
この辞書はメモリを大きく占めます。

そこで私は、データ構造を工夫することにより、メモリ使用量を大きく削減しました。
具体的には、C/Migemoでは26.1MBであったメモリ使用量を、Rust実装のMigemoでは7.7MBにまで削減しています。
その分クエリに要する時間は増えましたが、十分実用的な速度を維持しています。

この削減は、C/Migemoでは2重連鎖木でデータを格納していたのに対し、
省メモリなMigemoではLoudsトライで格納したことによります。

主要な言語による実装

Migemoが多くのソフトウェアやツールでの導入が容易になるよう、様々な言語でMigemoを実装しました。
全て省メモリの辞書に対応しています。

CやC++では、Rustで出力する外部ライブラリを利用することができます。

これら複数の言語で実装したMigemoの性能を比較したベンチマークを公開しています。

C/Migemo gomigemo rustmigemo jsmigemo jmigemo rustmigemo-wasm pymigmeo csmigemo
言語 C Go Rust TypeScript Java Rust→WASM Python C#
ランタイム Native Native Native Node.js JVM Node.js CPython .NET Core
実行ファイルサイズ (KB) 72 1974 358 N/A N/A N/A N/A N/A
辞書ファイルサイズ (MB) 4.78 2.03 2.03 2.03 2.03 2.03 2.03 2.03
メモリ使用量 (BM) 26.1 12.1 7.7 14.8 15.5 14.4 6.5 6.4
起動時間 (ms) 198 78 65 165 234 150 462 147
クエリ時間 (ms) 5053 5860 14939 24753 15892 14618 119909 17493

最新の用語を追加したMigemo辞書

言語は生きており、日々様々な単語が生まれています。
快適な検索を実現するには、最新の用語の検索も可能でなければなりません。

SKK辞書からMigemo辞書を生成するのは、手間のかかる作業です。
そこで、生成したMigemo辞書を下記で配布しています。

商用利用可能なMigemo辞書

C/Migemoに同梱されている辞書ファイルは、SKKから生成されているため、GPLライセンスと考えられます。
もしあるプログラムをこの辞書ファイルを同梱して配布する場合、そのプログラムもGPLしなければならないかもしれません。
そのような考えから、Migemoを利用するプログラムの多くはユーザによる辞書のダウンロードを強いていました。
結果、Migemoを導入するユーザの手間が大きくなっていました。

より簡単にMigemoを利用できるようにするには、緩いライセンスの辞書ファイルが必要です。
そこで、BSDライセンスのプロジェクトから生成したMigemoの辞書を作成しました。

13
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?