Watson NLP Library を使ってカスタム分類を試してみる（前編）

## はじめに

昨今、各企業において、ChatGPTをはじめとした、大規模言語モデルのビジネスにおける活用について、様々な検討や検証を開始されているかと思います。IBMにおいても、watsonxという、大規模言語モデルを使った、新しいプラットフォームの提供を2023年7月に開始しましたが、2022年10月より、お客様のソリューションに組み込む形で、オンプレでの閉じた環境や、GPUなどが無いPC上などでも使える、自然言語処理（NLP:Natural Language Processing）の実行ライブラリ（コンテナモジュール）として、「Watson Library」という名前でのご提供を開始しています。

Watson NLP Libraryがご提供する様々な機能についてのご紹介は、ここでは割愛しますが、今回は、Watson NLP Library の「カスタム分類」という機能を使い、カスタマーセンターなどで発生する様々な問い合わせに対して、AIが質問の内容を見て、質問のカテゴリーを自動分類するまでの一連のステップを体験する方法をご紹介いたします。

当前編では、クラウドサービスとして提供されている、Watson Studio上のJupyter Notebookを使って、複数の学習モデルを作成し、テストデータで、それらのモデルの精度の比較検証を行った上で、最も優れたモデルを保存し、ローカルPCにダウンロードします。
続いて、次回後編では、ローカルPC上でWatson NLP Libraryのコンテナを稼働させ、ダウンロードした学習モデルを使って、API呼び出しを行い、前編と同等のテストデータでカスタム分類が実行できることを確認したいと思います。

これから、自然言語処理や、言語モデルのビジネス活用について、ご検討されている皆様の参考になれば幸いです。
　
### 今回作成するシステムアーキテクチャのイメージ
まず、初めに、今回利用する環境の全体アーキテクチャを以下に示します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/641f9f7c-df36-d7fc-128c-74a9e1683ea0.png" width=70%>

今回の試用環境においては、IBM CloudのWatson Studioで提供されるJupiter Notebookの環境で、pythonを使って、Watson Library NLPを呼び出しながら、Watson Machine Learning上でカスタム分類のモデルを学習・実行させます。
利用するデータは当記事にて提供し、前編ではCloud上にて検証を行い、後編ではオンプレミス環境にて、検証結果を確認します。

今回利用したソフトウェアやモジュールのバージョンは実施時点（2023年12月）で利用可能なものを使いました。

試用環境の各種選択／バージョン：
・ Watson NLP ランタイム 23.1
・ Python 3.10

### ステップ１： Watson Studio環境の準備
まず、IBM CloudのTOPページ（ https://cloud.ibm.com/ ）にアクセスしログインします。

上部メニューの「カタログ」を押し、左のカテゴリーから「AI/機械学習」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/555936e6-190f-5032-616e-db97d7b4cb68.png)

サービスのリスト（タイル）が出るので、「Watson Studio」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/6aa40c4b-ed68-ad11-2e4a-de46c01227ae.png)

Watson Studioのオーダ画面になるので、「作成」タブで、ロケーションの選択から「東京（jp-tok）」を選び、プランは「ライト」を選択して、利用条件を確認した上で、右のチェックボックスを押して、青い「作成」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/5513362c-6301-7bd8-77a3-cd81c02794bc.png)
これで、IBM Watson Studioのインスタンスが作成されました。

### ステップ２： Watson Studioへのアクセス

#### 2-1.Watson Stduioのインスタンス初期画面へのアクセス
ステップ１実行の直後は直接、次のWatson Studioの初期画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/4e516bfe-fcf1-6522-f984-ae5144131cea.png)
２回目以降のタイミングなどで、上記の画面（リソースリストから、該当のWatson Studioのインスタンスを選択した状態）を出したい場合は、IBM Cloudのロゴの左上のハンバーガーメニュー（3本線）を押し、サイドメニューから「リソース・リスト」を選択し、AI/機械学習の中にある「Watson Studio-xx（xx:は自動作成されている）」を押す事で同じ画面が出せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/a236d48e-adea-6707-5fbe-4407b39330d6.png)

#### 2-2.Watson Machine Learningインスタンスの作成
Watson Studioの初期画面で青い「Launch in」ボタンを押します。

Watson Machine Learningインスタンスがまだ作成されていない場合は、以下のメニューが出るので、「Watson Machine Learningのプロビジョン」を選んで、「次へ」を押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/ada89467-0451-15e4-132d-405d70796ee0.png" width=50%>
Watson Machine Learningのオーダー画面が出るので、リージョンの選択を「東京」にして、「ライト」プランを選んだ状態で、青い「作成」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/95bab4bf-d97b-ad7e-b0fc-adeee5dca3ab.png)
これで、Watson Machine Learningのインスタンスが作成されました。

