Go/Migemo の紹介

Migemo を Go で再実装したので紹介いたします。

Migemo とは

Migemo とはローマ字を入力して漢字を検索するためのライブラリです。詳しく言うとローマ字をひらがなへ変換し、そのひらがなを基に漢字として変換可能な候補を列挙し、それら複数の候補を合成して正規表現パターンを生成する、それが Migemo の主機能です。Migemo が生成した正規表現パターンを用いて検索すれば「ローマ字を入力すれば漢字を含む日本語を検索できる」ようになるのです。

1つ具体的な例を示しましょう。ローマ字「kikai」を考えましょう。これはひらがなで示すと「きかい」です。漢字に変換すると「奇怪」「機械」「機会」…まだまだありますが、ひとまず複数候補があるということはわかります。ここまであげた5個の単語に一度にマッチする正規表現は以下のようになります。

(kikai|きかい|奇怪|機械|機会)

でもちょっとまってください。実はもう少しまとめることができますね。まとめた結果が以下になります。

(kikai|きかい|奇怪|機[械会])

ここで示したローマ字から正規表現パターンへの変換を行なってくれるのが Migemo なのです。

そして Go/Migemo へ

今回、その Migemo を Go言語 (以下 golang) で再実装しました。それがこの記事で紹介する Go/Migemo です。早速試してみましょう。前提として golang の環境は整っているものとして、まずは以下のように Go/Migemo に含まれる gmigemo コマンドを入手してください。

go get github.com/koron/gomigemo/cmd/gmigemo

gmigemo コマンドは手軽に Migemo 機能、パターン生成を試せるコマンドです。実行すると「QUERY:」というプロンプトを表示して入力待ちになります。

$ gmigemo
QUERY:

ここに先ほどの例で示した「kikai」を入力して Enter を押すとこうなります。

QUERY: kikai
PATTERN: (?:kikai|きかい|キカイ|喜界|器械|奇怪|棋界|機[会械]|毀壊|気塊|貴会|キカイ)

先に示したパターンよりも漢字の単語数は多いですが、おおよそ同じことをしているのが見て取れるでしょう。

gmigemo コマンドは Ctrl-C で終了してください。

Go/Migemo in your program

Go/Migemo はあなたが書く golang のプログラムからも簡単に利用できます。次の例は「kikai」に対する正規表現オブジェクト *regexp.Regexp を得るサンプルプログラムです。以下の内容を test-kikai.go として保存してください。

package main

import (
    "fmt"
    "github.com/koron/gomigemo/migemo"
)

func main() {
    // 辞書の読み込み
    dict, err := migemo.LoadDefault()
    if err != nil {
        panic(err)
    }
    // 正規表現オブジェクトの取得(=コンパイル)
    rx, err := migemo.Compile(dict, "kikai")
    if err != nil {
        panic(err)
    }
    // 正規表現パターンを出力する
    fmt.Println(rx.String())
}

この test-kikai.go を実行すると以下のようになります。

$ go run test-kikai.go
(?:k\s*i\s*k\s*a\s*i|き\s*か\s*い|キ\s*カ\s*イ|喜\s*界|器\s*械|奇\s*怪|棋\s*界|機\s*[会械]|毀\s*壊|気\s*塊|貴\s*会|キ\s*カ\s*イ)

もしもこの段階でエラーになるようなら以下のコマンドで Go/Migemo を取得しなおしてから、再度 go run test-kikai.go を実行してください。

go get github.com/koron/gomigemo

今回の出力には先ほどまでにはなかった \s* というパターンが、各文字の間に挿入されています。これは改行や空白文字を無視して日本語を検索するためのもので、Migemoの機能の1つです。また先程の gmigemo では見やすさのために敢えて無効化してありました。

このサンプルプログラムから Go/Migemo がとても簡単に自分のプログラムに組み込めることがわかるでしょう。

実践的 Go/Migemo

そしてすでに組み込んだ例が幾つかあります。

まずは peco です。 CustomMatcher の Migemo の例を参照してください。たったこれだけの設定で、今をときめく peco 上でローマ字により日本語絞込検索ができるようになります。とっても便利ですので是非一度体験してみてください。

次に jvgrep です。私の fork を試してみてください。面白いように日本語が検索できてしまうことでしょう。加えて Go/Migemo を使うための修正のサンプルとしても注目に値します。たったこれだけの修正で既存のプログラムから Go/Migemo が使えてしまうのです。

まとめ & 次回予告

さて Go/Migemo の使い方の紹介だけで随分と長くなってしまいました。本当は Go/Migemo の中身についても解説したかったのですが、本記事はここまでにし次回で解説することにしましょう。是非、みなさんも Go/Migemo とそれを使ったツールを試してみてください。その手軽さ & 便利さに触れてもらえたら嬉しいです。