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
のように修正してください。