AWS JAPAN APN ブログ
Amazon OpenSearch Service における Sudachi プラグインの活用方法の紹介
本記事は、ワークス徳島人工知能 NLP 研究所 所長 内田佳孝氏、ワークス徳島人工知能 NLP 研究所 マネジャ 髙岡一馬氏、アマゾン ウェブ サービス ジャパン合同会社 Technology Partnerships パートナーソリューションアーキテクト 櫻谷広人による共著です。
リアルタイムのアプリケーションモニタリングやログ分析、ウェブサイトの検索機能などに OpenSearch を活用されているお客様は多いのではないでしょうか。OpenSearch は、リアルタイムのアプリケーションモニタリング、ログ分析、ウェブサイト検索などの幅広いユースケースにご利用いただける分散型、コミュニティ主導型、Apache 2.0 ライセンス、100% オープンソースの検索および分析スイートです。
AWS 上に構築されたアプリケーションでこの OpenSearch を利用したい場合は、Amazon OpenSearch Service の利用がおすすめです。Amazon OpenSearch Service とは、お客様側でインフラストラクチャを管理、モニタリング、保守する必要がなく、少ない運用コストで OpenSearch クラスターの構築およびスケールが可能な AWS のマネージドサービスです。基本的なインデックス管理、分析機能に加えて、自動スナップショット、データの暗号化、きめ細やかなアクセスコントロール、Blue/Green デプロイ、クラスター間のレプリケーション、トレース分析、ダッシュボード、ノートブック、異常分析、アラート、レポートなど、多くの高度な機能をサポートしています。
OpenSearch がよく利用されるユースケースとして、EC サイトにおける商品検索のような自然言語による全文検索があります。全文検索では、効率よく精度の高い結果を得られるようにするために、形態素解析のようなテキストの事前処理を行う必要がありますが、ここで課題となるのが日本語の取り扱いです。日本語は、英語のようにスペースによって一意に単語の区切りを特定することができないため、特殊なアナライザーや辞書を用意する必要があります。OpenSearch Service には、デフォルトで Japanese (kuromoji) Analysis というプラグインが含まれており、日本語文字列の処理には主にこちらが利用されてきました。2023 年 10 月 17 日より、Works Applications が研究開発を行っているオープンソースの日本語形態素解析器 Sudachi が、新たにマネージドプラグインとして利用可能になりました。本記事では、新たにサポートされたこちらのプラグインがどのようなものかについて、そして OpenSearch Service 上での利用方法について解説します。
Sudachi とは
「Sudachi」は オープンソースの日本語形態素解析器で、ワークス徳島人工知能 NLP 研究所により開発・提供されているソフトウェアの 1 つです。
ワークス徳島人工知能 NLP 研究所
2017 年 2 月にワークスアプリケーションズが徳島県に開設した自然言語処理に特化した研究機関です。AI、特に NLP 技術を用いた業務効率化・生産性向上実現による新しい働き方提案のための研究開発を進めています。
日本語形態素解析器は、日本語テキストを扱う上で必須である、単語分割、品詞付与、正規化処理の 3 つの処理を行うものです。中でも Sudachi は (1) 290 万語を超える大規模な語彙を収録、(2) 複数の単語分割単位を選択・併用することが可能、(3) 文字種の違い、送り仮名の違いなど日本語単語がもつ表記の揺れを吸収可能、(4) プラグインにより様々な機能を追加可能といった特長をもっています。
また、語彙は定期的に更新・洗練されており、最新の単語も随時追加が行われています。Java、Python、Rust など様々なプログラム言語で実装されており、これまでに 1100 万回以上のダウンロードがされています。
研究開発用途のみでなく様々な商用サービスにも組み込まれ活用されており、日本語自然言語処理の高精度化にかかせないソフトフェアとなりつつあります。
プラグインの利用方法
OpenSearch Service で Sudachi プラグインを利用するには、ドメインにプラグインを関連付ける必要があります。すでに作成済みの既存のドメインを使用するか、こちらの手順に従って新しいドメインを作成してください (※Sudachi プラグインがサポートしているバージョンは、OpenSearch 1.3 以上です。Elasticsearch はサポート対象外ですのでご注意ください)。
また、本機能の利用にあたっては、以下の点も併せてご確認ください (2023 年 10 月 17 日時点の情報になります)。
- Amazon OpenSearch Serverless では利用することができません。
- プラグインの有効化には、ノードの再起動 (Blue/Green デプロイ) が伴います。
- OpenSearch Service が利用可能なすべてのリージョンで利用できます。
- プラグインの利用に、追加料金は発生しません。
プラグインの関連付けは、マネジメントコンソールや AssociatePackage API を利用して行うことができます。 今回は、マネジメントコンソールから設定する例をご紹介します。
AWS アカウントにログインし、OpenSearch Service のコンソールに移動します。左側のメニューから [パッケージ] を選択します。
[プラグイン] タブを選択し、「sudachi」を検索します。
関連付けるドメインのバージョンと一致するプラグインを選択します。
[ドメインへの関連付け] をクリックして、このパッケージを関連付けるドメインを選択します。
青色のボックスでハイライトされている通り、プラグインの関連付けを行うと Blue/Green デプロイが開始されます。デプロイの完了まで時間がかかることがありますので、関連付けのステータスがアクティブに変わるまで待機します。
プラグインのテスト
関連付けが完了したら、Sudachi を使った analyzer を作成し、試しにいくつかクエリを実行してみましょう。ブラウザからインタラクティブにクエリを実行できるツールとして、今回は OpenSearch Dashboards を利用します。OpenSearch Dashboards のリンクは、ドメインの詳細画面から確認することができます。ダッシュボードへアクセスするには、適切なアクセス制御の設定を行う必要があります。詳細はこちらのドキュメントをご覧ください。
任意のユーザーでログインしたら、左側のメニューから Management > Dev Tools を選択します。
クエリエディタが開くので、左側のペインに実行したいクエリを入力します。右側のペインには、実行結果が表示されます。クエリの実行は、▶️ のボタンをクリックするか、ショートカットキーで行います (Mac の場合は Command + Enter)。
例として、今回は複数の単語分割単位によるトークナイズと、表記の正規化を行います。まずは、analyzer を作成します。
PUT /sudachi_sample
{
"settings": {
"index": {
"analysis": {
"tokenizer": {
"sudachi_c_tokenizer": {
"type": "sudachi_tokenizer",
"additional_settings": "{\"systemDict\":\"system_core.dic\"}",
"split_mode": "C",
"discard_punctuation": true
},
"sudachi_a_tokenizer": {
"type": "sudachi_tokenizer",
"additional_settings": "{\"systemDict\":\"system_core.dic\"}",
"split_mode": "A",
"discard_punctuation": true
}
},
"analyzer": {
"c_analyzer": {
"filter": [],
"tokenizer": "sudachi_c_tokenizer",
"type": "custom"
},
"a_normalizedform_analyzer": {
"filter": ["sudachi_normalizedform"],
"tokenizer": "sudachi_a_tokenizer",
"type": "custom"
}
}
}
}
}
}
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "sudachi_sample"
}
tokenizer で sudachi_tokenizer を指定し、辞書ファイルの位置は additional_settings で JSON を文字列に変換した形式で指定します。分割単位は split_mode で指定します (A がもっとも短く、C がもっとも長い)。また、filter に sudachi_normalizedform を指定して、Sudachi による正規化を有効にします。
作成したこれらの analyzer を使って、サンプルのクエリを実行してみましょう。
C モードを指定した c_analyzer を使うと、もっとも長い単位で単語が分割されることがわかります。
GET /sudachi_sample/_analyze?pretty
{
"analyzer":"c_analyzer",
"text":"関西国際空港"
}
{
"tokens": [
{
"token": "関西国際空港",
"start_offset": 0,
"end_offset": 6,
"type": "word",
"position": 0
}
]
}
反対に、A モードを指定した a_normalizedform_analyzer では、細かく分割された単語列が返されます。
GET /sudachi_sample/_analyze?pretty
{
"analyzer":"a_normalizedform_analyzer",
"text":"関西国際空港"
}
{
"tokens": [
{
"token": "関西",
"start_offset": 0,
"end_offset": 2,
"type": "word",
"position": 0
},
{
"token": "国際",
"start_offset": 2,
"end_offset": 4,
"type": "word",
"position": 1
},
{
"token": "空港",
"start_offset": 4,
"end_offset": 6,
"type": "word",
"position": 2
}
]
}
このように用途に応じて長い分割と短い分割を併用することができます。
次に、正規化を試してみます。
GET /sudachi_sample/_analyze?pretty
{
"analyzer":"a_normalizedform_analyzer",
"text":"引越す、引っ越す、ひっこす"
}
{
"tokens": [
{
"token": "引っ越す",
"start_offset": 0,
"end_offset": 3,
"type": "word",
"position": 0
},
{
"token": "引っ越す",
"start_offset": 4,
"end_offset": 8,
"type": "word",
"position": 1
},
{
"token": "引っ越す",
"start_offset": 9,
"end_offset": 13,
"type": "word",
"position": 2
}
]
}
このように送り仮名や文字種が異なっても Sudachi の正規化を使って同一の語として扱うことができるようになります。
その他のリソース
- Sudachi に関してお客様専用のヘルプデスク・障害対応・情報発信をご希望の方へ:ワークス徳島人工知能 NLP 研究所から、Sudachi 保守サービスが提供されています。こちらからお問い合わせください。
- Amazon OpenSearch Service の Optional Plugins (Custom Package) に関するお問い合わせは、AWS サポートへご連絡ください。
- お客様の Sudachi 活用における有償サポートを、AWS Marketplace プロフェッショナルサービスとして今後出品予定です。
まとめ
Sudachi を活用することで、日本語の自然言語処理のさらなる高精度化が期待できます。プラグインのデプロイおよび管理は OpenSearch Service が行うため、お客様側でパッケージのインストールや設定作業などの運用の負担が増えることはありません。手軽に組み込むことができますので、ぜひ一度試してみてください。
参考資料
- GitHub: WorksApplications/Sudachi
- AWS ドキュメント: OpenSearch Service で利用できるプラグイン
- ハンズオンワークショップ: Amazon OpenSearch Service Intro Workshop