目次
Azure Cognitive Searchで日本語を扱うときに、形態素解析器を使いたい場合、2種類のAnalyzerが用意されています。今回はこれらの違いがどんなものかを見ていくことにします。
Analyzerとは?
まずは、その前にAnalyzerとは何者か?というのを少しだけ。 Azure Cognitive Searchは転置インデックスを内部で作成して、検索を行っています。 この、転置インデックスは、「単語」がどのドキュメントに入っているか?を素早く見つけることができるデータ構造となっています。
Azure Cognitive Searchは、この「単語」を入力された文章から生成するときに、Analyzerというものを利用します。
Analyzerは入力された文章をある規則に則って単語に分割する機能です。
この「ある規則」が、各種言語や用途によって様々に用意されています。
今回はこの中のja.lucene
とja.microsoft
という2種類のAnalyzerについて違いを見ていきます。
2種類のAnalyzerの違いはどんなもの?
このAnalyzerの挙動を見るためのエンドポイントとしてanalyze
というAPIがあります(詳細は昔のブログを参照)。
このAPIを利用して、Wikipediaのいくつかの文章を単語に区切って見て、
ja.microsoft
がどんな動きをしているのか想像してみます(残念ながらja.microsoft
の仕様?や挙動についてはページが見つからないため)。
もとの文章と解析結果(一部抜粋)
文章は、手元のElasticsearchに登録したjawikiのデータからランダムに抽出しています。また、自前のツールで生成したWikipediaのデータなので、まだ一部、見苦しい文字列になっています(そっちもなおさないと)。
1. 砂川(熊本県)
thumb|250px|right|上砂川橋より上流方砂川(すながわ)は、熊本県宇城市・八代郡氷川町を流れる二級河川。
この文字列から抽出された単語で特徴的なものを一部抜粋しました。
ja.microsoft |
ja.lucene |
---|---|
250px | 250 |
px | |
上砂 | 上, 上砂川 |
川橋 | 砂川 |
橋 | |
宇城 | 宇 |
市 | 城市 |
二級 | 二 |
^ | 級 |
まず、最初の250px
ですが、ja.microsoft
では、px
が単位であると判定しているのか、数値と合わせた単語として抽出されています。この場合、250
で検索しても、この文字列はヒットしない形になるので、ノイズが減ることが考えられるかと。
上砂川橋
という文字は、分割の仕方が別れました。
ja.lucene
では、上砂川
という単語が地名として辞書に存在するために、このような分割になっています。ja.microsoft
のデータは品詞の情報が取れないのですが、上砂
、川橋
ともに、名詞として辞書に存在しているのではないかなと。ja.lucene
には川橋
という単語は存在していないようでした。
宇城市
(うきし)については、2005年に合併でできた市のようで、ja.lucene
が利用している辞書には存在しない可能性があり、宇城
という文字が抽出できてないと思われます。
最後は二級
です。ja.lucene
では、数字と助数詞として分割されています。こちらも何かしらのロジックにより、二級
という1単語でヒットできるように数字と単位?が合わせた単語で出てくる仕組みがja.microsoft
なのかなと。
2. UEFA U-18女子選手権2000
UEFA U-18女子選手権2000は第3回目のUEFA U-18女子選手権である。決勝トーナメントは2000年7月27日から8月4日までフランスで行われ、ドイツが初優勝を果たした。
この文字列から抽出された単語で特徴的なものを一部抜粋しました。
ja.microsoft |
ja.lucene |
---|---|
u-18, u | u |
18, nn18 | 18 |
第3回目 | 第 |
3 | |
回 | |
目 | |
トーナメント, トナメント | トーナメント |
2000年 | 2000 |
年 | |
7月 | 7 |
月 | |
27日 | 27 |
日 |
数字を含む単語第3回目
や2000年
、7月
などは、ja.microsoft
は先程と同様、数字と単位の組み合わせを1単語として出力しています。
また、トーナメント
という単語をトナメント
という形で、長音を除去した形で出力しています。
今回の文字列ではないですが、この他に、センター
をセンター
とセンタ
の2パターンの単語で出力するといったことを行っています。
ja.lucene
の場合、単語の最後に長音がある場合だけセンタ
として、長音を除去した単語が出力されます。
これは、長音の表記ゆれに対応するためではないかなと。たとえば、インターフェース
とインタフェース
、インターフェイス
のように、人や文章によって、間にでてくる長音を使ったり使わなかったりという表記ゆれに対応するためだと思われます。
その他にも、イプロゥヴェト
をイプロゥベト
に、ネクスト
をネキスト
に、バラエティ
をバラエチ
にも変換するなどといった処理をしてくれるようです。カタカナの表記ゆれには強そうですね(これどうやってるんだろう?)。
ja.microsoft
では、nn18
というちょっと変わった単語も出てきていました。純粋な数字の場合はnn
と入力してくれるようで、数字だけで検索したい場合に利用できるのかな?これはドキュメントに書いておいてほしいかも?
共通点
ja.lucene
、ja.microsoft
ともに、共通している動作として、「てにをは」といった単語は除去されていました。違いがあるものとしては、「より」(助詞-格助詞-一般)、「されている」(動詞-自立、動詞-接尾、助詞-接続助詞、動詞-非自立)、「ある」(助動詞)といったものはja.microsoft
では除去されずに出てきていました。
ストップワード的に「てにをは」あたりを除去をしている感じでしょうか?
アルファベットで構成されている単語についても、基本はそのまま出力される挙動のようでした。
じゃあどっちがいいの?
残念ながらどちらがいいかは、一長一短かなぁと。
ja.lucene
に関しては、Luceneの仕組みを利用しているので、Elasticsearchなどを使えば、個別の単語についてより詳細の情報を取得することが可能です(品詞、読みなど)。ja.microsoft
については、残念ながら手の入れようがないので、そういう動きのものだという割り切った使い方になるでしょうか?
ただ、長音の除去による表記ゆれなどについては、便利な機能なので、そのあたりの問題に対応したい場合は、ja.microsoft
を活用するのも良いかと思います。
個人的には、より細かい単語としてインデックスに登録できるもののほうが、柔軟な検索には対応できるのではないかなぁと考えています(Kuromojiの辞書をUniDicにするとか?も考えますが、これはAzure Searchではできないですが)。
まとめ
Wikipediaのデータをいくつか使って、ja.microsoft
とja.lucene
の違いについて、考察してみました。何かの役に立てばと。
他に、これはどんな感じになるの?などありましたら、コメントいただければと。
comments powered by Disqus
See Also by Hugo
- OData式と日本語の検索(NGram)とフレーズ検索
- Elasticsearch 2.0系のIssueの紹介
- elasticsearch-inquisitorプラグインの紹介
- Oramaという検索エンジンでブログ検索を作ってみた
- Querqyの調査(その2:アーキテクチャ)