LoginSignup
0
1

【学習データ収集】文章要約の機械学習で使えそうな学習データをwebスクレイピングで収集してみた

Posted at

背景

機械学習の勉強として、Hugging Faceで事前学習済みT5モデルを触ってみた際に、日本語の文書要約の学習データを手元にある程度持っていると、楽しく触れそうと思ったので、webスクレイピングで収集してみました。

方法(概要)

LivedoorNewsの記事の「本文」と「3行要約」を、webスクレイピングで収集しました。

LivedoorNewsの記事のURLはこちらになります。
http://news.livedoor.com/article/detail/xxxxxxxx/

URL内のxxxxxxxxには、「記事のID」が入りますが、こちらの方が纏めて頂いた「記事のID」を利用させて頂きました。

この記事は Apache 2.0ライセンスで配布されている製作物が含まれています。
This article includes the work that is distributed in the Apache License 2.0.

方法(詳細)

環境は下記になります。
Python 3.11.5
beautifulsoup4 4.12.2
pandas 2.1.1

1. 「記事のID」をCSVファイルとして保存

こちらをCSVファイルとして保存します。
https://github.com/KodairaTomonori/ThreeLineSummaryDataset/blob/master/data/train.csv

2. 「記事のID」をリスト型の変数に入れる

pythonで「記事のID」のCSVファイルを開いて、「記事のID」をリスト型の変数(変数名: id_list)に入れます。

id_list = []
with open(r"保存した「記事のID」のCSVファイルのパス", mode="r") as f:
    lines = f.readlines()
    for _line in lines:
        url_id = _line.strip().split(",")[3].split(".")[0]
        id_list.append(url_id)

リストの中には213,159個の「記事のID」があります。

print(len(id_list))
=> 213159

3. 「記事のID」を付与したURLから「本文」と「3行要約」を取得

213,159個の全てから取得するのは大変なので、最初の50個の「記事のID」を対象にしようと思います。また、一部の記事は既に削除されているらしく、有効な「記事のID」は約半分と思われます。

必要なライブラリーをインポートします。

from urllib.request import urlopen
import time
import random
from bs4 import BeautifulSoup
from bs4.element import NavigableString

初期変数を準備します。

FROM_ID = 0
TO_ID = 50
output_text_list = []
output_summary_list = []

「本文」と「3行要約」を取得します。

for i in range(FROM_ID, TO_ID):
    interval_time = random.uniform(3, 3.5)
    time.sleep(interval_time)  # 取得の度に3秒前後待ちます
    url = "https://news.livedoor.com/article/detail/" + id_list[i] + "/"
    try:
        with urlopen(url) as res:
            output_text = ""  # 本文を保存する変数
            html = res.read().decode("euc_jp", "ignore")
            soup = BeautifulSoup(html, "html.parser")
            linelist = soup.select(".articleBody p")
            for line in linelist:
                if len(line.contents) > 0 and type(line.contents[0]) is NavigableString:
                    output_text += str(line.contents[0]).strip()
            if output_text == "":  # 本文がホームページに無かった場合は次の記事IDへ
                continue
            output_text_list.append(output_text)
    
            output_summary = ""  # 要約を保存する変数
            summarylist = soup.select(".summaryList li")
            for summary in summarylist:
                output_summary += str(summary.contents[0]).strip() + ""
            if output_summary == "":  # 要約がホームページに無かった場合は次の記事IDへ
                continue
            output_summary_list.append(output_summary)
    except Exception:
        print("Exception")

結果を確認してみると、無事に取得出来ていそうです。

print(len(output_text_list))
=> 31
print(len(output_summary_list))
=> 31

扱いやすいように、pandasでDataFrameにします。

import pandas as pd

df = pd.DataFrame(data={"text": output_text_list, "summary": output_summary_list})

以上になります。

まとめ

「本文」「3行要約」データを使ってT5を触りつつ、「本文」データだけを使ってBERTでのEmbeddingや、GPTでの文章生成など、個人的には色々と利用しています。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1