テキスト分類問題 scikit-learn

テキスト分類問題

scikit-learnを使用してテキスト分類問題を解決します。

ここでは、映画レビューのテキストを肯定的なレビューと否定的なレビューに分類する問題を解決します。

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
import numpy as np
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score, confusion_matrix
import nltk
from nltk.corpus import movie_reviews

# 映画レビューデータセットを読み込む
nltk.download('movie_reviews')
reviews = [movie_reviews.raw(fileid) for fileid in movie_reviews.fileids()]

# レビューの肯定的/否定的なラベルを作成
labels = [1 if fileid.split('/')[0] == 'pos' else 0 for fileid in movie_reviews.fileids()]

# TF-IDFベクトル化を使用してテキストデータを数値データに変換
tfidf_vectorizer = TfidfVectorizer(max_features=5000)
X = tfidf_vectorizer.fit_transform(reviews)

# データをトレーニングセットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.3, random_state=42)

# サポートベクトルマシン(SVM)を使った分類器を訓練
clf = LinearSVC()
clf.fit(X_train, y_train)

# テストデータで予測
y_pred = clf.predict(X_test)

# 精度を計算
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

このコードでは、映画レビューのテキストをTF-IDFベクトル化して、サポートベクトルマシン(SVM)を使用して肯定的なレビューと否定的なレビューに分類しています。

精度を計算してモデルの性能を評価します。

[実行結果]

1
2
3
[nltk_data] Downloading package movie_reviews to /root/nltk_data...
[nltk_data] Unzipping corpora/movie_reviews.zip.
Accuracy: 0.8183333333333334

Accuracy0.8183であることから、このモデルは比較的高い精度を持っていると言えます。

ソースコード解説

このソースコードは、映画レビューのテキストデータを分類するために、サポートベクトルマシン(SVM)を使用する機械学習モデルを構築します。

以下では、各部分を詳細に説明します。

  1. ライブラリのインポート:

    • numpy: 数値計算用のPythonライブラリ。
    • matplotlib.pyplot: データの可視化のためのライブラリ。
    • TfidfVectorizer: テキストデータを数値データに変換するためのTF-IDFベクトル化を提供するscikit-learnのクラス。
    • train_test_split: データセットをトレーニングセットとテストセットに分割するための関数。
    • LinearSVC: 線形サポートベクトルマシン(SVM)分類器を提供するscikit-learnのクラス。
    • accuracy_score: 分類の精度を計算するための関数。
    • confusion_matrix: 混同行列(分類の評価指標の一部)を計算するための関数。
    • nltk: Natural Language Toolkit(自然言語処理のライブラリ)。
    • movie_reviews: NLTKに含まれる映画レビューのコーパス。
  2. 映画レビューデータセットの読み込み:

    • nltk.download('movie_reviews'): NLTKから映画レビューデータセットをダウンロードするためのコマンド。
    • reviews: 映画レビューのテキストを格納するリストを作成します。
  3. レビューの肯定的/否定的なラベルの作成:

    • labels: レビューテキストのファイルIDから肯定的(’pos’)または否定的(’neg’)なラベルを作成するためのリスト。
      このデータセットでは、フォルダ構造を利用してラベルを決定しています。
  4. TF-IDFベクトル化:

    • TfidfVectorizer: テキストデータをTF-IDF(Term Frequency-Inverse Document Frequency)ベクトル化するためのオブジェクトを作成します。
      TF-IDFは、テキスト内の単語の重要性を示すための方法で、各単語をベクトルで表現します。
    • max_features=5000: ベクトルの次元数を制限し、最も頻出の単語トークンのみを選択します。
  5. データのトレーニングセットとテストセットへの分割:

    • train_test_split: データセットをトレーニングセットとテストセットに分割します。
      test_size=0.3は、テストセットの割合を設定しています。
  6. サポートベクトルマシン(SVM)モデルのトレーニング:

    • LinearSVC(): 線形SVM分類器のインスタンスを作成します。
    • fit(): トレーニングデータを使用してモデルをトレーニングします。
  7. テストデータでの予測:

    • predict(): テストデータを使用してクラスの予測を行います。
  8. 精度の計算:

    • accuracy_score(): テストデータに対する予測の精度を計算します。
  9. 精度の表示:

    • print("Accuracy:", accuracy): 精度をコンソールに表示します。

このコードは、テキストデータの前処理、機械学習モデルのトレーニング評価をすべて含んでおり、映画レビューの肯定的/否定的な分類タスクを解決するための完全なワークフローを提供しています。