Sudachiとは
Elasticsearch で 日本語形態素解析を行えるプラグラインに、「kuromoji」、「Sudachi」があり、この2つは Amazon OpenSearch Service でも使用できるプラグインです。
Sudachiは、2023/10/17からOpenSearchでプラグインとして使用できる様になりました。
Sudachiのインストール手順はAWSのブログで紹介されています。
今回は Sudachi のフィルターについて調べてみました。
フィルターとは
Sudachiであらかじめ準備されている、日本語形態素解析によって分割された単語(トークン)に対して様々な処理を行うコンポーネントです。
目次
-
SudachiのGithubのREADMEにフィルターの説明があります。
- sudachi_part_of_speech
- sudachi_ja_stop
- sudachi_baseform
- sudachi_normalizedform
- sudachi_readingform
OpenSearchにSudachiをインストールし、DevToolsで各コマンドを実行してフィルターについて調査しました。
sudachi_part_of_speech
指定した品詞の単語(トークン)を除外します。
Sudachiのstoptags.txtを見ると指定できる品詞が確認できます。
「吾輩は猫である。名前はまだ無い。」という文章を、Sudachiで日本語形態素解析した時の品詞は下記の様になりました。
吾輩 ('代名詞', '*', '*', '*', '*', '*') は ('助詞', '係助詞', '*', '*', '*', '*') 猫 ('名詞', '普通名詞', '一般', '*', '*', '*') で ('助動詞', '*', '*', '*', '助動詞-ダ', '連用形-一般') ある ('動詞', '非自立可能', '*', '*', '五段-ラ行', '終止形-一般') 。 ('補助記号', '句点', '*', '*', '*', '*') 名前 ('名詞', '普通名詞', '一般', '*', '*', '*') は ('助詞', '係助詞', '*', '*', '*', '*') まだ ('副詞', '*', '*', '*', '*', '*') 無い ('形容詞', '非自立可能', '*', '*', '形容詞', '終止形-一般') 。 ('補助記号', '句点', '*', '*', '*', '*')
sudachi_part_of_speechを使い、助詞と動詞を指定し、
「吾輩は猫である。名前はまだ無い。」の文章に対するOpenSearchの解析結果を確認します。
・インデクス定義 PUT /test_sudachi_part_of_speech { "settings": { "index": { "analysis": { "tokenizer": { "sudachi_tokenizer": { "type": "sudachi_tokenizer" } }, "analyzer": { "sudachi_analyzer": { "filter": ["my_posfilter"], "tokenizer": "sudachi_tokenizer", "type": "custom" } }, "filter":{ "my_posfilter":{ "type":"sudachi_part_of_speech", "stoptags":[ "助詞", "動詞" ] } } } } } } ・解析実行 POST test_sudachi_part_of_speech/_analyze { "analyzer": "sudachi_analyzer", "text": "吾輩は猫である。名前はまだ無い。" } ・解析結果 { "tokens": [ { "token": "吾輩", "start_offset": 0, "end_offset": 2, "type": "word", "position": 0 }, { "token": "猫", "start_offset": 3, "end_offset": 4, "type": "word", "position": 2 }, { "token": "で", "start_offset": 4, "end_offset": 5, "type": "word", "position": 3 }, { "token": "名前", "start_offset": 8, "end_offset": 10, "type": "word", "position": 5 }, { "token": "まだ", "start_offset": 11, "end_offset": 13, "type": "word", "position": 7 }, { "token": "無い", "start_offset": 13, "end_offset": 15, "type": "word", "position": 8 } ] }
助詞の「は」、動詞「ある」が除外されています。
sudachi_ja_stop
指定されたストップワードを除外します。
sudachi_ja_stopを使い、「は」、「で」、「ある」、「まだ」を指定し、
「吾輩は猫である。名前はまだ無い。」の文章に対するOpenSearchの解析結果を確認します。
・インデクス定義 PUT /test_sudachi_ja_stop { "settings": { "index": { "analysis": { "tokenizer": { "sudachi_tokenizer": { "type": "sudachi_tokenizer" } }, "analyzer": { "sudachi_analyzer": { "filter": ["my_stopfilter"], "tokenizer": "sudachi_tokenizer", "type": "custom" } }, "filter":{ "my_stopfilter":{ "type":"sudachi_ja_stop", "stopwords":[ "_japanese_", "は", "で", "ある", "まだ" ] } } } } } } ・解析実行 POST test_sudachi_ja_stop/_analyze { "analyzer": "sudachi_analyzer", "text": "吾輩は猫である。名前はまだ無い。" } ・解析結果 { "tokens": [ { "token": "吾輩", "start_offset": 0, "end_offset": 2, "type": "word", "position": 0 }, { "token": "猫", "start_offset": 3, "end_offset": 4, "type": "word", "position": 2 }, { "token": "名前", "start_offset": 8, "end_offset": 10, "type": "word", "position": 5 }, { "token": "無い", "start_offset": 13, "end_offset": 15, "type": "word", "position": 8 } ] }
指定されたストップワードが除外されていることが確認できます。
sudachi_baseform
動詞と形容詞を終止形に変換します。
下記の例でOpenSearchの解析結果を確認します。
・インデクス定義 PUT /test_sudachi_baseform { "settings": { "index": { "analysis": { "tokenizer": { "sudachi_tokenizer": { "type": "sudachi_tokenizer" } }, "analyzer": { "sudachi_analyzer": { "filter": ["sudachi_baseform"], "tokenizer": "sudachi_tokenizer", "type": "custom" } } } } } } ・解析実行 POST test_sudachi_baseform/_analyze { "analyzer": "sudachi_analyzer", "text": "飲み 泳ぎ 高く" } ・解析結果 { "tokens": [ { "token": "飲む", "start_offset": 0, "end_offset": 2, "type": "word", "position": 0 }, { "token": "泳ぐ", "start_offset": 3, "end_offset": 5, "type": "word", "position": 1 }, { "token": "高い", "start_offset": 6, "end_offset": 8, "type": "word", "position": 2 } ] }
「飲み」→「飲む」、「泳ぎ」→「泳ぐ」、「高く」→「高い」と終止形に変換されているこを確認できます。
sudachi_normalizedform
Sudachi 正規化形式に変換します。
正規化形式には下記の様なものがあるようです。
・送り違い
「終る」→「終わる」
「変る」→「変わる」
・字種
けもり、ケムリ、煙
・異体字(旧字体と新字体)
「附属」→「付属」
「障碍者」→「障害者」
「檢査」→「検査」
・誤用
「アッピール」 → 「アピール」
「コミュニティ」 → 「コミュニティー」
「コンピュータ」 → 「コンピューター」
下記の例でOpenSearchの解析結果を確認します。
・インデクス定義 PUT /test_sudachi_normalizedform { "settings": { "index": { "analysis": { "tokenizer": { "sudachi_tokenizer": { "type": "sudachi_tokenizer" } }, "analyzer": { "sudachi_analyzer": { "filter": ["sudachi_normalizedform"], "tokenizer": "sudachi_tokenizer", "type": "custom" } } } } } } ・解析実行 POST test_sudachi_normalizedform/_analyze { "analyzer": "sudachi_analyzer", "text": "変る 終る けむり ケムリ 附属 障碍者 檢査 アッピール コミュニティ コンピュータ" } ・解析結果 { "tokens": [ { "token": "変わる", "start_offset": 3, "end_offset": 5, "type": "word", "position": 1 }, { "token": "終わる", "start_offset": 6, "end_offset": 8, "type": "word", "position": 2 }, { "token": "煙", "start_offset": 9, "end_offset": 12, "type": "word", "position": 3 }, { "token": "煙", "start_offset": 13, "end_offset": 16, "type": "word", "position": 4 }, { "token": "付属", "start_offset": 17, "end_offset": 19, "type": "word", "position": 5 }, { "token": "障害者", "start_offset": 20, "end_offset": 23, "type": "word", "position": 6 }, { "token": "検査", "start_offset": 24, "end_offset": 26, "type": "word", "position": 7 }, { "token": "アピール", "start_offset": 27, "end_offset": 32, "type": "word", "position": 8 }, { "token": "コミュニティー", "start_offset": 33, "end_offset": 39, "type": "word", "position": 9 }, { "token": "コンピューター", "start_offset": 40, "end_offset": 46, "type": "word", "position": 10 } ] }
sudachi_readingform
カタカナ、もしくはローマ字の読みに変換します。
下記の例でOpenSearchの解析結果を確認します。
・インデクス定義 PUT /test_sudachi_readingform { "settings": { "index": { "analysis": { "filter": { "romaji_readingform": { "type": "sudachi_readingform", "use_romaji": true }, "katakana_readingform": { "type": "sudachi_readingform", "use_romaji": false } }, "tokenizer": { "sudachi_tokenizer": { "type": "sudachi_tokenizer" } }, "analyzer": { "romaji_analyzer": { "tokenizer": "sudachi_tokenizer", "filter": ["romaji_readingform"] }, "katakana_analyzer": { "tokenizer": "sudachi_tokenizer", "filter": ["katakana_readingform"] } } } } } } ・解析実行(カタカナ変換指定) POST test_sudachi_readingform/_analyze { "analyzer": "katakana_analyzer", "text": "寿司 おおきく 不動産 美津濃" } ・解析結果(カタカナ変換指定) { "tokens": [ { "token": "スシ", "start_offset": 0, "end_offset": 2, "type": "word", "position": 0 }, { "token": "オオキク", "start_offset": 3, "end_offset": 7, "type": "word", "position": 1 }, { "token": "フドウサン", "start_offset": 8, "end_offset": 11, "type": "word", "position": 2 }, { "token": "ミズノ", "start_offset": 12, "end_offset": 15, "type": "word", "position": 3 } ] } ・解析実行(ローマ字読み変換指定) POST test_sudachi_readingform/_analyze { "analyzer": "romaji_analyzer", "text": "寿司 おおきく 不動産 美津濃" } ・解析結果(ローマ字読み変換指定) { "tokens": [ { "token": "susi", "start_offset": 0, "end_offset": 2, "type": "word", "position": 0 }, { "token": "ookiku", "start_offset": 3, "end_offset": 7, "type": "word", "position": 1 }, { "token": "hudousan", "start_offset": 8, "end_offset": 11, "type": "word", "position": 2 }, { "token": "mizuno", "start_offset": 12, "end_offset": 15, "type": "word", "position": 3 } ] }
おわりに
Sudachiのフィルターについて、色々文章、単語を解析して結果を確認して調査しました。
フィルターは複数同時に使用することができますが、SudachiのGithubのREADMEにも記載されている通り、sudachi_baseform、sudachi_normalizedform、sudachi_readingformはそれぞれ上書きされる関係のため、どれか一つを使うことになると思います。