#### 2-3.Watson Studioのプロジェクトの作成
続いて、以下のナビゲーション画面が出てくるので、そのまま「新規プロジェクト」を選択して、「次へ」を押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/0c8e32b9-199f-4a69-d3d8-c753db123dc8.png" width=50%>

これまでにCloud Object Storageインスタンスが作成されていない場合（初めて利用する場合）、以下の画面となり、ここでストレージの定義（作成）を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/89721ef2-4a71-090d-8962-dd10ccbbd974.png)

ストレージ定義の「①ストレージ・サービスの選択」の下の「追加」を押します。

Cloud Object Storageのオーダー画面が出るので、「ライト」プランを選択して「作成」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/ec8561b1-bd04-b3f8-ea80-b9a095e83eb7.png)
これで、オブジェクトストレージが作成され、新規プロジェクトの画面に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/fcb322be-5616-3962-8eac-17be00399172.png)
「②最新表示」が青くなっているので、そのリンクを押すと、①で作成されたCloud Object Storageのインスタンス名が自動的に挿入されるので、そのまま、詳細定義の名前に「Watson NLP Library」（任意）と入れて、「作成」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/c09a5e36-cdd9-639c-397b-03bc1a5a1e63.png)

これで、Watson Machine LearningインスタンスとCloud Object Storageが紐づいたプロジェクトが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/5f3e5734-9b29-ee0c-501e-e489171819b2.png)

### ステップ3： IBM Watson Studio 上で、Jupyter Notebookの環境を準備する

#### 3-1. カテゴリ分類の学習及びテストで使うデータの準備
今回のカテゴリ分類に使うデータは、カスタマーセンターのユースケースを想定し、お客様からあった問い合わせと、そのカテゴリーのサンプルです。
5つのカテゴリーに対して、20個ずつ用意しています。

