【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/c8963c01-c923-8746-69f0-d1868d08ca3f.png)

* 実行結果例（Raw TLA output）
テキストデータに含まれるワードが「コンセプト」と「タイプ」のペアで分析された結果を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/0cdf4d09-7b69-f0c2-5319-607d6d2ac321.png)

* 実行結果例（Positive/Negative）
コメントごとにポジティブな内容とネガティブな内容が含まれている数をカウントした結果を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/543ed1db-6a7f-3d1a-f198-b8290bddf312.png)


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

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

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

https://qiita.com/TTS22/items/5c00b53a473737586be4


# 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 Link Analysis」という名前で作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/cf3b4cd0-0bf4-67c1-fcb8-8d57209cad3e.png)

# 5. 「テキスト・リンク分析」ノードを使用したテキスト分析
ここでは2つのブランチ・ターミナル・ノードを作成します。

* Raw TLA Output
テキストデータに含まれるワードが「コンセプト」と「タイプ」のペアで分析された結果を確認できます。
* Positive/Negative
コメントごとにポジティブな内容とネガティブな内容が含まれている数をカウントした結果を確認できます。

## 5-1. Raw TLA Output

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. 「テキスト・リンク分析」ノードを追加し、「データ資産」ノードと接続後、設定画面を表示します。IDフィールドに「id」、テキストフィールドに「Comments」、「リソースの選択 ＋」から「Hotel Satisfaction (Japanese)」を指定して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/c2d1eb79-cd24-6d80-b4b4-1ea3e07e9bee.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/858e706e-c294-d0df-2914-6e9c20b374f0.png)

3. 「置換」ノードを追加し、「テキスト・リンク分析」ノードと接続後、設定画面を開きます。対象フィールドに「id」、置換に「常時」、置換文字列に「to_integer(@FIELD)」を指定して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/41c158c8-1552-e8ee-1f06-7f3352e2abc0.png)

4. 「タイプ」ノードを追加し、「置換」ノードと接続後、設定画面を開きます。「値の読み込み」をクリックし、値が読み込まれたら保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/df09ab91-6dad-41d5-354a-960caae654c1.png)

5. 「フィルター」ノードを追加し、「タイプ」ノードと接続後、設定画面を開きます。「コンセプト5」から「条件規則名」までの入力フィールドをフィルターして保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/8202b456-526b-34ec-d46d-da10fcbd77fd.png)

6. 「ソート」ノードを追加し、「フィルター」ノードと接続後、設定画面を開きます。ソート順に「id」「昇順」を指定して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/bb044249-e39c-94c0-ea6c-3b9f66a3477c.png)

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

8. 以下のストリームができたら実行して表の出力を確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/011e7e01-3cd0-f3a7-2134-6b390993265e.png)

9. テキストデータに含まれるワードが「コンセプト」と「タイプ」のペアで分析されていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/0cdf4d09-7b69-f0c2-5319-607d6d2ac321.png)

## 5-2. Positive/Negative

1. 最初に追加した「データ資産」ノード（hotelSatisfaction_japanese.xlsx）をコピーして貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/934577d0-6200-e98f-3818-92abc06025b9.png)

2. 「マージ」ノードを追加し、直前に追加した「データ資産」ノードと「5-1. Raw TLA Output」のブランチで追加した「タイプ」ノードと接続後、設定画面を開きます。マージ法に「キー」、キーに「id」を指定して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/2f0c2053-fb77-f9b6-4d58-92b69619036c.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/7efe736f-a7af-adbf-20b5-6d2fff05d318.png)

3. 「置換」ノードを追加し、「マージ」ノードと接続後、設定画面を開きます。対象フィールドに「タイプ1」と「タイプ2」、置換に「常時」、置換文字列に以下の式を指定して保存します。
    ```:置換文字列
    if @FIELD matches 'Positive*' then 1
    elseif @FIELD matches 'Negative*' or 
    @FIELD = 'NO' or @FIELD = 'Contextual' or @FIELD = 'Suggestion' then -1
    else 0
    endif
    ```

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/69ea7542-132c-c7b6-b691-15898b12ea9c.png)

4. 「フィールド順序」ノードを追加し、「置換」ノードと接続後、設定画面を開きます。最後に配置するフィールドに「コンセプト1」「コンセプト2」「タイプ1」「タイプ2」の順になるように設定して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/78c6560a-2c64-6da0-8f3d-8aa988f3c734.png)

5. 「フィールド作成」ノードを追加し、「フィールド順序」ノードと接続後、設定画面を開きます。派生フィールド名に「sentiment_sum」、式に以下の式を指定して保存します。
    ```:式
    sum_n(@FIELDS_BETWEEN('タイプ1','タイプ2'))
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/5f748646-1c47-696b-c790-b8a3c0bba467.png)

6. 「フィールド作成」ノードを追加し、直前に追加した「フィールド作成」ノードと接続後、設定画面を開きます。派生フィールド名に「Pos_Count」、派生に「条件付き」、Ifに以下の式、「Then 値は次に等しい」に「1」、「Else 値は次に等しい」に「0」を指定して保存します。
    ```:If
    sentiment_sum > 0
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/c458aa26-59fb-5524-2232-5f6966c59c32.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/57c5cc46-3c0a-8fd9-cf4d-071af239900c.png)

7. 「フィールド作成」ノードを追加し、直前に追加した「フィールド作成」ノードと接続後、設定画面を開きます。派生フィールド名に「Neg_Count」、派生に「条件付き」、Ifに以下の式、「Then 値は次に等しい」に「1」、「Else 値は次に等しい」に「0」を指定して保存します。
    ```:If
    sentiment_sum < 0
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/0ea20532-442c-67d5-35d5-0699c62f41e8.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/e7f63912-05c5-ef6c-b408-b0c799ffd4b6.png)

8. 「レコード集計」ノードを追加し、「フィールド作成」ノードと接続後、設定画面を開きます。キー・フィールドに「id」と「Comments」、集計フィールドに「Pos_Count」と「Neg_Count」(集計操作は「Sum」）、「レコード・カウントを含める」のチェックを外して保存します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/5d87caff-aaff-0aeb-fdc8-65d665714031.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/3057b03e-e391-2897-89ab-2a91b100c311.png)

9. 「表」ノードを追加し、「レコード集計」ノードと接続後、設定画面を開きます。名前に「Positive/Negative」を指定して保存します。

10. 以下のストリームができたら「Positive/Negative」ノードを選択してストリームを実行し、表の出力を確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/c8963c01-c923-8746-69f0-d1868d08ca3f.png)

11. コメントごとにポジティブな内容とネガティブな内容が含まれている数をカウントした結果が出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492427/543ed1db-6a7f-3d1a-f198-b8290bddf312.png)

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