SPSS Modelerのスタンドアロンスクリプト(clemb)で日本語を扱う方法
概要
SPSS Modelerのスタンドアロンスクリプトはclembコマンドを使用してバッチ実行できますが、スクリプト内に日本語が含まれていると、デフォルトの設定では文字化けが発生し、正常に動作しません。本記事では、Windows環境でclembスクリプト内の日本語を正しく処理する方法を解説します。
検証環境
- OS: Windows 11
- SPSS Modeler: 19.0
サンプル
問題の原因
日本語文字列の文字化けが発生する主な原因は以下の2点です:
-
Python 2系の文字列処理
- ModelerスクリプトはJythonを使っているためPython 2.7を使用
- Python 2系では、文字列リテラルはデフォルトでバイト文字列(str型)として扱われる
- 日本語などのマルチバイト文字を正しく処理するには、ユニコード文字列(unicode型)として明示的に指定する必要がある
- そのため、
u""プレフィックスが必須(Python 3系では文字列がデフォルトでUnicodeのため不要)
-
Windows環境のエンコーディング設定
- clembコマンドは内部でJavaを使用
- 日本語Windows環境ではデフォルトの文字エンコーディングがShift_JISやCP932に設定されている
- UTF-8で記述された日本語文字列が正しく解釈されず、文字化けが発生
- macOS/Linux環境ではデフォルトでUTF-8が使用されるため、この問題は発生しない
つまり、Python 2系を使用している限り、すべての環境で手順1(ユニコードプレフィックス)が必要であり、加えてWindows環境では手順2と3のエンコーディング設定も必要になります。
解決方法
以下の3つの手順で日本語を正しく処理できます。
手順1: Pythonスクリプト内の日本語文字列にユニコードプレフィックスを付ける
ModelerスクリプトはPython 2.7を使用しているため、日本語文字列にはユニコードプレフィックスu""を付ける必要があります。
注意: Python 3系では文字列がデフォルトでUnicodeのため、このプレフィックスは不要です。
# 例: ノード名に日本語を使用する場合
typenode = stream.createAt("type", u"フィールド定義", 250, 100)
# 例: ファイルパスに日本語を使用する場合
input_file = u"C:\\データ\\tree_credit_ja.csv"
# 例: print文で日本語を出力する場合
print u"ストリームが正常に作成されました"
手順2: PythonファイルをUTF-8エンコーディングで保存
スクリプトファイルを必ずUTF-8エンコーディングで保存してください。
ノートパッドでの保存方法:
手順3: バッチファイルでエンコーディングを設定(Windows環境のみ)
clembコマンドを実行する前に、コマンドプロンプトとJavaのエンコーディングをUTF-8に設定します。
注意: この手順はWindows環境でのみ必要です。macOS/Linux環境では、デフォルトでUTF-8が使用されるため不要です。
REM コマンドプロンプトの文字コードページをUTF-8に変更(エラー出力を抑制)
chcp 65001 >nul 2>&1
REM Java実行時のエンコーディング設定を環境変数で指定
REM - file.encoding: ファイル入出力のデフォルトエンコーディング
REM - client.encoding.override: クライアント側のエンコーディングを強制
REM - sun.jnu.encoding: ファイル名などのJNI(Java Native Interface)のエンコーディング
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Dclient.encoding.override=UTF-8 -Dsun.jnu.encoding=UTF-8
REM スタンドアロンスクリプトの実行
"C:\Program Files\IBM\SPSS\Modeler\19.0\bin\clemb.exe" -script "credit_model_ja2.py" -execute -log "clemb.log"
動作検証
以下のサンプルスクリプトで動作を確認します。このスクリプトはtree_credit_ja.csvを読み込み、データ型ノードをつなぐストリームを作成します。
サンプルスクリプト(credit_model_ja2.py)
# 信用予測モデルのためのSPSS Modelerスクリプト
# 新しいストリームを作成
stream = modeler.script.stream()
# 入力ファイルパスを定義
input_file = u"C:\\temp6\\tree_credit_ja.csv"
# 可変ファイルノード(CSV入力)を作成
varfilenode = stream.createAt("variablefile", "file", 100, 100)
varfilenode.setPropertyValue("full_filename", input_file)
varfilenode.setPropertyValue("encoding", "UTF-8")
# フィールドメタデータを定義するためのタイプノードを作成
# ノード名に日本語を使用(ユニコードプレフィックス u"" を使用)
typenode = stream.createAt("type", u"フィールド定義", 250, 100)
# 可変ファイルノードをタイプノードにリンク
stream.link(varfilenode, typenode)
# ストリームを保存
output_stream_path = u"C:\\temp6\\credit_model_stream.str"
session = modeler.script.session()
taskrunner = session.getTaskRunner()
taskrunner.saveStreamToFile(stream, output_stream_path)
# 日本語メッセージを出力(ユニコードプレフィックス u"" を使用)
print u"ストリームが正常に作成され、保存されました: " + output_stream_path
検証1: エンコーディング設定なしで実行(失敗例)
エンコーディング設定を行わずに実行すると、すべての日本語文字列(print文の出力、ノード名など)が文字化けします。
REM エンコーディング設定をコメントアウト
REM chcp 65001 >nul 2>&1
REM set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Dclient.encoding.override=UTF-8 -Dsun.jnu.encoding=UTF-8
REM スタンドアロンスクリプトの実行
"C:\Program Files\IBM\SPSS\Modeler\19.0\bin\clemb.exe" -script "credit_model_ja2.py" -execute -log "clemb.log"
実行結果(print u"ストリームが正常に作成され、保存されました: "で文字化け発生):
C:\temp6>"C:\Program Files\IBM\SPSS\Modeler\19.0\bin\clemb.exe" -script "credit_model_ja2.py" -execute -log "clemb.log"
郢ァ・ケ郢晏現ホ懃ケ晢スシ郢晢ソス邵コ譴ァ・ュ・」陝カ・ク邵コ・ォ闖エ諛茨ソス闊鯉シ・ケァ蠕鯉ソス竏ス・ソ譎擾スュ蛟・・・ケァ蠕娯穐邵コ蜉ア笳・ C:\temp6\credit_model_stream.str
typenode = stream.createAt("type", u"フィールド定義", 250, 100)で定義したノード名も正しく表示されません。
検証2: エンコーディング設定ありで実行(成功例)
手順3のエンコーディング設定を行って実行すると、日本語が正しく処理されます。
REM コマンドプロンプトの文字コードページをUTF-8に変更
chcp 65001 >nul 2>&1
REM Java実行時のエンコーディング設定を環境変数で指定
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Dclient.encoding.override=UTF-8 -Dsun.jnu.encoding=UTF-8
REM スタンドアロンスクリプトの実行
"C:\Program Files\IBM\SPSS\Modeler\19.0\bin\clemb.exe" -script "credit_model_ja2.py" -execute -log "clemb.log"
実行結果(正常動作):
C:\temp6>"C:\Program Files\IBM\SPSS\Modeler\19.0\bin\clemb.exe" -script "credit_model_ja2.py" -execute -log "clemb.log"
ストリームが正常に作成され、保存されました: C:\temp6\credit_model_stream.str
ノード名「フィールド定義」も正しく表示されました。
トラブルシューティング
問題: 設定後も文字化けが発生する
原因と対処法:
-
Pythonファイルのエンコーディングを確認
- ファイルが本当にUTF-8で保存されているか確認
- BOM付きUTF-8ではなく、BOMなしUTF-8で保存
-
ユニコードプレフィックスの確認
- すべての日本語文字列に
u""が付いているか確認 - 特にprint文、ファイルパス、ノード名を重点的にチェック
- すべての日本語文字列に
-
環境変数の設定を確認
- バッチファイル内で
set JAVA_TOOL_OPTIONSが正しく設定されているか確認 - コマンドプロンプトで
echo %JAVA_TOOL_OPTIONS%を実行して確認
- バッチファイル内で
問題: clembコマンドが見つからない
対処法:
- SPSS Modelerのインストールパスを確認
- パスが異なる場合は、バッチファイル内のパスを修正
- 例:
"C:\Program Files\IBM\SPSS\Modeler\19.0\bin\clemb.exe"
問題: ログファイルにエラーが記録される
対処法:
-
clemb.logファイルを確認してエラー内容を特定 - ファイルパスの区切り文字は
\\(バックスラッシュ2つ)を使用 - ファイルの存在確認とアクセス権限を確認
まとめ
SPSS ModelerのclembコマンドでWindows環境において日本語を正しく処理するには、以下の3つの手順が必要です:
-
Python 2.7のユニコードプレフィックス: すべての日本語文字列に
u""を付ける - UTF-8エンコーディング: スクリプトファイルをUTF-8で保存
- 実行環境の設定(Windows環境のみ): コマンドプロンプトとJavaのエンコーディングをUTF-8に設定
これらの設定により、ノード名、ファイルパス、print文の出力など、スクリプト内のすべての日本語が正しく処理されます。
環境別の必要な手順:
- Windows環境: 手順1、2、3のすべてが必要
- macOS/Linux環境: 手順1のみ必要(手順2と3は通常不要、デフォルトでUTF-8が使用されるため)