以下のcsvテキストデータ（2列/101行）を、copyボタン（黒い枠の右上にあるボタン）を使ってデータコピーし、別途、PC上のテキストエディタで新規ファイルを作成した上で、テキストデータをペーストしてから、「sample_data.csv」というファイル名で、文字コードは「Unicode（UTF-8）」にて保存してください。
```
コンテンツ,分類
わたしは自宅の無線ネットワークに接続できません。試してみる度にパスワードが間違っていると表示されます。,ネットワーク
新しい無線ルーターを導入しましたが、デバイスが検出できません。,ネットワーク
ネットワーク接続が非常に遅く、オンライン動画をスムーズに視聴できません。,ネットワーク
夜間になるとネットワーク接続が頻繁に切れ、仕事に支障をきたしています。,ネットワーク
公共のWi-Fiネットワークに接続しようとしましたが、インターネットアクセスができません。,ネットワーク
引っ越しをしたばかりで、インターネットサービスを新しい住所に移行できません。,ネットワーク
特定のアプリケーションを使用する際、ネットワーク接続が非常に不安定になります。,ネットワーク
特定の部屋でワイヤレスネットワークの信号が非常に弱く、カバレッジを向上させる必要があります。,ネットワーク
有線接続でインターネットに接続しようとしましたが、何の反応もありません。,ネットワーク
ルーターのインジケーターライトが赤く点滅していますが、その意味がわかりません。,ネットワーク
Wi-Fiネットワークの名前とパスワードを変更したいのですが、設定方法がわかりません。,ネットワーク
パソコンは無線ネットワークに接続できますが、スマートフォンが接続できません。,ネットワーク
天候が悪いとネットワーク接続が不安定になりますが、これは正常な現象でしょうか？,ネットワーク
会社のVPNに接続しようとしましたが、接続が確立できません。,ネットワーク
大きなファイルをダウンロードする際にネットワークエラーが発生し、ダウンロード速度が非常に遅くなりました。,ネットワーク
新しいネットワークカメラを設置しましたが、スマートフォンでのリモートアクセスができません。,ネットワーク
数分ごとにネットワーク接続が切れ、再接続されますが、これはよくある問題でしょうか？,ネットワーク
インターネットサービスプロバイダーを変更しましたが、新しいルーターの設定ができません。,ネットワーク
特定のウェブサイトにアクセスできず、他のウェブサイトは正常にアクセスできます。,ネットワーク
新しいネットワークプリンターを設定しようとしていますが、うまく接続できません。,ネットワーク
プリンターが印刷できなくなりました。エラーメッセージが表示されます。,ハードウェアおよびソフトウェア
キーボードの一部のキーが動作しないようです。修理や交換の方法を教えてください。,ハードウェアおよびソフトウェア
マウスのポインターが勝手に動いて操作ができません。,ハードウェアおよびソフトウェア
パソコンを起動すると、ブルースクリーンエラーが発生します。,ハードウェアおよびソフトウェア
インストールしたアプリケーションが正常に起動しない問題が発生しました。,ハードウェアおよびソフトウェア
ハードドライブが認識されず、ファイルにアクセスできません。,ハードウェアおよびソフトウェア
オペレーティングシステムのアップデートが完了せず、エラーが発生しています。,ハードウェアおよびソフトウェア
パソコンが突然シャットダウンして再起動されます。,ハードウェアおよびソフトウェア
パソコンが動作している間に異常な音が発生します。,ハードウェアおよびソフトウェア
インターネットブラウザがクラッシュし続け、ウェブページにアクセスできません。,ハードウェアおよびソフトウェア
ソフトウェアのライセンスキーが見つからず、アクティベーションができません。,ハードウェアおよびソフトウェア
グラフィックカードのドライバが正しくインストールされていないようです。,ハードウェアおよびソフトウェア
パソコンが起動するまでに非常に長い時間がかかります。,ハードウェアおよびソフトウェア
音声が出力されないため、スピーカーの接続方法を教えてください。,ハードウェアおよびソフトウェア
パソコンの画面が突然フリーズして反応しなくなりました。,ハードウェアおよびソフトウェア
メールアプリケーションで添付ファイルを開けないようです。,ハードウェアおよびソフトウェア
パソコンがウイルスに感染し、不審な動作をしています。,ハードウェアおよびソフトウェア
ワードプロセッサーでドキュメントを編集している最中に、データが消えました。,ハードウェアおよびソフトウェア
パソコンのファンが異常にうるさいです。,ハードウェアおよびソフトウェア
パソコンの電源ボタンが反応せず、起動できません。,ハードウェアおよびソフトウェア
先日、パソコンがクラッシュしてしまい、重要なファイルが失われました。バックアップからデータを復元する方法を教えてください。,バックアップとデータの復旧
ハードドライブが突然故障し、貴重な写真やビジネスドキュメントが消えてしまいました。データを復旧する手段を提案していただけますか？,バックアップとデータの復旧
パソコンがウイルスに感染し、重要なファイルが破損しました。バックアップからデータを回復する方法についてアドバイスをいただきたいです。,バックアップとデータの復旧
新しいソフトウェアのインストール中にエラーが発生し、重要なクライアントデータが失われました。バックアップからデータを復元する手順を案内してください。,バックアップとデータの復旧
ハードドライブが不良セクターを持っており、一部のファイルにアクセスできなくなりました。データの復旧方法やセクターの修復についてアドバイスをいただけますか？,バックアップとデータの復旧
誤ってフォーマットしてしまったUSBドライブから重要な文書が失われました。データを回復するための手順を教えてください。,バックアップとデータの復旧
ランサムウェアによってデータが暗号化されました。バックアップからデータを復元する方法を知りたいです。,バックアップとデータの復旧
パソコンが水濡れしてしまい、重要なファイルがダメージを受けました。データを復旧するための最善の方法を教えてください。,バックアップとデータの復旧
ハードドライブがクラッシュし、全てのデータが失われました。データの復旧が可能かどうか、そして手順について詳しく知りたいです。,バックアップとデータの復旧
バックアップデバイスが故障し、最新のファイルバージョンが失われました。以前のバックアップからデータを復元する方法を案内していただけますか？,バックアップとデータの復旧
パソコンが盗まれ、バックアップデバイスも一緒に失われました。データを復旧する方法やセキュリティ対策についてアドバイスをいただきたいです。,バックアップとデータの復旧
複数のフォルダーが誤って削除され、ゴミ箱も空になってしまいました。削除されたファイルを回復する方法を教えてください。,バックアップとデータの復旧
バックアップデバイスにアクセスできず、最新のファイルがバックアップされていません。データの復元手順やバックアップデバイスのトラブルシューティング方法について教えてください。,バックアップとデータの復旧
ハードドライブが磁気的な問題によりデータを読み取れなくなりました。プロフェッショナルなデータ復旧サービスを利用するべきかどうか、またそれにかかる費用や手続きについてアドバイスをいただきたいです。,バックアップとデータの復旧
バックアップデバイスが突然故障し、最新のファイルのコピーがなくなりました。以前のバックアップからデータを復元する手続きを教えてください。,バックアップとデータの復旧
クラウドストレージサービスからデータが誤って削除されました。データを復元する手順や期間について詳細を知りたいです。,バックアップとデータの復旧
ディスクのセクターが物理的に損傷し、ファイルへのアクセスが制限されました。データ復旧のための専門家への連絡方法を教えてください。,バックアップとデータの復旧
マルウェアによってデータが暗号化されました。復号化の方法や必要なツールについて教えてください。,バックアップとデータの復旧
パソコンが過去のバージョンに戻ってしまい、最新のファイルが失われました。以前のバージョンからデータを復元する手順を教えてください。,バックアップとデータの復旧
外部ハードドライブが転倒してしまい、データへのアクセスができなくなりました。ハードドライブの修復やデータ復旧についてのアドバイスをいただけますか？,バックアップとデータの復旧
パスワードが不正にアクセスされ、アカウントが侵害されました。アカウントのセキュリティを強化するための対策を教えてください。,セキュリティ
不正なメールが届き、添付ファイルを開くとウイルスが感染しました。メールのフィルタリングやスパム対策についてアドバイスをいただきたいです。,セキュリティ
ファイアウォールが正しく設定されていないため、ネットワークへの不正アクセスが検出されました。ファイアウォールの設定方法や最適なセキュリティポリシーについて教えてください。,セキュリティ
ネットワーク上でDDoS攻撃が発生し、サービスの提供が停止しました。DDoS攻撃への対策や復旧方法についてアドバイスをいただきたいです。,セキュリティ
ネットワーク内でマルウェアが検出され、感染の拡大を防ぐために対策が必要です。マルウェア対策ソフトウェアの選定や最新の脅威情報について教えてください。,セキュリティ
社内のネットワークが不正なアクセスによって侵害され、機密情報が漏洩しました。ネットワークのセキュリティ強化についてアドバイスをいただきたいです。,セキュリティ
インターネット上でのプライバシー保護のために、VPN（仮想プライベートネットワーク）の設定方法や利点について教えてください。,セキュリティ
ウイルス対策ソフトウェアが正常に更新されず、最新の脅威から保護されていません。ウイルス対策ソフトウェアの更新手順や定期的なスキャンについて教えてください。,セキュリティ
ワイヤレスネットワークが不正なアクセスポイントによって乗っ取られ、セキュリティが脆弱化しました。ワイヤレスネットワークのセキュリティ設定や暗号化方法についてアドバイスをいただきたいです。,セキュリティ
ストレージデバイスからデータが盗まれ、機密情報が漏洩しました。データの暗号化やストレージのセキュリティ対策について教えてください。,セキュリティ
ネットワーク内で不正なトラフィックが検出され、セキュリティ侵害の兆候があります。不正トラフィックの検出や対策方法についてアドバイスをいただきたいです。,セキュリティ
パスワードが簡単に推測され、アカウントが不正にアクセスされるリスクがあります。強力なパスワードの作成方法や定期的な変更について教えてください。,セキュリティ
ソーシャルエンジニアリングの手法により、社員が機密情報を開示してしまいました。ソーシャルエンジニアリング対策や教育プログラムについてアドバイスをいただきたいです。,セキュリティ
ネットワーク内の脆弱なデバイスが攻撃者によって悪用され、ネットワーク全体のセキュリティが脅かされています。脆弱性管理やパッチ適用の手順について教えてください。,セキュリティ
ユーザーアカウントが不正にアクセスされ、権限の範囲外の操作が行われました。アカウントの二要素認証やアクセス制御の強化方法について教えてください。,セキュリティ
ファイル共有サーバーが不正アクセスを受け、重要な文書が改ざんされました。ファイル共有のセキュリティ設定や監査ログの確認方法についてアドバイスをいただきたいです。,セキュリティ
ネットワーク内で不正なネットワークスキャンが行われ、セキュリティ上の脅威が検出されました。ネットワークスキャンの検出方法や対策手法について教えてください。,セキュリティ
社内のワイヤレスネットワークが不正なアクセスポイントによって乗っ取られ、社員の情報が盗まれました。ワイヤレスネットワークのセキュリティ設定や監視の方法についてアドバイスをいただきたいです。,セキュリティ
ネットワーク上での機密情報の暗号化が不十分で、データの漏洩リスクが高まっています。適切な暗号化手法や鍵管理の方法について教えてください。,セキュリティ
ネットワーク内のセキュリティポリシーが明確ではなく、不正アクセスやデータ漏洩のリスクがあります。セキュリティポリシーの策定や適用方法についてアドバイスをいただきたいです。,セキュリティ
社員が退職したため、アカウントを無効化する手順を教えてください。,アカウントとアクセス権限
新入社員のために、ネットワークアカウントを作成する手続きを教えてください。,アカウントとアクセス権限
アカウントのパスワードが忘れられ、アクセスできなくなりました。パスワードのリセット方法やアカウントの回復手順を教えてください。,アカウントとアクセス権限
アカウントのアクセス権限が不適切で、機密情報へのアクセスが制限されていません。アクセス権限の管理や特権アカウントの設定方法についてアドバイスをいただきたいです。,アカウントとアクセス権限
アカウントがハッキングされ、不正なアクティビティが行われました。アカウントのセキュリティ強化や不正アクティビティの検出方法について教えてください。,アカウントとアクセス権限
パートナー企業の従業員に対して、一時的なアクセス権限を与える手順を教えてください。,アカウントとアクセス権限
ユーザーアカウントがロックされており、誤ったパスワードの入力が原因です。アカウントのロック解除手順やパスワードポリシーについて教えてください。,アカウントとアクセス権限
重要なデータにアクセス権限を持つユーザーが退職したため、アクセス権限の変更手順を教えてください。,アカウントとアクセス権限
アカウントの2要素認証の設定方法や利点について教えてください。,アカウントとアクセス権限
グループアカウントのパスワードが共有され、アクセス権限の管理が困難になりました。グループアカウントの適切な使用とパスワードの安全性についてアドバイスをいただきたいです。,アカウントとアクセス権限
ネットワーク内で不正なアカウントが検出され、セキュリティ上の脅威となっています。アカウントの監視や不正アクティビティの検出方法について教えてください。,アカウントとアクセス権限
アカウントの権限レベルが適切に設定されておらず、機密データへのアクセスが制限されていません。アカウント権限の設定やアクセス制御の強化方法についてアドバイスをいただきたいです。,アカウントとアクセス権限
アカウントが不正に使用され、社内のシステムへの侵入が発生しました。アカウントの不正利用の検出と防止策について教えてください。,アカウントとアクセス権限
外部ベンダーに対して一時的なアカウントを提供する必要があります。一時アカウントの作成と削除手順を教えてください。,アカウントとアクセス権限
アカウントのパスワードが定期的に変更されず、セキュリティ上のリスクがあります。パスワードポリシーの設定と変更の促進方法について教えてください。,アカウントとアクセス権限
アカウントが乗っ取られ、社内のシステムで不正な操作が行われました。アカウントのセキュリティ強化と不正アクティビティの検出方法についてアドバイスをいただきたいです。,アカウントとアクセス権限
ユーザーアカウントのログイン履歴を確認する方法やログインアクティビティの監視について教えてください。,アカウントとアクセス権限
退職した従業員のアカウントがまだアクティブであり、セキュリティ上のリスクとなっています。アカウントの無効化手順や適切なアカウント管理についてアドバイスをいただきたいです。,アカウントとアクセス権限
アカウントのパスワードが漏洩し、アカウントが不正にアクセスされるリスクがあります。パスワードの保護とセキュリティ強化のためのベストプラクティスについて教えてください。,アカウントとアクセス権限
アカウントのアクセス権限が不適切に与えられ、機密情報へのアクセスが制限されていません。アクセス権限の管理と適切なアクセスポリシーの策定についてアドバイスをいただきたいです。,アカウントとアクセス権限
```
#### 3-2. Watson StudioでのJupyter Notebookの準備

