SPSS Modelerでのテキストマイニング 形態素解析編
こんにちは
前回の感情分析編からの続きです。今回は、Mecabによる形態素解析をやってみます。
Modelerでのjanomeによる形態素解析はすでにIBMブログにありますので、そちらも参考してみてください。
1. さっそく形態素解析をやっていく
まずは、Mecabのインストールをお願いします。準備編で説明しています。
①. ストリーム全体
前回の感情分析ストリームとほぼ同じです。感情分析を実施する拡張ノードが形態素解析を実施するものになっただけです。
②. データ入力処理
前回と入力データも、サンプリングも同じです。そのまま流用してください。
③. 形態素解析処理
こちらも前回と同様に「拡張の変換ノード + Pythonシンタックス」で実装します。
a. コード全体
#------------------------------------------------------
# ライブラリ定義
#------------------------------------------------------
# Modeler用ライブラリ
import modelerpy
# 形態素解析用 MeCab - 事前にインストールしておくこと
import MeCab
# Pandas - 事前にインストールしておくこと
import pandas as pd
# MeCabのTaggerを作成(chasen辞書を指定)
mecab = MeCab.Tagger("-Ochasen")
#----------------------------------------------------
# 形態素解析用関数
#----------------------------------------------------
def mecab_parse(text):
# mecabで形態素解析を実行
parsed_text = mecab.parse(text)
# 結果を行ごとに分割
lines = parsed_text.splitlines()
# 最後のEOF行を除外
lines = [line for line in lines if line != 'EOS']
# 結果をリストに変換
results = []
for line in lines:
# 各行をタブで分割してリストに変換
parts = line.split("\t")
# タブ区切りの要素が正しく含まれているか確認
if len(parts) >= 4:
surface = parts[0] # 表層形
base = parts[2] # 原形
pos = parts[3] # 品詞
results.append((surface, base, pos))
#結果を戻す
return results
#-------------------------------------------------------
# 出力用データ定義処理
#-------------------------------------------------------
if modelerpy.isComputeDataModelOnly():
#データモデル取得
modelerDataModel = modelerpy.getDataModel()
#--------------------------------------------------------------
#出力用変数フィールドを追加
#--------------------------------------------------------------
#データモデルにフィールドを追加
#形態素解析アウトプット用のフィール定義
field_name_1 = "表層形"
field_name_2 = "原形"
field_name_3 = "品詞"
#データモデルの設定
modelerDataModel.addField(modelerpy.Field(field_name_1, "string", measure="nominal"))
modelerDataModel.addField(modelerpy.Field(field_name_2, "string", measure="nominal"))
modelerDataModel.addField(modelerpy.Field(field_name_3, "string", measure="nominal"))
#出力データモデル定義
modelerpy.setOutputDataModel(modelerDataModel)
#-------------------------------------------------------
# 形態素解析処理
#-------------------------------------------------------
else:
#入力データ取得
modelerData = modelerpy.readPandasDataframe()
#-------------------------------------------------------
# 形態素解析処理実行
#-------------------------------------------------------
# DataFrameの「Sentence」カラムに対して形態素解析を実行し、解析結果を追加
modelerData['parsed'] = modelerData['Sentence'].apply(mecab_parse)
#-------------------------------------------------------
# 形態素解析処理結果をまとめる
#-------------------------------------------------------
# parsed列を縦持ちにする(リストを展開する)
inputData_exploded =modelerData.explode('parsed')
# parsed列を「表層形」「原形」「品詞」に分割
inputData_exploded[['表層形', '原形', '品詞']] = pd.DataFrame(inputData_exploded['parsed'].tolist(), index=inputData_exploded.index)
# 不要なカラムを削除
inputData_exploded = inputData_exploded.drop(columns=['parsed'])
#-------------------------------------------------------
# Modelerへデータを戻す
#-------------------------------------------------------
modelerpy.writePandasDataframe(inputData_exploded)
b. コード詳細
さて処理別にコードの内容をみていきましょう。
b-1. ライブラリインポート部分
まずは必要なライブラリをインポートしているだけです。
事前に準備の記事を参考にライブラリを導入しましょう。
また、Tagger()メソッドで、MeCabの解析機能を持つオブジェクトを作成しています。
これを使ってテキスト解析します。
#------------------------------------------------------
# ライブラリ定義
#------------------------------------------------------
# Modeler用ライブラリ
import modelerpy
# 形態素解析用 MeCab - 事前にインストールしておくこと
import MeCab
# Pandas - 事前にインストールしておくこと
import pandas as pd
# MeCabのTaggerを作成(chasen辞書を指定)
mecab = MeCab.Tagger("-Ochasen")
b-2. 形態素解析関数部分
ここでは、形態素解析処理を関数化しています。
関数名 : mecab_parse
入力 : text = 文字列データ
出力 : result = 表層系、原形、品詞をリスト化した結果データ
#----------------------------------------------------
# 形態素解析用関数
#----------------------------------------------------
def mecab_parse(text):
# mecabで形態素解析を実行
parsed_text = mecab.parse(text)
# 結果を行ごとに分割
lines = parsed_text.splitlines()
# 最後のEOF行を除外
lines = [line for line in lines if line != 'EOS']
# 結果をリストに変換
results = []
for line in lines:
# 各行をタブで分割してリストに変換
parts = line.split("\t")
# タブ区切りの要素が正しく含まれているか確認
if len(parts) >= 4:
surface = parts[0] # 表層形
base = parts[2] # 原形
pos = parts[3] # 品詞
results.append((surface, base, pos))
#結果を戻す
return results
さらに詳細をみていきます。
最初に、mecabのparse関数で形態素解析を実行します。
# mecabで形態素解析を実行
parsed_text = mecab.parse(text)
形態素解析の結果を行ごとに分割、EOF行を削除します。
# 結果を行ごとに分割
lines = parsed_text.splitlines()
# 最後のEOF行を除外
lines = [line for line in lines if line != 'EOS']
各行ごとのデータはタブ区切りデータとなっているので、
タブで分割して各項目を取得してリストに追加します。
for line in lines:
# 各行をタブで分割してリストに変換
parts = line.split("\t")
# タブ区切りの要素が正しく含まれているか確認
if len(parts) >= 4:
surface = parts[0] # 表層形
base = parts[2] # 原形
pos = parts[3] # 品詞
results.append((surface, base, pos))
最後、結果を戻します。
#結果を戻す
return results
b-3. データモデル定義処理
前回と同様にまずは、データモデル定義を行います。
今回は、表層形、原形、品詞のフィールドを追加定義します。
#-------------------------------------------------------
# 出力用データ定義処理
#-------------------------------------------------------
if modelerpy.isComputeDataModelOnly():
#データモデル取得
modelerDataModel = modelerpy.getDataModel()
#--------------------------------------------------------------
#出力用変数フィールドを追加
#--------------------------------------------------------------
#データモデルにフィールドを追加
#形態素解析アウトプット用のフィール定義
field_name_1 = "表層形"
field_name_2 = "原形"
field_name_3 = "品詞"
#データモデルの設定
modelerDataModel.addField(modelerpy.Field(field_name_1, "string", measure="nominal"))
modelerDataModel.addField(modelerpy.Field(field_name_2, "string", measure="nominal"))
modelerDataModel.addField(modelerpy.Field(field_name_3, "string", measure="nominal"))
#出力データモデル定義
modelerpy.setOutputDataModel(modelerDataModel)
b-4. 形態素解析処理
さて、本題の形態素解析処理をelseパートで記述します。
#-------------------------------------------------------
# 形態素解析処理
#-------------------------------------------------------
else:
#入力データ取得
modelerData = modelerpy.readPandasDataframe()
#-------------------------------------------------------
# 形態素解析処理実行
#-------------------------------------------------------
# DataFrameの「Sentence」カラムに対して形態素解析を実行し、解析結果を追加
modelerData['parsed'] = modelerData['Sentence'].apply(mecab_parse)
#-------------------------------------------------------
# 形態素解析処理結果をまとめる
#-------------------------------------------------------
# parsed列を縦持ちにする(リストを展開する)
inputData_exploded = modelerData.explode('parsed')
# parsed列を「表層形」「原形」「品詞」に分割
inputData_exploded[['表層形', '原形', '品詞']] = pd.DataFrame(inputData_exploded['parsed'].tolist(), index=inputData_exploded.index)
# 不要なカラムを削除
inputData_exploded = inputData_exploded.drop(columns=['parsed'])
#-------------------------------------------------------
# Modelerへデータを戻す
#-------------------------------------------------------
modelerpy.writePandasDataframe(inputData_exploded)
まずは、Modelerからデータを入力。readPandasDataframe()を使用してPandasデータフレームで読み込みができます。
#入力データ取得
modelerData = modelerpy.readPandasDataframe()
先述した関数を呼び出して形態素解析を実行します。
結果は'parsed'カラムにリスト形式で受け取ります。
#-------------------------------------------------------
# 形態素解析処理実行
#-------------------------------------------------------
# DataFrameの「Sentence」カラムに対して形態素解析を実行し、解析結果を追加
inputData['parsed'] = modelerData['Sentence'].apply(mecab_parse)
形態素解析結果の単語リストデータを縦持ちに展開します。
また、各単語ごとにさらに表層形、原形、品詞をカラムに展開しておきます。
これは、後々Modelerでフラグ設定ノードをはじめデータ加工や分析で利用したいので、この形式にしています。
#-------------------------------------------------------
# 形態素解析処理結果をまとめる
#-------------------------------------------------------
# parsed列を縦持ちにする(リストを展開する)
inputData_exploded = modelerData.explode('parsed')
# parsed列を「表層形」「原形」「品詞」に分割
inputData_exploded[['表層形', '原形', '品詞']] = pd.DataFrame(inputData_exploded['parsed'].tolist(), index=inputData_exploded.index)
# 不要なカラムを削除
inputData_exploded = inputData_exploded.drop(columns=['parsed'])
最後にデータをModelerに戻します。
#-------------------------------------------------------
# Modelerへデータを戻す
#-------------------------------------------------------
modelerpy.writePandasDataframe(inputData_exploded)
④. 結果の確認
結果は、下記画像の通りになります。
各テキスト毎に形態素解析して縦持ちにしたのは、このフォーマットにするためです。
Modelerのユーザーであれば、フラグ設定ノード等を利用して、ここから様々な分析に活用できることが想像できると思います。
2. まとめ
前回と今回の2回に分けてModelerでの日本語テキストマイニングの方法をご紹介しました。テキストマイニングに関してはノードでの日本語サポートは終了していますが、拡張ノードを利用することで、GoogleのBERTなど最新の技術をすぐに利用して分析が実施できるので、チャレンジしてみてください。
10/17 追記
v18.4以前のユーザーさんでも参考になるように「Python for Spark」での記事も書きました。
3. 次回
さて次回は、感情分析・形態素解析の結果をModelerで活用してみようと思います。
ワードクラウドやアソシエーションモデルをご紹介します。
参考
SPSS Modeler ノードリファレンス目次
SPSS Modeler 逆引きストリーム集
SPSS funさん記事集
SPSS連載ブログバックナンバー
SPSSヒモトクブログ