Elasticsearch の Kuromoji でユーザー辞書を使うメモ

Elasticsearchでの形態素解析はKuromoji一択だけど、やや辞書が貧弱な部分もあるのでユーザー辞書で補う必要がある。

例えば東京に「西国分寺駅」という駅があるけど、「西国分寺」で形態素解析すると「西」「国分寺」で分かれる。
読みも「サイコクブンジ」となってしまう。(正しくは「ニシコクブンジ」)
これはいただけない。

参考になったサイト

環境

  • CentOS 6.4
  • Elasticsearch 1.1.1
    • kuromoji 2.0.0



辞書ファイルの作成

まず辞書ファイルを作成。
普通のテキストファイルで、文字コードは UTF-8。拡張子は自由。
ここでは例として「my_jisho.dic」とした。

辞書ファイルの置き場所

ファイルの保存先は
/etc/elasticsearch/my_jisho.dic
でいけた。
これはもしかしたら Elasticsearch 1.1.1 だからかも。

他のサイト等を見ると「(Elasticsearchホーム)/cofig/my_jisho.dic」と書いているところも多かったので、はじめそこに置いてみたんだけどインデックス作成時に「/etc/elasticsearch/ に置け」とエラーが出た。

辞書ファイルの書き方

ファイルの中身はCSV形式で、以下の並びで書く。

単語,形態素解析後の単語,読み,品詞

「形態素解析後の単語」は、半角スペースで分けると分かち書きされる。

「東京スカイツリー」の例

東京スカイツリー,東京 スカイツリー,トウキョウ スカイツリー,カスタム名詞

「西国分寺」の例

西国分寺,西国分寺,ニシコクブンジ,駅名



インデックスへの設定

サンプル用のインデックス作成

$ curl -XPUT 'http://localhost:9200/example/' -d '(下のjson)'
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "kuromoji": {
          "type": "kuromoji_tokenizer",
          "user_dictionary": "my_jisho.dic" <ここに辞書ファイル
        }
      },
      "analyzer": {
        "kuromoji_analyzer": {
          "tokenizer": "kuromoji",
          "type": "custom",
          "filter": [
            "kuromoji_baseform",
            "pos_filter",
            "greek_lowercase_filter",
            "cjk_width"
          ]
        },
        "yomigana_analyzer": {
          "tokenizer": "kuromoji",
          "type": "custom",
          "filter": [
            "katakana_readingform",
            "cjk_width"
          ]
        }
      }
    }
  }
}

解析してみる

$ curl -XGET 'http://localhost:9200/example/_analyze?analyzer=kuromoji_analyzer' -d '西国分寺'
{
   "tokens": [
      {
         "token": "西国分寺",
         "start_offset": 2,
         "end_offset": 6,
         "type": "word",
         "position": 1
      }
   ]
}

加えて読み仮名の確認

$ curl -XGET 'http://localhost:9200/example/_analyze?analyzer=yomigana_analyzer' -d '西国分寺'
{
   "tokens": [
      {
         "token": "ニシコクブンジ",
         "start_offset": 2,
         "end_offset": 6,
         "type": "word",
         "position": 1
      }
   ]
}

できた。

駅名とかはどっかでデータがほしいけど、読み仮名までサポートしてるデータは無料では配布されてない。
あと有用そうなのとしては病名とかかなあ。