前回のpart.1に引き続き、テキストマイニングの活用としてpythonを用いてスパムフィルタリングを行ってみます。
前回は、畳み込みニューラルネットワークを用いて分類モデルを定義し、スパムか否かを判断するモデルを構築し確認してみました。
今回part.2では、SVM(support vector machine:SVM)を用いてみます。
データは、part.1と同じ【SMS Spam Collection Dataset】を使用します。このデータは、メール文章とその文章が迷惑メールか否かを示す情報の組で構成されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# テキストデータ前処理用のライブラリの読み込み import pandas as pd import numpy as np import re import codecs # データのベクトル化、学習用のライブラリ読み込み from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split # テキスト前処理定義 def proc_preprocess(raw_text): conv_text = [] # HTML形式のドキュメントのノイズ除去 for sentence in raw_text: # タグ情報除去 sentence = re.compile(r'<[^>]+>').sub('', sentence) # a~z, A~Z以外の要素を除去 sentence = re.sub('[^a-zA-Z]', ' ', sentence) # 1文字だけの要素を削除 sentence = re.sub(r'\s+[a-zA-Z]\s+', ' ', sentence) # 重複するスペース削除 sentence = re.sub(r'\s+', ' ', sentence) conv_text.append(sentence) return conv_text # SMSデータ読み込み with codecs.open("SMSSpamCollection.csv", mode="r", encoding="utf-8", errors="ignore") as file: df = pd.read_table(file, delimiter="\t", header=None) df.column = ['y_data', 'x_data'] df = df.rename(columns={0:'y_data', 1:'x_data'}) df.head(10) |
機械学習できる形に加工します。各文章をtfidfにより重み付けを行いベクトル表現に変換します。
tf-idfは、文書中に含まれる単語の重要度を評価する手法の1つであり、主に情報検索やトピック分析などの分野で用いられている。(wikipediaより抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 学習データ、評価データ準備 x_train = proc_preprocess(df['x_data']) vectorizer = TfidfVectorizer(min_df=5, max_df=0.8, sublinear_tf=True, use_idf=True) x_train = vectorizer.fit_transform(x_train) # 教師データ数値変換 1:spam,0;ham y_train = df['y_data'] y_train = np.array(list(map(lambda x:1 if x=='spam' else 0, y_train))) # 学習データと評価データに分割 x_train, x_test, y_train, y_test = train_test_split(x_train, y_train, test_size=0.2) |
これでデータの準備ができました。
続いて、SVMのモデル定義をしていきます。
1 2 3 4 5 6 7 |
from sklearn import svm from sklearn.metrics import classification_report, accuracy_score # 線形SVMモデル定義、学習開始 model = svm.SVC(kernel='linear') model.fit(x_train, y_train) |
これでSVMモデルの定義が完了しました。
さっそく、モデルの評価をしてみます。
1 2 3 4 5 6 7 8 9 10 11 |
# 学習結果 predict_result = model.predict(x_test) score = classification_report(y_test, predict_result, output_dict=True) print('spam:1 ', score['1']) print('ham:0 ', score['0']) score = accuracy_score(y_test, predict_result) print('accuracy:', score) print(predict_result[0:10]) print(y_test[0:10]) |
テストデータの先頭10個のデータを学習したモデルで予測した結果を見ると、一応すべて正解しているみたいです。また、モデルの評価結果も中々良さげ?ですね。
最後に、テキストマイニングの分野においても、昨今ではpython等の優れた環境がすでに提供されていますので、企業、個人のビジネスに活用してみましょう。