Watson Studioの資産タブに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/babfa70e-d2c2-8510-d6de-3fc7fed1c620.png)

右にある「このプロジェクトのデータ」の下にあるエリアに、先程、作成した「sample_data.csv」ファイルをドラッグ・アンド・ドロップして、データをアップロードし、すべての資産の欄に表示されることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/5e30cd78-b57e-a6a8-16af-c1672f97fab8.png)

上部の「管理」タブから、左の「アクセス制限」を選択し、「アクセス・トークン」タブを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/b9f7662b-4ba1-0116-6eef-9b9f2116d598.png)

青い「新規アクセス・トークン」を押し、以下を入れて「作成」を押します。
名前：「NLP」（任意）を入力
アクセス・ロール：「Editor」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/ac9f6471-2bc0-a017-81ba-a7a3b7a3dece.png)

資産タブに戻り、青い「新規資産」ボタンを押して、コード・エディターから「Jupyter ノートブック・エディター」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/47182833-b395-2d39-fe94-71edb9bb9473.png)

名前に「カスタム分類」（任意）と入力し、右のランタイムの選択で「NLP+ DO Runtime 23.1 on Python 3.10 XS (2 vCPU 8 GB RAM）」を選択し、「作成」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/a29c3a6d-cb84-163e-f9b4-cdb58f236abf.png)

