【CP4DaaS】SPSS ModelerのText Analyticsで日本語テキストデータを分析する （テキスト・マイニング）

# 1. はじめに
IBM Cloud Pak for Data as a Service（CP4DaaS）のSPSS Modelerにはテキストデータ分析を行うノードが提供されています。これまでは日本語に対応していませんでしたが、2024年10月9日の新機能により日本語のテキストデータにも対応しました。

:::note info
[SPSS ModelerのText Analyticsで日本語テキストデータを分析する](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/whats-new.html?context=cpdaas&audience=wdp#analyze-japanese-text-data-in-spss-modeler-with-text-analytics)
:::

SPSS Modelerの「テキスト分析」カテゴリーには以下の3つのノードが含まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/c60d190f-9073-991b-dead-e079a5faee60.png)

| ノード | 説明 | 
|:-----------|:------------|
| 言語の識別子 | ソース・データ内のテキスト・フィールドの自然言語を識別します。 | 
| テキスト・リンク分析 | 既知のパターンに基づいてテキスト・データのコンセプト間の関連性を特定します。 | 
| テキスト・マイニング | テキストから主要なコンセプトを抽出し、これらのコンセプトとその他のデータを使用してカテゴリーを作成します。 | 

製品ドキュメントにテキスト分析のチュートリアルとして[ホテル満足度のテキスト分析](https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_ta_hotel.html?locale=ja&context=cpdaas&audience=wdp&audience=wdp "ホテル満足度のテキスト分析")
が提供されています。

このチュートリアルで使用しているストリームやテキスト・データはリソース・ハブの[SPSS Modeler project](https://dataplatform.cloud.ibm.com/exchange/public/entry/view/39047aede50128e7cbc8ea1966003034?context=cpdaas "SPSS Modeler project")に含まれていますが、英語のテキストを使用しています。
（CP4DaaSにログインすると画面右上のリンクからプロジェクトをダウンロードできます。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/8daee387-74cc-d125-b3d2-8b6ec86b1b92.png)

この記事ではチュートリアルと同様の方法で、「**テキスト・マイニング**」ノードを使用して日本語のテキストを分析する手順を記載します。

* 作成するストリーム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/eca5b258-972b-0ebd-3511-6e0e974b44c0.png)

* 実行結果例（Sentiment）
コメントごとにポジティブかネガティブかの評価を表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/7aca2565-f325-d903-4f74-7f2b3815ba56.png)

* 実行結果例（ポジティブ_ワードクラウド）
ポジティブな評価のカテゴリーをワードクラウドで可視化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/bbdb4328-319a-5ce0-a659-84e21ede3317.png)

* 実行結果例（ネガティブ_ワードクラウド）
ネガティブな評価のカテゴリーをワードクラウドで可視化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/9a30d6c3-8537-6180-c839-b92fe40bc582.png)

使用する日本語テキストデータと作成するSPSSストリームのサンプルはこちらからダウンロードできます。

https://github.com/3BA-FVDNFF/2024_4Q_TextAnalytics/tree/main/TextMining

なお「**テキスト・リンク分析**」ノードを使用した手順は別の記事で記載しています。

https://qiita.com/TTS22/items/54118ea550e34486ea73

# 2. プロジェクトの作成
最初にwatsonx.ai Studioのプロジェクトを作成します。
リソース・ハブで提供されているプロジェクトをインポートするか、新規に空のプロジェクトを作成します。

# 3. 日本語テキストデータの準備
リソース・ハブからダウンロードしたプロジェクトに含まれるテキストデータを日本語化します。対象のファイルは「hotelSatisfaction.xlsx」です。
820件のホテルの満足度に関する文章が含まれますが、機会翻訳サービス等を使用してヘッダー行以外を日本語に翻訳します。
以下は翻訳後のデータ例です。ここでは「hotelSatisfaction_japanese.xlsx」として保存し、プロジェクトにアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/73c60ded-a8c1-5e21-2678-9a900c1293b2.png)

# 4. SPSS Modelerストリームの作成
プロジェクトにSPSS Modelerストリームを作成します。
ここでは「Hotel Satisfaction Text Mining」という名前で作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/a62583ee-a576-a8ac-54ed-c2cd1fb8d919.png)

