SPSS Modelerのテキスト分析のチュートリアル③テキストリンク分析

# はじめに
SPSS Modeler Premium 18.6では日本語テキスト分析が可能になっています。

テキスト分析については[ModelerFlowのチュートリアル](https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_ta_hotel.html?locale=ja&context=cpdaas&audience=wdp&audience=wdp)と@TTS22 さんの[日本語解説記事](https://qiita.com/TTS22/items/54118ea550e34486ea73)がありますので、この内容をオンプレ版のModelerで実行してみます。

３つの記事からなっています。

[①インタラクティブ・ワークベンチ](https://qiita.com/spssfun2017/items/1f9e8af832ca19a90b35)
[②カテゴリーのフラグ化](https://qiita.com/spssfun2017/items/3e73f13a7ab1e12541b5)
③テキストリンク分析（←この記事）


■テスト環境
* Modeler Premium 18.6
* Windows 11 64bit

# テストデータ
@TTS22 さんが翻訳してくれたホテルの満足度調査のデータを使います。
Comments列にテキストデータが入っています。820件あります。
![{F9DA5B8D-38EC-44FD-9CD7-8AD26AFEA503}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/de7236a2-96c9-ba25-9ba1-02b2c0bfcdbe.png)


# テキストリンク分析
「IBM SPSS Text Analytics」のパレットから「テキストリンク分析」のノードを接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/86cd2308-1649-1438-d343-9c49f3c3622e.png)


まず、フィールドのタブで以下を選択します。
IDフィールド：`id`
テキストフィールド：`Comments`

「リソーステンプレート」で「読み込み」をクリックし、「HotelSatisfaction (Japanese)」を選んで「OK」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c868788e-3c81-0649-bc1d-567e3ef63bb6.png)

こんな結果が返ります。「HotelSatisfaction (Japanese)」のリソーステンプレートの中で定義されている「条件規則」に基づいて、「コンセプト」とその「タイプ」抜き出します。「条件規則」がテキストの中のどこにマッチしたかは「マッチテキスト」にあらわされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4872e6a6-ea1c-50ab-1c74-4a4976b366be.png)

テキストリンク分析の結果は、ちょっと読みにくい点があるので少し加工します。
まずidが文字列型になってしまうので、to_integer(id)で整数にし、順番をそろえるためにソートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7dc82b26-27fd-6956-c4f7-62bbd6aea8ab.png)

次にデータ型ノードで値を読み込んでいます。
これによって「コンセプト５－６」、「タイプ５－６」にはNULLしか入っていないことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/221b1915-dd5b-bcea-977a-b6797f731fbe.png)

そのためフィルターノードで、「コンセプト５－６」、「タイプ５－６」は除去します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7446b23b-5408-43dd-fc1f-08225ee8b77a.png)

テキストリンク分析ではオリジナルのテキストの列がなくなってしまうので、ソースファイルを「レコード結合」ノードで結合していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/816158f7-f766-f097-faec-87eb4c040297.png)

「フィールド順序」ノードで、フィールド順を整えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/12d06176-623c-5fcb-49b6-ecac7ea5814b.png)

あらためて分析結果をみてみると、「Comments」から「条件規則名」でマッチした結果が「マッチテキスト」にあり、各「コンセプト」「タイプ」が抜き出されています。なお、マッチした条件規則毎に行がありますので、同じコメントに対して複数の行が返っています。なお、コンセプトの定義がないものもUncertainタイプに割り当てられるので全ての行が戻されています。
![{9B342BE9-96F0-4AD7-9A73-6B30647F23DE}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/56d77748-8111-9817-cb9c-2bad503cfbd1.png)


# センチメント分析
このテキストリンク分析ではPositiveかNegativeかの「タイプ」分類ができているので、センチメント分析をしてみます。

まず置換ノードで「タイプ１－２」の列に「Positive」があったら「１」を立て、
「Negative」「NO」「Contextual」「Suggestion」があったら「-１]を立て、
いずれにも該当しなければ「0」を入れていきます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f6856680-a0b8-13b2-b0cd-0bd4f03861d8.png)

```java
if @FIELD matches 'Positive*' then 1
elseif @FIELD matches 'Negative*' or 
@FIELD = 'NO' or @FIELD = 'Contextual' or @FIELD = 'Suggestion' then -1
else 0
endif
```
なお、本来は「タイプ３－４」にも「Positive」などのセンチメントをあらわす「タイプ」が入りうるのですが、今回はデータ型ノードで「Positive」などがはいっていないことが確認できているので、省略しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5df5bae0-9875-4aed-3588-80e8f171c8c7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/16caed4a-9b35-d215-1caa-9556d5573f1c.png)

プレビューすると以下のように「タイプ１－２」がセンチメントの「1」か「0」の値に置き換えられています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/35636050-362f-98e4-455c-7d1fa411c9ed.png)

この「タイプ１－２」を足し算して、合計が正の値になるとPos＿Count「１」、負の値になった場合にNeg_count「１」を立てています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ddc00a69-8162-41dd-d47f-cdf7318d14a5.png)

「レコード集計」でコメント毎にポジティブとネガティブの合計件数を出しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4a3a342a-63d0-7c02-7ece-1914e82a00e3.png)

結果は以下のようになりました。各コメントに対してポジティブ/ネガティブなコンセプトが何個あったかが算出できました。
![{4EFE28BD-BF69-488A-B80D-DE6E892D5B5E}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f162568a-0d46-981a-36b6-02336ddce1d5.png)

# まとめ

テキストリンク分析はちょっと癖のある出力で、カテゴリ出力するモデルを作った方が使い勝手はよさそうだと思いますが、「コンセプト」や「タイプ」を値として取り出すことができ、この例のようにセンチメント分析なども可能です。

# サンプル
#### サンプルストリーム
https://github.com/hkwd/spsssample/raw/refs/heads/master/241227TA_HotelSatisfaction/15%20-%20Hotel%20SatisfactionTLA3SAJA.str


#### サンプルデータ
https://github.com/hkwd/spsssample/blob/master/241227TA_HotelSatisfaction/hotelSatisfaction_japanese.csv

# 参考

#### ホテル満足度のテキスト分析 - Docs | IBM Cloud Pak for Data as a Service 

https://dataplatform.cloud.ibm.com/docs/content/wsd/tutorials/tut_ta_hotel.html?locale=ja&context=cpdaas&audience=wdp&audience=wdp

#### 【CP4DaaS】SPSS ModelerのText Analyticsで日本語テキストデータを分析する （テキスト・リンク分析） #ibmcloud - Qiita 
https://qiita.com/TTS22/items/54118ea550e34486ea73