データセット「Reuters newswire」について説明。1万1228件のロイターニュース配信テキストに対するトピック分類問題が扱えるデータセットについて説明する。TensorFlow/Kerasにおける利用コードも紹介。
Reuters newswire classification dataset(ロイターのニュースワイヤー分類データセット。以下、Reuters newswire)は、ニュース配信テキストが「46分野のどのトピックに該当するか」を判定するために使える、テキスト分類/文書分類用データセットである(図1、詳細は後述するがReuters-21578のサブセットとなっている)。
Reuters newswireデータセットはKeras(TensorFlow同梱版のtf.kerasを含む)が提供しているが、「Reuters-21578 Text Categorization Collection Data Set」という古典的なデータセット(=1987年のニュースデータ)から作成したサブセットである。具体的には、分類トピックを前処理するなどして、2万1578件のデータを1万1228件に整理して作成されたものである(※なお、その前処理コード自体はこちらのIssueを参照)。
Reuters newswireには、以下に示す46個のトピック分類ラベル(=正解を示す教師データ)が付与されている。
ただし、トピック分類ラベルごと均等にデータがそろっているわけではないので注意してほしい。各データの割合は、
を参照してほしい。なお、元データセットのReuters-21578における割合はこちらのサイトが参考になる。
このデータセットは、基本的に自由に使用できる。※ライセンスは指定されていないが、元データセットReuters-21578のREADMEテキストには、
と明記されている。KerasのReuters newswireは、Reuters-21578のサブセットであることから、これに準じた対応が必要と思われる(※Kerasの公式ドキュメントには引用やライセンスについての記載はないようである)。
Kerasには、Reuters newswireを活用するための機能が提供されているので、これについて簡単に示す。
なお元データセットのReuters-21578を使う場合は、公式ページからファイルを直接ダウンロードすればよい。scikit-learnを使う場合は、「Out-of-core classification of text documents」という公式ドキュメントが参考になるだろう。
# !pip install tensorflow # ライブラリ「TensorFlow」をインストール
# !pip install keras # tf.kerasの場合は不要だが、Kerasを使う場合はライブラリ「Keras」をインストール
from tensorflow.keras.datasets import reuters # tf.kerasを使う場合(通常)
#from keras.datasets import reuters # tf.kerasではなく、Kerasを使う必要がある場合はこちらを有効にする
class_names = ['cocoa','grain','veg-oil','earn','acq','wheat','copper','housing','money-supply',
'coffee','sugar','trade','reserves','ship','cotton','carcass','crude','nat-gas',
'cpi','money-fx','interest','gnp','meal-feed','alum','oilseed','gold','tin',
'strategic-metal','livestock','retail','ipi','iron-steel','rubber','heat','jobs',
'lei','bop','zinc','orange','pet-chem','dlr','gas','silver','wpi','hog','lead']
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(
num_words=None, # 上位N個の頻出語のみを対象とする。それより少ない頻出語はoov_charの文字で表現される
skip_top=0, # 再頻出の上位N個の単語をスキップする(有益ではない場合があるため)。スキップされた単語はoov_charの文字で表現される
maxlen=None, # シーケンスの最大長。それより長いシーケンスは切り捨てられる
start_char=1, # シーケンスの開始は、この文字でマークされる
oov_char=2, # 上記のnum_wordsやskip_topによって削除された単語をこの文字で置き換える
index_from=3, # 単語へのインデックス付けを、この値以上に
test_split=0.2, # 訓練データとテストデータの分割で、何%をテストデータにするか
seed=113) # シャッフル時に使うランダムシード(任意の数値)を指定可能
# 全ての「単語:ID」の辞書を取得する
word_index = reuters.get_word_index()
# 最初の「0」〜「2」のIDは予約済みとなっており、以下の意味になる
word_to_id = {k:(v+RESERVED) for k,v in word_index.items()}
word_to_id["<PADDING>"] = 0 # パディング(余白)
word_to_id["<START>"] = 1 # シーケンスの開始単語(start_charで定義)
word_to_id["<UNKNOWN>"] = 2 # 未知の単語(oov_charで定義)
# 「単語:ID」→「ID:単語」の辞書に変換する
id_to_word = {value:key for key,value in word_to_id.items()}
# テキストを取得する関数を定義
def get_reuters_news(text):
return ' '.join([id_to_word.get(id, '?') for id in text])
# 上記の関数の使用例
get_reuters_news(train_data[0])
# (実行結果では、訓練データの1番目のテキストが取得される)
tf.keras.datasets.reuters.load_data()関数を呼び出せばよい。この関数は高機能なため、引数も多く、またそれに伴う処理も少し必要になる。詳しくは上記関数のリンク先や、Kerasのドキュメント(日本語/英語)などを参照してほしい。
Copyright© Digital Advantage Corp. All Rights Reserved.