# 5. 「テキスト・マイニング」ノードを使用したテキスト分析

ここでは以下のブランチ・ターミナル・ノードを作成します。
* Sentiment
コメントごとにポジティブかネガティブかの評価を表示します。
* ポジティブ_ワードクラウド
ポジティブな評価のカテゴリーをワードクラウドで可視化します。
* ネガティブ_ワードクラウド
ネガティブな評価のカテゴリーをワードクラウドで可視化します。

## 5-1. Sentiment

1. 作成したSPSS Modelerストリームを開きます。
「データ資産」ノードを追加し、日本語テキストデータ（hotelSatisfaction_japanese.xlsx）を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/1e299730-8629-2f41-3be2-2af2a8f79343.png)

2. 「タイプ」ノードを追加し、「データ資産」ノードと接続後、設定画面を開きます。「値の読み込み」をクリックし、値が読み込まれたら保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/ccd20186-88f3-cf58-8cde-77424dccdc69.png)

3. 「テキスト・マイニング」ノードを追加し、「タイプ」ノードと接続後、設定画面を表示します。テキストフィールドに「Comments」、IDフィールドに「id」、「リソースの選択 ＋」から「テキスト分析パッケージ」タブで「Hotel Satisfaction (Japanese)」を指定して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/29642334-265c-473a-9dbc-98fedc2e318d.png)

4. 「テキスト・マイニング」ノード（前の手順により「Comments」という名前になっています。）を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/a5098bf6-9d5c-36fd-ea4d-0348b98e6fb5.png)

5. 出力された「Comments」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/dbe8d1f1-4ef9-86fd-b283-bd7beab6b1b8.png)

6. テキスト分析ワークベンチが起動します。この機能を使用して抽出された結果の微調整が行えますが、ここではデフォルトのまま、画面右上の「モデルの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/422c82db-5ea8-155b-e512-9f869dc5e3db.png)

7. 「ビルド」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/952d8f51-811b-32c4-2ef5-f183096d0127.png)

8. 「フローに戻る」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/2bc01b27-3ace-0188-58e3-efb3543c43a8.png)

9. 「保存して終了」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/c285e5a8-646e-d1fb-b9bc-d0d31af7c854.png)

10. 「Comments」というモデル・ナゲットが作成されました。モデル・ナゲットをダブルクリックし設定画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/cadbcb44-41b5-379d-eadb-9dc5ae99904b.png)

11. 「設定」セクションを開き、スコアリング・モードに「フィールドとして」が選択されていることを確認し、True値に「1」、False値に「0」を設定し保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/adf58ce8-7052-c7c7-77e2-93fa49f4782b.png)

12. 「フィールド作成」ノードを追加し、「Comments」モデル・ナゲットと接続後、設定画面を表示します。派生フィールド名に「Neg」、式に以下の式を指定して保存します。
    ```:式
    sum_n(@FIELDS_MATCHING("Category_*Neg"))
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/d38350c1-1b03-fb6c-2542-256d1e571eac.png)

13. 「フィールド作成」ノードを追加し、前の手順の「フィールド作成」ノードと接続後、設定画面を表示します。派生フィールド名に「Pos」、式に以下の式を指定して保存します。
    ```:式
    sum_n(@FIELDS_MATCHING("Category_*Pos"))
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/00da60a8-3a72-f530-6f6d-944b62652a49.png)

14. 「フィールド作成」ノードを追加し、前の手順の「フィールド作成」ノードと接続後、設定画面を表示します。派生フィールド名に「Sentiment」、派生と尺度に「名義」を設定し、「値の構成 +」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/a0ab0d9f-9405-f3d9-d09f-17801f8aa4d1.png)

15. 「値の追加 +」をクリックし、以下の通りフィールド設定値と値の設定条件を入力した後、「OK」をクリックします。

    | フィールド設定値 | 値の設定条件(真の場合に値を設定) | 
    |:-----------|:------------|
    | "no score" | Neg =0 and Pos=0 | 
    | "positive" | Neg=0 and Pos>0 | 
    | "negative" | Neg > 0 and Pos=0 | 
    | "mixed" | Pos > 0 and Neg > 0 | 

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/6983fbcf-df89-9982-831e-4a416623c62e.png)

