Livedoorニュースコーパスを文書分類にすぐ使えるように整形する

はじめに

日本語文書分類タスクのための代表的なコーパスの1つ,Livedoorニュースコーパス
Livedoorニュースのニュース記事を収集して生成されており,9種類のニュース記事が計7367本収載されています。

登録なしで無償利用でき,便利なのですが,そのままでは機械学習で使えるデータセットの形になっていません。
そこで,シェルでささっと整形していきたいと思います。

本題

コーパスの入手&展開

早速コーパスを入手しましょう。
専用のdataset ディレクトリを作り, その内部にtarアーカイブをダウンロードし, 展開します。

$ mkdir dataset
$ cd dataset
$ wget https://www.rondhuit.com/download/ldcc-20140209.tar.gz
$ tar zxvf ldcc-20140209.tar.gz

するとこのような構成のディレクトリが出来上がります。

dataset
└ text
  ├ CHANGES.txt
  ├ README.txt
  ├ dokujo-tsushin
  │  ├ LICENSE.txt
  │  ├ dokujo-tsushin-4778030.txt
  │  │ ...  
  │  └ dokujo-tsushin-6915005.txt
  ├ it-life-hack
  │  ├ LICENSE.txt
  │  ├ it-life-hack-6292880.txt
  │  ...  
  ├ kaden-channel
  │  ├ LICENSE.txt
  │  ├ kaden-channel-6054293.txt
  │  ...  
  ├ livedoor-homme
  │  ├ LICENSE.txt
  │  ├ livedoor-homme-4568088.txt
  │  ...  
  ├ movie-enter
  │  ├ LICENSE.txt
  │  ├ movie-enter-5840081.txt
  │  ...  
  ├ peachy
  │  ├ LICENSE.txt
  │  ├ peachy-4289213.txt
  │  ...  
  ├ smax
  │  ├ LICENSE.txt
  │  ├ smax-6507397.txt
  │  ...  
  ├ sports-watch
  │  ├ LICENSE.txt
  │  ├ sports-watch-4597641.txt
  │  ...  
  └ topic-news
     ├ LICENSE.txt
     ├ topic-news-5903225.txt
      ...  

各カテゴリのニュース記事はdokujo-tsushinからtopic-newsまでの該当するディレクトリに格納されています。
ファイル名はいずれも <ディレクトリ名>-xxxxxxx.txt という形式です。

tsvファイルの作成

ここから,各ニュース記事の ①ファイル名,②本文,③カテゴリのone-hot encoding を格納したtsvファイルを作っていきましょう。
まず,こんな感じの↓カラムだけを作っていこうと思います。

filename article dokujo-tsushin it-life-hack kaden-channel livedoor-homme movie-enter peachy smax sports-watch topic-news

これはワンライナーで書くことができます。
カラムができたらdataset/text/livedoor.tsv に格納しましょう。

$ echo -e "filename\tarticle"$(for category in $(basename -a `find ./text -type d` | grep -v text | sort); do echo -n "\t"; echo -n $category; done) > ./text/livedoor.tsv

続いて,dokujo-tsushinからtopic-newsまでの各ディレクトリ内のニュース記事の情報をtsvファイルに追記していきます。
こちらも頑張れば1行で書けそうですが,今回はカテゴリ毎に別々のコマンドとして実行します。

$ for filename in `basename -a ./text/dokujo-tsushin/dokujo-tsushin-*`; do echo -n "$filename"; echo -ne "\t"; echo -n `sed -e '1,3d' ./text/dokujo-tsushin/$filename`; echo -e "\t1\t0\t0\t0\t0\t0\t0\t0\t0"; done >> ./text/livedoor.tsv
$ for filename in `basename -a ./text/it-life-hack/it-life-hack-*`; do echo -n "$filename"; echo -ne "\t"; echo -n `sed -e '1,3d' ./text/it-life-hack/$filename`; echo -e "\t0\t1\t0\t0\t0\t0\t0\t0\t0"; done >> ./text/livedoor.tsv
$ for filename in `basename -a ./text/kaden-channel/kaden-channel-*`; do echo -n "$filename"; echo -ne "\t"; echo -n `sed -e '1,3d' ./text/kaden-channel/$filename`; echo -e "\t0\t0\t1\t0\t0\t0\t0\t0\t0"; done >> ./text/livedoor.tsv
$ for filename in `basename -a ./text/livedoor-homme/livedoor-homme-*`; do echo -n "$filename"; echo -ne "\t"; echo -n `sed -e '1,3d' ./text/livedoor-homme/$filename`; echo -e "\t0\t0\t0\t1\t0\t0\t0\t0\t0"; done >> ./text/livedoor.tsv
$ for filename in `basename -a ./text/movie-enter/movie-enter-*`; do echo -n "$filename"; echo -ne "\t"; echo -n `sed -e '1,3d' ./text/movie-enter/$filename`; echo -e "\t0\t0\t0\t0\t1\t0\t0\t0\t0"; done >> ./text/livedoor.tsv
$ for filename in `basename -a ./text/peachy/peachy-*`; do echo -n "$filename"; echo -ne "\t"; echo -n `sed -e '1,3d' ./text/peachy/$filename`; echo -e "\t0\t0\t0\t0\t0\t1\t0\t0\t0"; done >> ./text/livedoor.tsv
$ for filename in `basename -a ./text/smax/smax-*`; do echo -n "$filename"; echo -ne "\t"; echo -n `sed -e '1,3d' ./text/smax/$filename`; echo -e "\t0\t0\t0\t0\t0\t0\t1\t0\t0"; done >> ./text/livedoor.tsv
$ for filename in `basename -a ./text/sports-watch/sports-watch-*`; do echo -n "$filename"; echo -ne "\t"; echo -n `sed -e '1,3d' ./text/sports-watch/$filename`; echo -e "\t0\t0\t0\t0\t0\t0\t0\t1\t0"; done >> ./text/livedoor.tsv
$ for filename in `basename -a ./text/topic-news/topic-news-*`; do echo -n "$filename"; echo -ne "\t"; echo -n `sed -e '1,3d' ./text/topic-news/$filename`; echo -e "\t0\t0\t0\t0\t0\t0\t0\t0\t1"; done >> ./text/livedoor.tsv

これでtsvファイルの準備ができました。 dataset/text/livedoor.tsv をPandasで開くと次のような表ができているはずです。あとは存分に機械学習していきましょう!

filename article dokujo-tsushin it-life-hack kaden-channel livedoor-homme movie-enter peachy smax sports-watch topic-news
dokujo-tsushin-4778030.txt <記事の本文> 1 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ...
topic-news-6907153.txt <記事の本文> 0 0 0 0 0 0 0 0 1
注意

Jupyter NotebookやGoogle Colaboratoryのセル内で実行させた場合,ディレクトリの遷移状態の違いによるエラーが起こることがあります。
その場合は上記スクリプト中のパス表記を ./text/hogehoge から /dataset/text/hogehoge のように修正してください。