これで、Jupyter NotebookとNLPライブラリを利用する準備ができました。

### ステップ4： Jupyter Notebookの環境で、NLPを使ってカスタム分類を実行する

#### 4-1. プロジェクト資産へのアクセスに必要な環境の読み込み
初めに、このNotebook（pythonプログラム）から、プロジェクト資産にアクセスできるよう、上のメニューの「︙」より、「プロジェクト・トークンの挿入」を選択して、初期Pythonコードを挿入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/d6b60d5a-30b6-02fe-8ced-129243756cb7.png)

In[]: に挿入されたコードのセルを選択し、上部にある「▶Run」ボタンで実行します。
正常に実行されるとIn[1]という形で[]に数字が入り、次のセルに移ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/db8887e7-9d2f-900c-bbdb-aafb8a7e3ec8.png)

ここからは、この記事のコードをコピーし、In[]フィールドにペーストをしてから、「▶Run」を押して、進めていきます。

#### 4-2. 必要ライブラリー／モジュールなどの取り込み
今回利用するWatson NLPの各種ライブラリーをインポートします。
「▶Run」を押した後、[*]が数字に変わるまで少しお待ち下さい。
In:[2]
```
# 必要なライブラリーのインポート
import watson_nlp
from watson_nlp import data_model as dm
import json
import pandas as pd
pd.options.display.max_colwidth = 400
import warnings
warnings.filterwarnings("ignore")
from watson_core.data_model.streams.resolver import DataStreamResolver
from watson_nlp.blocks.classification.svm import SVM
from watson_nlp.workflows.classification.base_classifier import UseSvm
from watson_nlp.workflows.classification.base_classifier import TFidfSvm
from watson_nlp.workflows.classification.base_classifier import GloveCNN
from watson_nlp.workflows.classification import GenericEnsemble
```

