Pythonとtensorflowを使ってニュースを見出しで分類する機械学習をする

スポンサーリンク

データ駆動型社会では、より多くのデータを収集するために、物事を分類することがますます重要になります。

その結果、この記事では、ニュースのヘッドラインをニュースの種類によって分類することにします。

例えば、スポーツニュース、テクノロジーニュースなどです。

この記事では、ニュースのヘッドラインとそのカテゴリを含むデータを扱います。

我々の目的は、Pythonプログラミング言語の機械学習の概念を利用することによって、ニュースの見出しを分類することです。

スポンサーリンク

データセットの紹介

ニュースのヘッドラインとそのカテゴリを含むデータセットを使用します。

この記事では、ウェブスクレイピングがどのように行われるかというような詳細には触れません。

データセットはここからダウンロードして、作業ディレクトリに置いてください。

Pythonでニュースの見出しを分類する手順

それでは、Pythonでニュースの見出しを分類するための手順に入りましょう。

このチュートリアルに沿って、このプロセス全体を理解してください。

1. モジュール/ライブラリのインポート

まず、使用する様々なモジュールをインポートすることから始めます。

以下のコードスニペットをコピーペーストして、先に進んでください。

1
2
3
4
5
6
7
8
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd

2. データセットの読み込み

1
2
df = pd.read_csv('news_headlines.csv')
df.head(n=10)
1
2
training_data,testing_data =  train_test_split(df.iloc[:5000,:],test_size=0.2
# 80% training data

3. 訓練とテストの分割

80:20ルールで、80%のデータをトレーニングに、残りの20%をテストに回します。

1
2
3
4
5
6
import matplotlib.pyplot as plt
# plotting distribution of each news_category in training& testing data
plt.plot(training_data['news_category'].value_counts())
plt.plot(testing_data['news_category'].value_counts())
plt.title('Train-Test Split Visualization')
plt.show()

視覚化するために、以下のコードを用いてトレーニングとテストを別々にプロットすることができます

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def tokenization_(training_headings, testing_headings, max_length=20,vocab_size = 5000):
    tokenizer = Tokenizer(num_words = vocab_size, oov_token= '<oov>')
    #Tokenization and padding
 
    tokenizer.fit_on_texts(training_headings)
    word_index = tokenizer.word_index
    training_sequences = tokenizer.texts_to_sequences(training_headings)
    training_padded = pad_sequences(training_sequences,padding= 'post',maxlen = max_length, truncating='post')
 
 
    testing_sequences = tokenizer.texts_to_sequences(testing_headings)
    testing_padded = pad_sequences(testing_sequences,padding= 'post',maxlen = max_length, truncating='post')
 
    return tokenizer,training_padded,testing_padded
1
2
3
4
5
6
tokenizer,X_train,X_test = tokenization_(training_data['news_headline'],
                                         testing_data['news_headline'])
 
labels = {'sports':[0,1,0],'tech':[1,0,0],'world':[0,0,1],}
Y_train = np.array([labels[y] for y in training_data['news_category']])
Y_test = np.array([labels[y]  for y in testing_data['news_category'] ])

4. トークン化機能

この機能は非常に単純で、ニュースヘッドラインのデータの学習とテストプロセスで行われ、それらに関連するシーケンスを返すために行われます。

トークン化処理については、こちらのチュートリアルを参照してください。

1
2
3
4
5
6
7
8
9
10
def build_model( n, vocab_size, embedding_size):
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Embedding(vocab_size,
              embedding_size,input_length=n))
    model.add(tf.keras.layers.GlobalAveragePooling1D())
    model.add(tf.keras.layers.Dense(3,activation = 'softmax'))      
    model.compile(loss='categorical_crossentropy',optimizer='adam',
                   metrics='accuracy')
    print(model.summary())
    return model

トークン化関数をトレーニングデータセットとテストデータセットに適用するためには、以下のコードを実行する必要があります。

1
2
3
4
epochs = 25
history = model.fit(X_train,Y_train,
                    validation_data = (X_test,Y_test),
                    epochs = epochs)

また、news_headlineとそのラベルは、トレーニング用とテスト用で別々にモデルで使用されるため、異なるリストに分離します。

5. ニューラルネットワークの構築

First 10 Rows News Headlines

上のコードは次のようなものです。

  1. 逐次モデルの作成
  2. シーケンシャルモデルに入力層と出力層を追加します。
  3. モデルをコンパイルし、学習後のモデルのサマリーを表示する
  4. 最後に、学習済みモデルを返す

このモデルでは、最初の層を埋め込み層、2番目の層を出力層として、2つの層を利用することになります。

6. ニューラルモデルの学習

Train Test Split News Headlines

最初にエポック数を設定します。

このモデルでは25エポックあれば十分なので、好きな値に設定してください。

次に、学習データとテストデータをニューラルモデルにフィッティングします。

このモデルはトレーニングデータセットで97%の精度、検証/テストデータセットで94%の精度を出し、非常に良い結果でした。

まとめ

あなたは、ニュースの見出しのカテゴリを予測するための分類ニューラルモデルの作り方を学んだだけです。

このチュートリアルは気に入りましたか?いずれにせよ、以下のチュートリアルをご覧になることをお勧めします。

  1. Pythonで衣服の画像を分類する – 完全ガイド
  2. Pythonを使ったワインの分類 – 簡単な説明
  3. Pythonによる電子メールスパム分類
  4. Pythonを使ったフェイクニュース検出器の作り方とは?

お時間を割いていただき、ありがとうございました! 何か新しいことを学べたでしょうか!

タイトルとURLをコピーしました