連載
» 2020年09月16日 05時00分 公開

AI・機械学習のデータセット辞典:Reuters newswire:ロイターのニュース記事のトピック分類データセット

データセット「Reuters newswire」について説明。1万1228件のロイターニュース配信テキストに対するトピック分類問題が扱えるデータセットについて説明する。TensorFlow/Kerasにおける利用コードも紹介。

[一色政彦,デジタルアドバンテージ]
「AI・機械学習のデータセット辞典」のインデックス

連載目次

データセット解説

 Reuters newswire classification datasetロイターのニュースワイヤー分類データセット。以下、Reuters newswire)は、ニュース配信テキストが「46分野のどのトピックに該当するか」を判定するために使える、テキスト分類/文書分類用データセットである(図1、詳細は後述するがReuters-21578のサブセットとなっている)。

図1 Reuters newswireデータセットの内容例 図1 Reuters newswireデータセットの内容例
元々のデータセットの配布元: David D. Lewis氏のサイト「Reuters-21578 Text Categorization Test Collection」。また、UCI Machine Learning Repository「Reuters-21578 Text Categorization Collection Data Set」にもアーカイブがある。

 Reuters newswireデータセットはKeras(TensorFlow同梱版のtf.kerasを含む)が提供しているが、「Reuters-21578 Text Categorization Collection Data Set」という古典的なデータセット(=1987年のニュースデータ)から作成したサブセットである。具体的には、分類トピックを前処理するなどして、2万1578件のデータを1万1228件に整理して作成されたものである(なお、その前処理コード自体はこちらのIssueを参照)。

 Reuters newswireには、以下に示す46個のトピック分類ラベル(=正解を示す教師データ)が付与されている。

  • [0]cocoa: カカオ
  • [1]grain: 穀物
  • [2]veg-oil: 穀物油
  • [3]earn: 金融関連
  • [4]acq: ACQ(年間契約数量)
  • [5]wheat: 小麦
  • [6]copper: 銅
  • [7]housing: 住宅
  • [8]money-supply: マネーサプライ
  • [9]coffee: コーヒー
  • [10]sugar: 砂糖
  • [11]trade: 貿易
  • [12]reserves: 外貨準備
  • [13]ship: 船舶
  • [14]cotton: コットン
  • [15]carcass: 食肉処理
  • [16]crude: 原油
  • [17]nat-gas: 天然ガス
  • [18]cpi: CPI(消費者物価指数)
  • [19]money-fx: 為替
  • [20]interest: 金利
  • [21]gnp: GNP(国内総生産)
  • [22]meal-feed: 家畜飼料
  • [23]alum: アルミニウム
  • [24]oilseed: 油糧種子
  • [25]gold: ゴールド
  • [26]tin: スズ
  • [27]strategic-metal: 戦略金属
  • [28]livestock: 家畜
  • [29]retail: 小売
  • [30]ipi: IPI(鉱工業生産指数)
  • [31]iron-steel: 鉄鋼
  • [32]rubber: ゴム
  • [33]heat: 燃料
  • [34]jobs: 仕事
  • [35]lei: LEI(景気先行指数)
  • [36]bop: BOP(国際収支)
  • [37]zinc: 亜鉛
  • [38]orange: オレンジ
  • [39]pet-chem: PET樹脂
  • [40]dlr: dollar(通貨ドル)
  • [41]gas: ガス
  • [42]silver: 銀
  • [43]wpi: WPI(卸売物価指数)
  • [44]hog: 豚
  • [45]lead: 鉛

 ただし、トピック分類ラベルごと均等にデータがそろっているわけではないので注意してほしい。各データの割合は、

を参照してほしい。なお、元データセットのReuters-21578における割合はこちらのサイトが参考になる。

引用のための情報

 このデータセットは、基本的に自由に使用できる。ライセンスは指定されていないが、元データセットReuters-21578のREADMEテキストには、

  • Reuters-21578のニュースワイヤー記事の著作権は、ロイター社に帰属する
  • ロイター社とカーネギーグループは、研究目的に限り無料で本データを配布することに同意している
  • このデータセットに基づいて結果を公表する場合は、「Reuters-21578, Distribution 1.0」という名前でデータセットの使用と参照(http://www.daviddlewis.com/resources/testcollections/reuters21578)を明示し、読者にデータセットの現在の場所を知らせること

と明記されている。KerasのReuters newswireは、Reuters-21578のサブセットであることから、これに準じた対応が必要と思われる(Kerasの公式ドキュメントには引用やライセンスについての記載はないようである)。

利用方法

 Kerasには、Reuters newswireを活用するための機能が提供されているので、これについて簡単に示す。

 なお元データセットのReuters-21578を使う場合は、公式ページからファイルを直接ダウンロードすればよい。scikit-learnを使う場合は、「Out-of-core classification of text documents」という公式ドキュメントが参考になるだろう。

TensorFlow(tf.keras)/Keras

# !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番目のテキストが取得される)

リスト1 TensorFlow(tf.keras)/KerasでReuters newswireを利用する基本的なコード

 tf.keras.datasets.reuters.load_data()関数を呼び出せばよい。この関数は高機能なため、引数も多く、またそれに伴う処理も少し必要になる。詳しくは上記関数のリンク先や、Kerasのドキュメント(日本語英語)などを参照してほしい。

「AI・機械学習のデータセット辞典」のインデックス

AI・機械学習のデータセット辞典

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。