前回のおさらいと今回のテーマ
こんにちは!前回は、FastTextの概要について学びました。FastTextはサブワード情報を活用することで、未知の単語や語形変化にも対応できる単語埋め込み手法であり、特に文書分類や機械翻訳で有用な技術です。
今回は、具体的な実装を通じてニュース記事のカテゴリ分類モデルを構築する方法を解説します。文書分類は、与えられたテキストがどのカテゴリに属するかを予測するタスクで、ニュース記事のジャンル分けやスパムメールのフィルタリングなど、さまざまな応用があります。この記事では、文書分類モデルをPythonで実装し、実際にニュース記事のカテゴリ分類を行う方法を紹介します。
文書分類の概要
1. 文書分類とは?
文書分類とは、テキストデータをあらかじめ定められたカテゴリに分類するタスクです。機械学習や自然言語処理(NLP)の分野で広く使われる手法であり、ニュース記事のジャンル分け、感情分析、スパムメール検出など、実生活の多くの場面で応用されています。
2. 分類の流れ
文書分類を行う際の一般的な流れは以下の通りです。
- データの収集:分類するためのテキストデータを収集します。
- データの前処理:トークナイゼーションやストップワードの除去など、テキストデータを解析しやすい形式に整えます。
- 特徴量の抽出:BoW、TF-IDF、単語埋め込み(Word2Vec、FastTextなど)を使って、テキストを数値ベクトルに変換します。
- モデルの構築:分類器(ロジスティック回帰、サポートベクターマシン、ニューラルネットワークなど)を学習させます。
- モデルの評価:精度、再現率、F1スコアなどを用いてモデルの性能を評価します。
ニュース記事のカテゴリ分類モデルの実装
ここでは、Pythonを用いてニュース記事のカテゴリ分類を実装します。具体的には、次のステップで進めます。
- データセットの準備:ニュース記事データを使用。
- データの前処理:テキストのクリーニングとトークナイゼーション。
- 特徴量の抽出:TF-IDFを用いたベクトル化。
- モデルの構築と学習:ロジスティック回帰モデルを使用。
- モデルの評価:分類の精度を評価します。
1. データセットの準備
まず、ニュース記事のデータセットを準備します。今回は、広く利用されている「20 Newsgroups」データセットを使用します。このデータセットには、20種類の異なるニュースカテゴリが含まれています。
from sklearn.datasets import fetch_20newsgroups
# 20 Newsgroupsデータセットの読み込み
newsgroups = fetch_20newsgroups(subset='train', categories=['rec.sport.baseball', 'rec.sport.hockey', 'sci.space', 'comp.graphics'])
# データとターゲットを取得
texts = newsgroups.data
labels = newsgroups.target
このコードでは、「スポーツ(野球、ホッケー)」や「科学(宇宙)」など、いくつかのカテゴリを選択してデータセットを読み込みます。
2. データの前処理
次に、データの前処理を行います。これは、テキストのクリーニング、トークナイゼーション、ストップワードの除去などを含みます。
import re
from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS
from nltk.stem import SnowballStemmer
stemmer = SnowballStemmer("english")
def preprocess_text(text):
# テキストを小文字化し、特殊文字を除去
text = text.lower()
text = re.sub(r'[^a-z\s]', '', text)
# トークン化とストップワードの除去、ステミング
words = [stemmer.stem(word) for word in text.split() if word not in ENGLISH_STOP_WORDS]
return ' '.join(words)
# 全テキストデータに対して前処理を実行
processed_texts = [preprocess_text(text) for text in texts]
このコードでは、テキストを小文字に変換し、特殊文字を除去した後、ストップワードを除去し、単語のステミングを行っています。
3. 特徴量の抽出
次に、テキストを数値ベクトルに変換します。ここでは、TF-IDFを使ってテキストをベクトル化します。
from sklearn.feature_extraction.text import TfidfVectorizer
# TF-IDFベクトライザの初期化
vectorizer = TfidfVectorizer(max_features=1000)
# テキストデータのTF-IDFベクトル化
X = vectorizer.fit_transform(processed_texts)
このコードでは、最大1000個の特徴量を持つTF-IDFベクトルを生成します。TF-IDFは、単語の出現頻度とその単語がどれだけ他の文書で一般的に使われているかを考慮した手法です。
4. モデルの構築と学習
次に、文書分類のためのロジスティック回帰モデルを構築し、学習させます。
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=42)
# ロジスティック回帰モデルの初期化と学習
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
ここでは、データを80%の訓練データと20%のテストデータに分割しています。ロジスティック回帰モデルを使用して、ニュース記事のカテゴリを学習します。
5. モデルの評価
最後に、学習したモデルを使ってテストデータの精度を評価します。
from sklearn.metrics import classification_report, accuracy_score
# テストデータを使って予測
y_pred = model.predict(X_test)
# 精度と分類レポートの表示
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred, target_names=newsgroups.target_names)
print(f"Accuracy: {accuracy:.2f}")
print("Classification Report:")
print(report)
このコードでは、テストデータに対する予測精度と各カテゴリごとの分類性能を評価します。精度、再現率、F1スコアといった指標が表示されます。
モデルの改善方法
1. 特徴量の追加
TF-IDFの代わりに、Word2VecやFastTextのような単語埋め込みを使うことで、テキストの意味を捉えたベクトル化が可能です。
2. モデルの変更
より高度なモデル(サポートベクターマシン(SVM)やディープラーニング)を使用することで、分類精度の向上が期待できます。
3. ハイパーパラメータの調整
モデルのハイパーパラメータチューニング(例えば、正則化パラメータや学習率)を行うことで、モデルのパフォーマンスをさらに向上させることができます。
まとめ
今回は、ニュース記事のカテゴリ分類モデルをPythonで実装し、データの前処理から特徴量の抽出、モデルの構築と評価までの一連の流れを解説しました。文書分類はNLPの基本的なタスクであり、さまざまな応用に役立つ技術です。次回は、感情分析について取り上げ、テキストから感情を判定する手法を説明します。
次回予告
次回は、感情分析の基礎について解説します。テキストから感情を判
定するための手法と実装方法を紹介します。お楽しみに!
注釈
- ストップワード:テキスト解析において重要性の低いとみなされる単語(例:「the」「is」など)。
- ステミング:単語をその語幹(基本形)に変換する手法。例えば、「running」を「run」に変換。
- ハイパーパラメータチューニング:機械学習モデルのパフォーマンスを最適化するためのパラメータ調整。
コメント