検索または登録から外すための品詞設定
助詞-格助詞-一般と助詞-終助詞を検索、登録の際の候補から外すための処理です。
助詞-格助詞には”が”や”の”などの検索に効果を発揮しない単語があるためです。
助詞-終助詞には、こちらも”か”や”と”などの検索に効果を発揮しない単語があるため、同様に除きます。
# 検索に用いる文書を単語に分割するための設定
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
