恒星間ボトルメール

Interstellar Message in a Bottle

【Python】正規表現を利用してBBCニュース記事スクラップのカテゴリー分析を行う

本ブログの企画で、BBC NEWSの記事を毎日一本読みExcelファイルに記録するという活動を行っている。

Excelファイルの形式はこちらの図の通りである。

f:id:emrdkn:20220417001707p:plain
Excelファイル

5列目に記事URLを記入している。

BBC NEWSの記事のURLはたとえば

https://www.bbc.com/news/world-europe-61114843

というふうに、https://www.bbc.com/news/ 以下にカテゴリと数字が続くという形式である。

そこで、正規表現を用いてURLからカテゴリ情報を抜き出して、どのカテゴリの記事をよく読むかを分析することにした。

分析対象の期間は、3月15日から4月16日に読んだ記事33本である。

結果

f:id:emrdkn:20220417001728p:plain
Result

33本のうち、9本はヨーロッパ、7本はビジネス、5本は北米、3本はアジアだった。その他のカテゴリは1~2本だった。

最近はロシアによるウクライナ侵攻とそれを受けた西側諸国の対応が大きなニュースとなっている。それゆえ、これらのニュースを追っていれば、自然とヨーロッパ、北米カテゴリの記事が増えるだろう。

読んでいないカテゴリに何があるか確認していないが、あれば読んでみたい。

スクリプト

# モジュールの読み込みとExcelファイルの読み込み
import openpyxl
import re
import collections
import matplotlib.pyplot as plt

wb = openpyxl.load_workbook("C:/Users/Public/Workspace/Essays/supplements_long/English_news.xlsx")
ws = wb["Sheet1"]
# 記事URLのリストを作る。
urls = []

for cols in ws.iter_cols(min_row=2, min_col=5, max_col=5):
    for cell in cols:
        if cell.value:
            # print(cell.value)
            urls.append(cell.value)
# 記事URLに対して正規表現を用いて、カテゴリ部分だけを抜き出したリストを作成
pattern2 = "https://www.bbc.com/news/(?P<category>([a-z]+-)*[a-z]+)-[0-9]+"

extracted = []

for url in urls:
    res = re.search(pattern2, url)
    print(res.group("category"))
    extracted.append(res.group("category"))
# 各記事のカテゴリを並べたリストに対して各カテゴリの要素数を計算
c = collections.Counter(extracted)
c_sorted = sorted(c.items())
# カテゴリ名とその各カテゴリの記事数をリストにして棒グラフを描画
x = [item[0] for item in c_sorted]
y = [item[1] for item in c_sorted]

plt.barh(x, y)
plt.show()

正規表現

今回、用いた正規表現https://www.bbc.com/news/([a-z]+-)*[a-z]+-[0-9]+である。

[a-z]+はアルファベット小文字の1文字以上の文字列を表す。

([a-z]+-)*は「world-us-」というような「アルファベット小文字の1文字以上の文字列とハイフン記号」の0回以上の繰り返しを表す。

よって([a-z]+-)*[a-z]は「world-us-canada」というような形式を表現する。

[0-9]+は数字の1文字以上の並びである。

今回はカテゴリ名部分を抜き出すので、([a-z]+-)*[a-z]+を括弧でくくってグループ名をつけて、https://www.bbc.com/news/(?P<category>([a-z]+-)*[a-z]+)-[0-9]+とした。