Azure Cognitive Searchでの日本語向けAnalyzerの違い

Posted by johtani on Tuesday, June 9, 2020

目次

Azure Cognitive Searchで日本語を扱うときに、形態素解析器を使いたい場合、2種類のAnalyzerが用意されています。今回はこれらの違いがどんなものかを見ていくことにします。

Analyzerとは?

まずは、その前にAnalyzerとは何者か?というのを少しだけ。 Azure Cognitive Searchは転置インデックスを内部で作成して、検索を行っています。 この、転置インデックスは、「単語」がどのドキュメントに入っているか?を素早く見つけることができるデータ構造となっています。

Azure Cognitive Searchは、この「単語」を入力された文章から生成するときに、Analyzerというものを利用します。 Analyzerは入力された文章をある規則に則って単語に分割する機能です。 この「ある規則」が、各種言語や用途によって様々に用意されています。 今回はこの中のja.luceneja.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.luceneja.microsoftともに、共通している動作として、「てにをは」といった単語は除去されていました。違いがあるものとしては、「より」(助詞-格助詞-一般)、「されている」(動詞-自立、動詞-接尾、助詞-接続助詞、動詞-非自立)、「ある」(助動詞)といったものはja.microsoftでは除去されずに出てきていました。 ストップワード的に「てにをは」あたりを除去をしている感じでしょうか?

アルファベットで構成されている単語についても、基本はそのまま出力される挙動のようでした。

じゃあどっちがいいの?

残念ながらどちらがいいかは、一長一短かなぁと。 ja.luceneに関しては、Luceneの仕組みを利用しているので、Elasticsearchなどを使えば、個別の単語についてより詳細の情報を取得することが可能です(品詞、読みなど)。ja.microsoftについては、残念ながら手の入れようがないので、そういう動きのものだという割り切った使い方になるでしょうか? ただ、長音の除去による表記ゆれなどについては、便利な機能なので、そのあたりの問題に対応したい場合は、ja.microsoftを活用するのも良いかと思います。

個人的には、より細かい単語としてインデックスに登録できるもののほうが、柔軟な検索には対応できるのではないかなぁと考えています(Kuromojiの辞書をUniDicにするとか?も考えますが、これはAzure Searchではできないですが)。

まとめ

Wikipediaのデータをいくつか使って、ja.microsoftja.luceneの違いについて、考察してみました。何かの役に立てばと。 他に、これはどんな感じになるの?などありましたら、コメントいただければと。


comments powered by Disqus