#### 4-3. アップロードしたCSVファイルの読み込み／データの内容の確認
3-2で資産にアップロードしたcsvファイルのデータを読み込みます。
In:[3]
```
# サンプルデータのロード
sample_text = project.get_file('sample_data.csv')
text_df = pd.read_csv(sample_text,encoding="utf-8")
text_col = 'コンテンツ'

# データのロードの成功を確認
text_df.head()
```
Out:[3]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/0c7fc73d-56d2-ed89-fd37-bff77d55ce82.png)
読み込んだデータの先頭5行が正しく確認できました。

#### 4-4. 読み込んだデータの数の確認
読み込んだデータの量を確認します。
In:[4]
```
# ロードデータの各分類の種類と数を確認
text_df['分類'].value_counts()
```
Out:[4]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/15dd7d0c-0eb7-fc90-b2ea-8370df82b162.png)
各カテゴリー毎に20件ずつ、計100件のデータが確認できました。

#### 4-5. サンプルデータの学習データとテストデータへの分割
サンプルデータを学習用データとテスト用データに８：２の割合で分割し、それぞれのデータ数を確認します。
In:[5]
```
# 80%の学習データを抽出
train_orig_df = text_df.groupby('分類').sample(frac=0.8, random_state=6)
print("学習データ:")
print("学習サンプル数: {}".format(len(train_orig_df)))
print("分類:\n{}".format(train_orig_df['分類'].value_counts()))

# 学習データを削除した残り20%をテストデータに
test_orig_df = text_df.drop(train_orig_df.index)
print("\nテストデータ:")
print("テストサンプル数: {}".format(len(test_orig_df)))
print("分類:\n{}".format(test_orig_df['分類'].value_counts()))

# インデックス（配列）の再編成
train_orig_df = train_orig_df.reset_index(drop=True)
test_orig_df = test_orig_df.reset_index(drop=True)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/f9b12f3a-00b4-1557-b1b5-3698a08959ab.png)
学習データとテストデータで、それぞれのデータフレームを作成できました。

#### 4-6. 利用データのJSONへの変換
配列データを Watson NLP 分類アルゴリズムで使用できるJSON または CSV の形式に変換する必要があります。
このサンプルでは、JSON 形式でデータを作成し、学習データとテストデータをファイルに書き込みます。
In:[6]
```
# 利用データをJSON形式に変換しファイルに書き込む
def prepare_data(df):
    df_out = df[['コンテンツ','分類']].reset_index(drop=True).rename(columns={"コンテンツ": "text", '分類': 'labels'})
    df_out['labels'] = df_out['labels'].map(lambda label: [label])
    return df_out
    
train_df = prepare_data(train_orig_df)
train_file = './train_data.json'
train_df.to_json(train_file, orient='records')
    
test_df = prepare_data(test_orig_df)
test_file = './test_data.json'
test_df.to_json(test_file, orient='records')

# JSON形式のテストデータを確認
with open('./test_data.json', 'r', encoding='utf-8') as file:
    test_data = json.load(file)
