Elasticsearchを用いた日本語検索システムの理論と設定
Elasticsearchと対話Botによる対話型の検索システム 第1回
ダウンロード サンプルファイル (4.6 KB)
-
- Page 3
検索または登録から外すための品詞設定
助詞-格助詞-一般と助詞-終助詞を検索、登録の際の候補から外すための処理です。
助詞-格助詞には”が”や”の”などの検索に効果を発揮しない単語があるためです。
助詞-終助詞には、こちらも”か”や”と”などの検索に効果を発揮しない単語があるため、同様に除きます。
# 検索に用いる文書を単語に分割するための設定
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の例:これは例文です。→ これ れは は例 例文 文で です す。
# 上記の設定を用いて文書を解析し登録、検索するための設定
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を用いた日本語検索システム理論理論と設定について終わります。次回はこの理論と設定を踏まえた上で実際に動作させるところまで行います。
参考文献
- Elasticsearch 日本語で全文検索 その3
- ElasticSearchTutorial.com
- 第8回 Elasticsearchの基礎を学ぶ
- Basic ElasticSearch Concepts
- Lucene's documentation on scoring.
- Introduction to Elasticsearch
- Apache Solr vs Elasticsearch
- How scoring works in Elasticsearch
- Docker Ubuntu
- Japanese (kuromoji) Analysis Plugin
- Elasticsearch 日本語で全文検索 その2
- クラス OdorijiCharFilter
- Lucene's Practical Scoring Function
- 東京外国語大学言語モジュール
- Indexing Documents
- Function Score query
- Query Time Boosting
- Analyzer
- Stemmer Token Filter
- ICU Normalizer
- Elasticsearch 日本語形態素解析のための文字列正規化の重要性
- Optimizing Search Results in Elasticsearch with Scoring and Boosting
- Elasticsearch – why have index_analyzer AND search_analyzer
- 修正履歴
-
- 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開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
