itさて、前回に引き続きElasticsearchの設定です。その6(Aggregationを使った分類・集計)今回はテキスト分析のキモになるAnalysisについて。AnalysisについてAnalysisは、「検索のクエリの文字列」と「インデックスに格納している文書」がヒットするように、格納する文章、クエリの文字列ともに、単語の単位で分割する手法です。文書をAnalyzerを使って分割を行います。Plugin」と呼ばれるプラグインを使って分割することが多いです。文章を解析するときに「表記の揺れ」を抑えるルールとしては以下のようなものがあります。・ステミング語形の変化を取り除いて、同一表現の単語に分割する処理。・ノーマライズ(正規化)データを利用しやすいように整形すること。全角文字を半角文字に揃える、大文字を全て小文字に揃える、カタカナを平仮名に揃えるなど、単語単位での表記の揺れに対応します。・ストップワード文章中の自然言語の中で、一般的などの理由で単語自体に意味を持たない単語を対象外にする処理。英語では「the」や「a」や「for」などの冠詞、前置詞や助詞などを除外することが多い。Analyzerの定義方法マッピング定義でフィールドとそのデータ型が定義できますが、そこでAnalyzerを指定できます。Analyzer」による単語分割が行われるようになります。Analyzerはフィールド単位で設定しますが、設定するとインデックス格納時だけでなく、クエリ実行時にもここで指定したAnalyzerが使われます。filter」の3つのブロック処理から構成されています。filter」を通り、各filterによる変換処理が行われます。次にテキストが「Tokenaizer」によってトークン(単語)に分割されます。filter」により変換処理が行われます。filter」は入力されたテキストを前処理するためのフィルタ機能です。HTMLのタグの除去やマッピングによるルールの変換など、単語分割を行う前の変換処理を行います。analyzers」で利用することができます。Filterhttps://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-htmlstrip-charfilter.htmlHTMLフォーマットのテキストに含まれるタグを除外します。特定のタグは除外対象から除くなどの設定もできます。Filterhttps://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-mapping-charfilter.html入力文字に含まれる特定の文字に対してマッピングルールを定義しておき、ルールに基づいた変換処理を行います。Filterhttps://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern-replace-charfilter.html定義された正規表現ルールに基づいて入力文字の変換処理を行います。「123_456_789」Tokenizerhttps://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.htmlTokenizerは受け取ったテキストに対して分割処理を行い、トークン(単語)の列を生成します。analyzers」で利用することができます。・単語分割用のTokenizer空白などの単語の区切りなどから、トークン(単語)に分割します。Tokenizer」が提供されています。・N-Gramでの単語分割用のTokenizer単語を小さなフラグメントにします。Tokenizer」が提供されています。・構造化テキスト分割用のTokenizerメールアドレス、郵便番号やファイルパスなどの構造化テキストを分割します。Tokenizer」が提供されています。filter」はTokenizerが分割したトークンに対して、変換処理を行います。Filter」と非常に多くのフィルタがあります。filterは以下の4つです。Filterトークンの文字を全て小文字に変換するフィルタです。filterストップワードの除去を行うフィルタです。言語ごとにデフォルトのストップワードリストが定義されています。ストップワードリストのカスタマイズも可能です。filter言語ごとに定義されたステミング(語幹)処理を行うフィルタです。filter類義語(シノニム)を正規化して一つの単語に変換するためのフィルタです。「universe」、「cosmos」など、同じ「宇宙」という意味を持つ単語を、すべて「cosmos」に変換して揃えるなどしてくれます。ビルトインで提供されているAnalyzerビルトインで提供されているAnalyzerは以下などがあります。Analyzerhttps://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html以下の言語パターンに対応しています。thai.それぞれ固有のStopwordsやステミングなどが設定されています。Analyzerは「custom」として設定できます。FilterAnalyzerのカスタム定義Analyzerをカスタムで定義するには以下のような形で定義を行います。日本語を扱うAnalyzerはプラグインで追加インストールできます。Plugin」の2種類あります。Unicode」ライブラリーを使用しており、アジア系言語に対応したプラグインで、文字列境界の解析やUnicode変換など様々なことを実施してくれるプラグインです。Plugin」はオープンソースの日本語形態素解析エンジンである「kuromoji」をElasticsearchに統合したプラグインです。見出し化、漢字の読み方や、複数の辞書のバックエンドをサポートしています。Pluginの設定kuromojiの設定は以下のように行います。「kuromoji」に対応したビルトイン機能がいくつか提供されています。「時時」Tokenizer「kuromoji_tokenizer」はkurojojiを用いた日本語形態素解析を行うTokenizerです。動作をコントロールするための設定が3種類あります。「ア」、「ブ」、「ラ」、「カ」、「ダ」、「ブ」、「ラ」デフォルトは「search」モードです。discard_punctuation「true」と指定した場合は句読点を除外します。デフォルトは「true」です。user_dictionaryユーザー辞書ファイルを使う場合にそのファイルパスを指定します。「コンピュータ」ja_stop日本語用のストップワード除去フィルタです。デフォルトのままでも「あれ」、「それ」などを除去してくれます。true」を追加すると、トークンだけでなく読みや品詞といった情報もとることができます。]}}長くなりましたが一旦、Elasticsearchでの検証は終了です。その6(Aggregationを使った分類・集計)このブログは株式会社CoLabMixによる技術ブログです。GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。