背景
機械学習の勉強として、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での文章生成など、個人的には色々と利用しています。