print(json.dumps(test_data, indent=2, ensure_ascii=False))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/3c88a29b-aac0-9460-fdce-a788775cb7f5.png)
テストデータを読み出して、JSON形式で正しく保存できていることが確認できました。

#### 4-7. モデル学習の準備
各種分類モデルを学習するためのデータやストリームの準備をします。
In:[7]
```
# 構文モデルと各種モデルのロード
syntax_model = watson_nlp.load('syntax_izumo_ja_stock')
use_embedding_model = watson_nlp.load('embedding_use_multi_small')
glove_embedding_model = watson_nlp.load('embedding_glove_ja_stock')

# 学習データの準備
training_data_file = train_file
data_stream_resolver = DataStreamResolver(target_stream_type=list, expected_keys={'text': str, 'labels': list})
training_data = data_stream_resolver.as_data_stream(train_file)

# 構文ストリームの作成
text_stream = training_data[0]
labels_stream = training_data[1]
syntax_stream = syntax_model.stream(text_stream)
use_train_stream = use_embedding_model.stream(syntax_stream, doc_embed_style='raw_text')
use_svm_train_stream = watson_nlp.data_model.DataStream.zip(use_train_stream, labels_stream)
```

#### 4-8. USE SVMモデルの学習
USE SVMモデルを学習します。
In:[8]
```
# USE SVM モデルを学習する
use_svm_model = UseSvm.train(
    training_data=training_data,
    syntax_model=syntax_model, 
    use_embedding_model=use_embedding_model,
    use_svm_epochs=30,
    multi_label=False
    )
```

#### 4-9. TF-IDF SVMモデルの学習
TF-IDF SVMモデルを学習します。
In:[9]
```
# TF-IDF SVM モデルを学習する
tfidf_svm_model = TFidfSvm.train(
    training_data=training_data,
    syntax_model=syntax_model,
    tfidf_svm_epochs=30,                      
    multi_label=False
    )
```

#### 4-10. CNNモデルの学習
CNNモデルを学習します。
In:[10]
```
# GloveCNN分類モデルを学習する
glove_cnn_model = GloveCNN.train(
    training_data=training_data,
    syntax_model=syntax_model, 
    glove_embedding_model=glove_embedding_model,
    cnn_epochs=30,
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/a7b4c2de-a91b-81b2-f50c-49484ca3e185.png)
　　　　　　　　　　　　　　　：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/84f6c4d9-6c43-fef1-d25d-651df07052e4.png)

#### 4-11. アンサンブル分類モデルの学習
アンサンブル分類モデルは、以下の異なる分類モデルを組み合わせて、最適な分類を実行できるモデルです。
・CNN with Glove embeddings
・SVM with USE (Universal Sentence Encoder) features
・SVM with TF-IDF (Term Frequency–Inverse Document Frequency) features
今回は、この３つのモデルを組み合わせたアンサンブルモデルを学習します。
In:[11]
```
def build_file_streams(file_name):
    '''Build a stream with text/labels to be used with the ensemble classifier.'''
    data_stream = dm.DataStream.from_json_array(file_name)
    text_stream = data_stream.map(lambda item: item['text'])
    labels_stream = data_stream.map(lambda item: item['labels'])
    return text_stream, labels_stream

train_stream = dm.DataStream.zip(*build_file_streams(training_data_file))
print(len(train_stream), 'train sequences')

errors = GenericEnsemble.validate_training_data(train_stream)
if len(errors) == 0:
    print('学習用データに検証エラーは見つかりませんでした。')
else:
    errors = [str(e) for e in errors]
    print('学習用データで次のエラーが見つかりました:')
    print(*errors, sep='\n')

# 基本分類器と重みを定義し、アンサンブルモデルの分類器を学習する
ensemble_model = GenericEnsemble.train(
    train_stream,
    syntax_model,
    base_classifiers_params=[
        TFidfSvm.TrainParams(syntax_model=syntax_model, tfidf_svm_epochs=30),
        UseSvm.TrainParams(syntax_model=syntax_model, use_embedding_model=use_embedding_model, use_svm_epochs=30),
        GloveCNN.TrainParams(syntax_model=syntax_model, glove_embedding_model=glove_embedding_model, cnn_epochs=30)
        ],
    use_ewl=True
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/ddab2e87-232d-1f29-e91a-165191da5179.png)
　　　　　　　　　　　　　　　：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/cd11d340-0257-4903-9a8d-929a374296f0.png)
これで、３つのモデルを組み合わせた、アンサンブルモデルが学習できました。

