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
}
]
}
できた。