💬

【Python】Livedoorニュースのデータセットを取得し、CSVファイルにする方法

2023/08/20に公開

自然言語処理の分野で、分析を行ったり、モデルを試すのに、どうしても必要になるのが、テキストのデータセットです。

しかし、手頃なデータセットを用意するのって難しいんですよね。

そんなお悩みにこたえてくれるのがlivedoorニュースコーパスです。
9つのカテゴリー別に複数の記事があることから、分類タスクや感情分析など、自然言語処理のさまざまなタスクに活用できます。
ここでは、Livedoorニュースのデータセットをダウンロードして、CSVファイルにする方法を解説していきます。

Livedoorニュースのデータセットの概要

株式会社ロンウイットが、収集しているデータです。
登録不要で、すぐにダウンロードできるので非常に便利です。

以下の9つのカテゴリ別に、複数のニュース記事が用意されています。(ただし、時期は結構古いです。)

  • トピックニュース
  • Sports Watch
  • ITライフハック
  • 家電チャンネル
  • MOVIE ENTER
  • 独女通信
  • エスマックス
  • livedoor HOMME
  • Peachy

https://www.rondhuit.com/download.html

データセットをダウンロードしCSVファイルにする方法

カテゴリーごとにCSVファイルを作っていきます。
最終的には、こんな感じのCSVファイルができます。

ニュースコーパスをダウンロードする

以下を実行すると、Googleコラボの/contentディレクトリにldcc-20140209.tar.gzフォルダが生成されます。

!wget https://www.rondhuit.com/download/ldcc-20140209.tar.gz

ライブラリーをインポートし、ダウンロードしたtar.gzを解凍する

tar.gzを解凍し、idcc_dataフォルダに格納します。

import os
import pandas as pd
import tarfile

# ファイルパスを指定する
tar_file_path = "/content/ldcc-20140209.tar.gz"
extract_folder = "/content/ldcc_data/"

# tar.gzファイルを解凍し、extract_folderに格納する
with tarfile.open(tar_file_path, "r:gz") as tar:
    tar.extractall(path=extract_folder)

関数を作成

各ディレクトリーのテキストファイルを辞書(articles)にまとめる関数を作成します


def read_articles_from_directory(directory_path):
    #ディレクトリーの中から記事のテキストファイルのパスをリストとして読み込む
    files = [f for f in os.listdir(directory_path) if f not in ["LICENSE.txt"]]
    
    articles = []
    for file in files:
        #記事を一つずつ読み込み、url,date,bodyに分け、辞書を作る
        with open(os.path.join(directory_path, file), 
		"r", encoding="utf-8") as f:
            lines = f.readlines()
            articles.append({
                "url": lines[0].strip(),
                "date": lines[1].strip(),
                "body": ''.join(lines[2:]).strip()
            })
    
    return articles

CSVファイルの作成

# 各記事のディレクトリーを取得する
directories = [d for d in os.listdir(extract_folder + "text/") 
	if d not in ["CHANGES.txt", "README.txt"]]

# カテゴリーごとのCSVファイルを作る
csv_file_paths = {}
for directory in directories:
    # Read articles from the category directory
    articles = read_articles_from_directory(extract_folder + "text/" + directory)
    df = pd.DataFrame(articles)

    # Save to CSV
    csv_path = f"/content/{directory}.csv"
    df.to_csv(csv_path, index=False)
    csv_file_paths[directory] = csv_path

print(csv_file_paths)

Discussion