16. 「保存」をクリックします。
17. 「フィルター」ノードを追加し、「フィールド作成」ノードと接続後、設定画面を開きます。先頭に「Category_」がある入力フィールドをフィルターし、それ以外（id、Comments、Gender、Reason、Neg、Pos、Sentiment）を残し、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/eb711520-a228-84d4-b692-a28f2eb0d67c.png)

18. 「ソート」ノードを追加し、「フィルター」ノードと接続後、設定画面を開きます。ソート順に「id」「昇順」を指定し、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/1f0d4edf-0abe-c2a6-18dd-133575d85b15.png)

19. 「表」ノードを追加し、「ソート」ノードと接続後、設定画面を開きます。名前に「Sentiment」を指定して保存します。

20. 以下のストリームができたら「Sentiment」ノードを選択してストリームを実行し、表の出力を確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/9b2176c0-5332-f671-f864-66393579bd29.png)

21. コメントごとにネガティブ（Neg）な内容の数、ポジティブ（Pos）な内容の数、Sentimentが出力されています。Sentimentは「フィールド作成」ノード（Sentiment）に設定した条件（例：Neg=0 and Pos>0 の場合、"positive"）で判断された結果を示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/7aca2565-f325-d903-4f74-7f2b3815ba56.png)

## 5-2. ポジティブ_ワードクラウド / ネガティブ_ワードクラウド
ここでは別のモデル・ナゲットを追加して、ワードクラウドを表示するためのブランチ・ターミナル・ノードを作成します。
またテキスト分析ワークベンチを使用して、デフォルトでは英語になっているカテゴリー名を日本語に変更する手順も合わせて記載します。

1. 「テキスト・マイニング」ノード（Comments）を選択し、ストリームを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/6cc2565a-18fe-9022-e4aa-e66b719893cd.png)

2. 出力された「Comments」をクリックし、テキスト分析ワークベンチを起動します。
3. 「カテゴリー」タブを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/c171d3b4-c735-a1d2-6272-803716fcdad4.png)

4. カテゴリーから「Comfort」を選択し、「カテゴリ」メニューから「カテゴリー名の変更」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/4989bea0-a929-8803-2721-4a26694616fc.png)

5. 「快適さ」に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/f9162394-1573-e620-7f62-10c12e44115c.png)

6. 「快適さ」を展開し、「Size」も同様の手順で日本語に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/46b2fc5f-2e9e-5d54-f80a-0b3a1d6c0e07.png)

7. その他のカテゴリーとサブカテゴリー（Pos、Neg以外）も同様に日本語に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/7d51643e-1fd7-6ab6-3698-8d4b0579cd21.png)

8. 画面右上の「モデルの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/b16a26d3-038b-6f33-3154-0df4571cacfe.png)

9. 「ビルド」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/952d8f51-811b-32c4-2ef5-f183096d0127.png)

10. 「フローに戻る」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/2bc01b27-3ace-0188-58e3-efb3543c43a8.png)

11. 「保存して終了」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/c285e5a8-646e-d1fb-b9bc-d0d31af7c854.png)

12. 「Comments」というモデル・ナゲットが新しく追加されました。モデル・ナゲットをダブルクリックし設定画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/655795b0-01f9-80a7-cfe9-17f9c8e08843.png)

13. カテゴリーが日本語になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/736b31d1-d7fc-4938-0a9e-95b0c441272a.png)

14. 「設定」セクションを開き、スコアリング・モードに「レコードとして」を選択し、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/5f55c768-8e45-7b9a-d078-37d7f9bc094e.png)

15. 「フィールド作成」ノードを追加し、「Comments」モデル・ナゲットと接続後、設定画面を表示します。派生フィールド名に「Sentiment」、派生と尺度に「名義」を設定し、「値の構成 +」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/067ea606-41c5-c977-c935-69e5f533ba54.png)