#### 4-12. テストデータを使ったモデル検証
4-5で分割していた（学習モデルの生成用には使わなかった）テスト用のデータを、改めて学習済みのモデルに適用し、元の正解データである、「分類」の列と、各モデルにより分類（推計）されたの列の内容を比べて、それぞれの精度を確認します。
In:[12]
```
def predict_type(text):
    tfidf_svm_preds = tfidf_svm_model.run(text)
    predicted_tfidf_svm = tfidf_svm_preds.to_dict()["classes"][0]["class_name"]

    use_svm_preds = use_svm_model.run(text)
    predicted_use_svm = use_svm_preds.to_dict()["classes"][0]["class_name"]
    
    glove_cnn_preds = glove_cnn_model.run(text)
    predicted_glove_cnn = glove_cnn_preds.to_dict()["classes"][0]["class_name"]
    
    ensemble_preds = ensemble_model.run(text)
    predicted_ensemble = ensemble_preds.to_dict()["classes"][0]["class_name"]
    return (predicted_tfidf_svm, predicted_use_svm, predicted_glove_cnn, predicted_ensemble)

predictions = test_orig_df[text_col].apply(lambda text: predict_type(text))
predictions_df = pd.DataFrame.from_records(predictions, columns=('tfidf_svm','use_svm','glove_cnn','ensemble'))

result_df = test_orig_df[[text_col, "分類"]].merge(predictions_df, how='left', left_index=True, right_index=True)
result_df
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/7f38fa22-709d-9179-068f-18ebc63009a8.png)

Out:[12]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/2a423c5e-bbdc-0f98-c12c-c63e248a1f52.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/1e039a8e-58e4-5ed8-0548-85e10fb2d42d.png)

今回の例では、20個のテストデータの内、TF-IDF SVMモデルは17個、USE SVMモデルは19個、CNNモデルは18個、アンサンブルモデルが19個正しく分類されました。


以上で、Jupyter Notebook上にて、Watson NLPのライブラリーを使い、4つの分類モデルで学習モデルを生成し、テストデータで精度の比較検証を行う、前編の手順は終了となります。

お疲れ様でした！

---

なお、最後に、もう1ステップ、後編でご紹介予定である、ローカルPCでのWatson Libraryを使った検証を実施される方の為の手順を追加しておきます。

#### 4-X. 学習モデルのアセットへの保存とローカルPCへのダウンロード
今回のモデル学習・検証の結果として、一番精度の高かった、カスタム分類学習済みアンサンブルモデルを保存します。
以下のコードを実行します。（実行に少し時間がかかります）
In:[13]
```
project.save_data('my_ensemble_model', data=ensemble_model.as_file_like_object(), overwrite=True)
```
Out:[13]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/6ddbb82e-a9d6-6482-bfa9-75d022b59480.png)

画面上部のメニューから「Watson NLP Library」を押して、プロジェクト選択の画面に戻ります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/7e034007-7dce-8c57-8bc1-bf3077546072.png" width=50%>

資産タブのすべての資産のリストに「my_ensemble_model」ができているのを確認し、「︙」から「ダウンロード」を選択して、後編で利用するローカルPCに保存しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355635/e13afe8e-2054-8052-694b-35faa248a000.png)
3-1で作成した、csvファイルも利用しますので、合わせて保存しておいてください。


## 終わりに

今回は、カスタマーサービスのユースケースなどを想定し、お客様からの問い合わせ内容を、自社独自でのカテゴリーにて、カスタム分類を実施する事を目指し、Watson StudioのJupyter Notebook上で、Watson NLPを使える環境を用意して、様々な言語モデルを使って、分類を実施する手順例をご紹介いたしました。
後編の記事では、今回学習・ダウンロードしたアンサンブルモデルを使って、クラウド環境を使わずに、ローカルのPCで、カスタム分類を実行する方法について、ご紹介いたします。
よろしければ、また、実施頂ければと存じます。

なお、今回作成したPythonのコードは、試行段階のレベルのものなので、まだ工夫の余地がありますし、Watson NLP Libraryを使った、自然言語処理機能の活用については、様々な可能性があります。

今回の内容を応用し、ドキュメント（ https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/watson-nlp.html?context=wx&locale=ja ） なども参考にして頂きながら、例えば、もう少し大きなサイズの異なる言語モデル（例：Slateモデル）などを使った分析などもぜひ試してみてください。

また、これを入り口として、さらにWatson Libraryの活用を進めながら、昨今、注目されている、大規模言語モデルの活用なども含めて、ビジネスでAIの活用を進めて頂く上での、第一歩としていただけると幸いです。

---
以下、記事後編に続く
当記事執筆時点（2023年12月）では、QiitaのTOPリンクにしてあります。

https://qiita.com/