CodeZine(コードジン)

特集ページ一覧

Elasticsearchを用いた日本語検索システムの理論と設定

Elasticsearchと対話Botによる対話型の検索システム 第1回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2016/10/06 14:00
目次

検索または登録から外すための品詞設定

 助詞-格助詞-一般と助詞-終助詞を検索、登録の際の候補から外すための処理です。

 助詞-格助詞には”が”や”の”などの検索に効果を発揮しない単語があるためです。

 助詞-終助詞には、こちらも”か”や”と”などの検索に効果を発揮しない単語があるため、同様に除きます。

リスト4 ElasticsearchCode/elasticsearch.yml
# 検索に用いる文書を単語に分割するための設定 
tokenizer:
    # mecab neologdを用いて形態素解析(文書を単語単位に分割する処理)
    default_ja_tokenizer:
        type: kuromoji_neologd_tokenizer
        mode: search
        user_dictionary: /usr/share/elasticsearch/dict/userdict_ja.txt
    # ngram単位で文書を分割
    ngram_ja_tokenizer:
        type: nGram
        min_gram: 2
        max_gram: 2
        token_chars: [letter, digit]

 単語分割処理の部分です。

 「default_ja_tokenizer」は辞書と自然言語処理と機械学習の手法を組み合わせて単語分割を行っているkuromoji_neologd_tokenizerを使用して単語分割をしています。kuromoji_neologd_tokenizerに関しては、これだけで連載できるほどの記事を書くことが可能になるくらい深い内容になるので、本記事では紹介程度にしておきます。

 kuromojiには通常の辞書を使用する場合とneologdを使用する場合がありますが、nelogdを採用することにしています。理由は通常の辞書には登録されていない単語に対応している可能性が高く単語分割が適切に行えるからです。

例:
mecab: ポケモンGO →ポケモン GO 
mecab neologd:ポケモンGO →ポケモンGO 

 「ngram_ja_tokenizer」はngramという単位で単語を分割する手法を採用して単語分割をしています。nの部分が数値となり、数値が増えるほど分割量が減っていき、まとまった単語として扱えるようになります。こちらの利点は、辞書に存在しないような単語を分割することが可能になることです。

例:
unigram(1gram):これは例文です。→ こ れ は 例 文 で す 。
2gramの例:これは例文です。→ これ れは は例 例文 文で です す。
リスト5 ElasticsearchCode/elasticsearch.yml
# 上記の設定を用いて文書を解析し登録、検索するための設定 
analyzer:
    # 文書を登録する際の設定
    ja:
        alias: [index_analyzer]
        type: custom
        tokenizer: default_ja_tokenizer
        char_filter: [
            html_strip,
            kuromoji_neologd_iteration_mark,
            icu_normalizer
        ]
        filter: [
            pos_filter,
            lowercase,
            cjk_width,
            katakana_stemmer,
            stopword
        ]
    # 文書を検索する際の設定
    ja_synonym:
       alias: [search_analyzer]
       type: custom
       tokenizer: default_ja_tokenizer
       char_filter: [
           html_strip,
           kuromoji_neologd_iteration_mark
       ]
       filter: [
           lowercase,
           cjk_width,
           katakana_stemmer,
           kuromoji_neologd_part_of_speech,
           synonym,
           stopword
        ]
    # 検索の多様性を高めるための設定
    ja_ngram:
        type: custom
        tokenizer: ngram_ja_tokenizer
        char_filter: [html_strip]
        filter: [
            lowercase,
            cjk_width
        ]

 上記は、今まで設定した余分な単語を削除する「filter」と、単語分割のための「tokenizer」を用いて文書の登録、検索、検索の多様性を高めるための設定を「analyzer」で行っています。

ja

 こちらは文書登録用の「analyzer」の設定です。

項目 説明
alias: [index_analyzer] 文書登録用のanalyzerであることを示しています。
tokenizer: default_ja_tokenizer 上記で設定した「default_ja_tokenizer」を使用していることを表しています。
html_strip HTMLタグの消去をしています。
kuromoji_neologd_iteration_mark: 日本語の々、ヽ、ゝなどの踊り字を正規化しています。
例:つゝみ→つつみ
icu_normalizer 文字単位で全角、半角の統一しています。
pos_filter 「助詞-格助詞-一般」「助詞-終助詞」の除去しています。
lowercase 英語の小文字化しています。
cjk_width 単語単位で全角半角の統一しています。(全角記号を半角、全角英数字を半角、半角カタカナを全角に変換しています。)
katakana_stemmer カタカナの長音除去しています。
stopword ストップワードの除去しています。

ja_synonym

 検索の際は打ち間違いの可能性や同一の意味の単語を同様に扱って欲しいため、同義語を扱えるように同義語のフィルターを使用しています。

項目 説明
alias: [search_analyzer] 検索用のanalyzerであることを示しています。
kuromoji_neologd_part_of_speech 接続詞、助詞、記号などの不要な品詞の除去しています。
synonym 同義語の統一しています(例:本、書物 etc)。

ja_ngram

 「default_ja_tokenizer」は辞書に登録された単語は分割可能ですが、それ以外の単語の分割はできません。辞書に登録されていないような未知の単語やレアな単語を扱いたい場合はこちらの設定を行うと対応が可能になります。ただし単語の数で区切るので、適切な箇所で区切ることができず検索精度が下がる恐れがあります。

項目 説明
tokenizer: ngram_ja_tokenizer 単語への分割は上記に示した「ngram_ja_tokenizer」を使用しています。

最後に

 以上でElasticsearchを用いた日本語検索システム理論理論と設定について終わります。次回はこの理論と設定を踏まえた上で実際に動作させるところまで行います。

参考文献



  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2016/10/11 11:57 サンプルファイルを差し替えました。

  • 2016/10/09 18:16 Page 1 検証環境を追記

  • 2016/10/09 18:16 ElasticsearchCode/elasticsearch.ymlの「min_gram」と「max_gram」を同一の値である2に修正

  • 2016/10/09 18:15 Page 3 「2gramの例」 例を「これは例文です。→ これ は例 文で す。」から「これは例文です。→ これ れは は例 例文 文で です す。」に修正

  • 2016/10/09 18:15 Page 3 「mecab」を「kuromoji」に修正

  • 2016/10/09 18:15 Page 3 「mecab neologd」を「kuromoji neologd」に修正

  • 2016/10/09 18:15 Page 2 ステミングの設定 kuromoji_neologd_stemmerの例をカタカナの長音をステミングするための設定に修正

バックナンバー

連載:Elasticsearchと対話Botによる対話型の検索システム

著者プロフィール

  • WINGSプロジェクト 大串 正矢(オオグシ マサヤ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5