16. 「値の追加 +」をクリックし、以下の通り「フィールド設定値」と「値の設定条件」を入力した後、「OK」をクリックします。
    | フィールド設定値 | 値の設定条件(真の場合に値を設定) | 
    |:-----------|:------------|
    | Neg | Category matches "*/Neg" | 
    | Pos | Category matches "*/Pos" | 

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/cffa4582-8f21-e58b-a328-92d008d586ff.png)

17. 「保存」をクリックします。

18. 「置換」ノードを追加し、「フィールド作成」ノードと接続後、設定画面を表示します。ノード名を「Pos」、対象フィールドに「Category」、置換に「常時」、置換文字列に以下の式を設定し保存します。
    ```:置換文字列
    replace('/Pos','',@FIELD)
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/85a9fcbb-012f-dd36-10d7-cea6aa1a982f.png)

19. 「置換」ノードを追加し、前の手順の「置換」ノード（Pos）と接続後、設定画面を表示します。ノード名を「Neg」、対象フィールドに「Category」、置換に「常時」、置換文字列に以下の式を設定し保存します。
    ```:置換文字列
    replace('/Neg','',@FIELD)
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/c9b4deab-9f1a-655a-368f-426ae350a6f0.png)

20. 「条件抽出」ノードを追加し、「置換」ノード（Neg）と接続後、設定画面を表示します。名前に「ポジティブ」、条件に以下の式を設定し保存します。
    ```:条件
    Sentiment = "Pos"
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/53b6c1e4-d539-d17e-61a5-d1dd41b9bf01.png)


21. 「条件抽出」ノードを追加し、「置換」ノード（Neg）と接続後、設定画面を表示します。名前に「ネガティブ」、条件に以下の式を設定し保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/4ea8ef1c-2091-7b25-59b9-ba47d0ea1a0b.png)

    ```:条件
    Sentiment = "Neg"
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/405d58c7-3c74-3467-4c71-6ea689062d83.png)

22. 「グラフ」ノードを追加し、「条件抽出」ノード（ポジティブ）と接続後、設定画面を表示します。名前を「ポジティブ_ワードクラウド」に設定し、「図表ビルダーの起動」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/a3168fb3-2847-0d59-544c-017b2390b253.png)

23. グラフタイプに「ワードクラウド」を選択し、ソースに「Category」を選択します。ワードクラウドが表示されることを確認し、画面右上の「グラフ定義の追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/effa4ae2-5aed-a1ba-b6a4-a4e8af4ea3b7.png)

24. 「フローに戻る」をクリックした後、「グラフ」ノードを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/875606c4-1e1b-0ceb-45a6-c1d2e149c71c.png)

25. 「グラフ」ノードを追加し、「条件抽出」ノード（ネガティブ）と接続後、設定画面を表示します。名前を「ネガティブ_ワードクラウド」に設定し、「図表ビルダーの起動」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/b33e5b73-a97c-126d-ab43-85fe1eb3264d.png)

26. グラフタイプに「ワードクラウド」を選択し、ソースに「Category」を選択します。ワードクラウドが表示されることを確認し、画面右上の「グラフ定義の追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/8642c4c9-ce9c-e8b2-3ce5-b1a4a784ad4d.png)

27. 「フローに戻る」をクリックした後、「グラフ」ノードを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/5bc32308-75ce-b4ff-e258-75301b41a2b9.png)

28. 以下のストリームができたら「ポジティブ_ワードクラウド」ノードと「ネガティブ_ワードクラウド」ノードをそれぞれ選択してストリームを実行し、表の出力を確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/eca5b258-972b-0ebd-3511-6e0e974b44c0.png)

29. 「ポジティブ_ワードクラウド」ノードの表示例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/bbdb4328-319a-5ce0-a659-84e21ede3317.png)

30. 「ネガティブ_ワードクラウド」ノードの表示例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/9a30d6c3-8537-6180-c839-b92fe40bc582.png)


# おことわり
:::note warn
このサイトの掲載内容は私自身の見解であり、必ずしも所属会社の立場、戦略、意見を代表するものではありません。 記事は執筆時点の情報を元に書いているため、必ずしも最新情報であるとはかぎりません。 記事の内容の正確性には責任を負いません。自己責任で実行してください。
:::