Kuromoji_readingform の意図しない出力について


(I12o) #1

こんにちは。カタカナ、ひらがなの区別をしない検索をしたくて、次のようなカスタムアナライザを定義してみました。

elasticsearch/1.7.1 + analysis-kuromoi/2.7.0 の環境です。
Linux + openJDK 1.8.0_25 です。

PUT /test1/_settings?pretty
{
  "index": {
    "analysis": {
      "analyzer": {
        "test_hirakana": {
          "type": "custom",
          "filter": "kana_conv",
          "tokenizer": "kuromoji_tokenizer"
        }
      },
      "filter": {
        "kana_conv": {
          "type": "kuromoji_readingform",
          "use_romaji": false
        }
      }
    }
  }
}

アナライザを、「ひむろ きょうすけ」でテストしてみます。

GET /test1/_analyze?pretty&analyzer=test_hirakana&text=ひむろ きょうすけ
{
  "tokens" : [ {
    "token" : "ヒム",
    "start_offset" : 0,
    "end_offset" : 2,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "ロ",
    "start_offset" : 2,
    "end_offset" : 3,
    "type" : "word",
    "position" : 2
  }, {
    "token" : "キョウス",
    "start_offset" : 4,
    "end_offset" : 8,
    "type" : "word",
    "position" : 3
  }, {
    "token" : "ケ",
    "start_offset" : 8,
    "end_offset" : 9,
    "type" : "word",
    "position" : 4
  } ]
}

分割位置はともかく、すべてカタカナになりました(意図通りです)

次に「ひむろきょうすけ」を試しました。

GET /test1/_analyze?pretty&analyzer=test_hirakana&text=ひむろきょうすけ
{
  "tokens" : [ {
    "token" : "ヒ",
    "start_offset" : 0,
    "end_offset" : 1,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "むろきょうすけ",
    "start_offset" : 1,
    "end_offset" : 8,
    "type" : "word",
    "position" : 2
  } ]
}

なぜか、「むろきょうすけ」がそのままひらがなで出力されます。
カタカナに変換さえしてくれれば問題ないのですが。

いろいろと試してみたところ、「むろ」で始まる語に分割された場合、readingform フィルタが変換を行なわないらしい事がわかりました。
use_romaji オプションの真偽は、この動作に関係ないようです。

こむろ → 「コム ロ」
ここむろ → 「ココ むろ」
ひむろき → 「ヒ むろき」

GET /test1/_analyze?pretty&analyzer=test_hirakana&text=ひむろき
{
  "tokens" : [ {
    "token" : "ヒ",
    "start_offset" : 0,
    "end_offset" : 1,
    "type" : "word",
    "position" : 1
  }, {
    "token" : "むろき",
    "start_offset" : 1,
    "end_offset" : 4,
    "type" : "word",
    "position" : 2
  } ]
}

他にもこのようになるパターンがあるのか見付けてはいないのですが、これは analysis-kuromoji 側の不具合でしょうか。

icu_transform で、"id": "Hiragana-Katakana" のフィルタをかませればひらがなカタカナ変換ができるようですが、kuromoji_readingform だけでどうにかならないものでしょうか。


(Jun Ohtani) #2

johtaniです。報告ありがとうございます。

Luceneのプログラム(バージョンは5.3.0)を書いて確認してみたところ、同じように、ひらがながそのまま出力されますね。
辞書データまではまだ、見ていないのですが、Kuromojiが付与している単語の情報(品詞とか読みとか)を見たところ、
データが存在しないようです。
Kuromojiが利用している辞書をチェックしてみる必要がありそうです。

Lucene側にチケットを追加するので、追加が終わったら、こちらにURLを追記します。
Kuromojiの未知語処理に関連していそうです。


(I12o) #3

すでに確認しておられると思いますが、なんとなく品詞分類の特定パターンでの処理が抜けているのかなーと思いながらテストをしておりました。

解消される事を願っております。

読み仮名のみを持つテキストフィールドに対して検索をしようとする場合、検索語がひらがなかカタカナかでトークナイザの出力が変るみたいなので、kuromoji_tokenizer はあまり向いてなさそうですね。あ、kuromoji_readingform はフィルタだから関係ない話ですね。


(system) #4