はじめに
この実験では、Python の人気のある機械学習ライブラリである scikit-learn を使って、テキストデータを扱う方法を学びます。テキストデータを読み込み、前処理し、特徴量を抽出し、モデルを学習させ、その性能を評価する方法を学びます。
VM のヒント
VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替え、Jupyter Notebook を使って練習しましょう。
Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題があった場合は、Labby にお問い合わせください。セッション終了後にフィードバックを提供してください。すぐに問題を解決いたします。
テキストデータの読み込み
まず、扱うテキストデータを読み込む必要があります。20 個の異なるトピックのニュース記事が含まれる 20 Newsgroups データセットを使用します。データセットを読み込むには、scikit-learn の fetch_20newsgroups 関数を使用できます。
from sklearn.datasets import fetch_20newsgroups
## データセットを読み込む
categories = ['alt.atheism','soc.religion.christian', 'comp.graphics','sci.med']
twenty_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)
これでデータが読み込まれました。そして、その構造と内容を調べることができます。
テキストデータの前処理
機械学習にテキストデータを使用する前に、前処理が必要です。これには、句読点を削除したり、すべてのテキストを小文字に変換したり、テキストを個々の単語にトークナイズしたりなど、いくつかのステップが含まれます。scikit-learn の CountVectorizer と TfidfTransformer を使用して、これらの前処理ステップを実行できます。
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
## テキストデータを前処理する
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
これで、テキストデータの前処理が完了し、特徴量抽出の準備が整いました。
特徴量抽出
テキストデータを特徴量ベクトルとして表現するには、単語袋表現を使用できます。この表現では、訓練セット内の各単語に固定された整数 ID を割り当て、各文書内の各単語の出現回数をカウントします。scikit-learn の CountVectorizer を使用して、これらの特徴量ベクトルを抽出できます。
from sklearn.feature_extraction.text import CountVectorizer
## 特徴量ベクトルを抽出する
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(twenty_train.data)
これで特徴量ベクトルが抽出されました。これらを使ってモデルの学習に使用できます。
モデルの学習
特徴量ベクトルができたので、テキストデータを分類するモデルを学習させることができます。この例では、テキスト分類に人気のあるアルゴリズムである多項式ナイーブベイズアルゴリズムを使用します。
from sklearn.naive_bayes import MultinomialNB
## モデルを学習させる
clf = MultinomialNB().fit(X_train_tfidf, twenty_train.target)
これでモデルの学習が完了し、予測の準備が整いました。
モデルの評価
モデルの性能を評価するには、ホールドアウトテストセットを使用できます。訓練セットと同じプロセスを使ってテストセットを読み込めます。
twenty_test = fetch_20newsgroups(subset='test', categories=categories, shuffle=True, random_state=42)
これで、テストセットの前処理と特徴量ベクトルの抽出ができます。
X_test_counts = count_vect.transform(twenty_test.data)
X_test_tfidf = tfidf_transformer.transform(X_test_counts)
最後に、学習済みのモデルを使ってテストセットに対して予測を行い、精度を計算できます。
predicted = clf.predict(X_test_tfidf)
accuracy = np.mean(predicted == twenty_test.target)
まとめ
この実験では、scikit-learn を使ってテキストデータを扱う方法を学びました。テキストデータを読み込み、前処理し、特徴量ベクトルを抽出し、モデルを学習させ、その性能を評価しました。テキストデータを扱うことは難しい場合がありますが、scikit-learn は強力なツールとアルゴリズムを提供していて、そのプロセスを簡単にします。