📚

朝日新聞社が公開した長文要約APIをPythonで試してみた

2021/04/03に公開

(2021/4/4 追記)「重要な文を抽出後圧縮して、指定した長さにする」の出力結果を追記

朝日新聞社から長文を要約するAPIが無償公開されていましたので、試してみました。

https://www.itmedia.co.jp/news/articles/2104/02/news135.html

なお、APIキーは、下記サイトからメールアドレスを登録して、仮登録メールからメールアドレスを認証すれば取得できます。

https://cl.asahi.com/api_data/longsum.html

コードはこちら

なお、1日20アクセスまでなので気を付けましょう。

その他制限事項や規約等は公式サイトをご覧下さい。

https://cl.asahi.com/api_data/longsum.html

API key

取得したAPI key を下記の xxx のところに入れましょう。

key = "xxxxxxxxxxxxxxxxxxxxx"

なお、API key は送られてくるメール以外に確認する方法がないとのことなので、大切に保管しましょう。

元のテキスト

公式HPに記載の本文を使います。

https://cl.asahi.com/api_data/longsum.html

日本語文字列は100文字以上2000文字以下で、2000文字を超えると、超過分は切り捨てて処理するそうです。

text = "九州電力玄海原発3、4号機(佐賀県玄海町)の運転差し止めを住民らが求めた\
仮処分申し立ての即時抗告審で、福岡高裁(山之内紀行裁判長)は10日、住民側の抗告を\
棄却した。主な争点は、耐震設計の基になる基準地震動(想定される最大の揺れ)の合理性、\
原発周辺の火山の噴火リスク、配管の安全性の3点。 住民側は「基準地震動が過小評価されている」\
と主張。原子力規制委員会の安全審査の内規(火山影響評価ガイド)は、破局的噴火が予測\
できることを前提としている点は不合理と指摘。阿蘇カルデラ火山の噴火による火砕流が\
原発の敷地に到達する可能性も、十分小さいとは言えないと訴えていた。\
配管については「九電の検査方法では損傷が見逃されることがありうる」としていた。\
九電側は、基準地震動の評価について「各種調査で地域的な特性を把握した上、\
過小にならないようにしており合理的だ」と反論。「原発の運用期間中に破局的噴火が起きる\
可能性は極めて低い」と主張していた。配管については「健全性の確保に向け万全を期している」\
としていた。佐賀地裁は2017年6月、「安全性に欠けるところがあるとは認められない」など\
として、仮処分の申し立てを却下。住民側が即時抗告していた。"

各パラメーターの解説は公式サイトに記載がありますのでご参照ください。

https://cl.asahi.com/api_data/longsum.html

指定した長さごとに生成型要約

endpoint = "https://clapi.asahi.com/abstract"

length = 200 # 何文字ずつ区切って要約するか。200〜2000の整数。デフォルトは500。
auto_paragraph = True # 自動的に段落分けをするか否か

# JSON に変換
input_json = json.dumps({"text": text, "length": length, "auto_paragraph":auto_paragraph})
# リクエストの書式と認証方式を指定
headers = {"accept":"application/json",
        "Content-Type":"application/json",
           "x-api-key":key}

# リクエスト送信
response = requests.post(endpoint, input_json, headers=headers)

# 負荷軽減のために5秒スリープ
time.sleep(5)

# エンドポイントからレスポンスあったら結果を表示
if response.status_code == 200:
    result = response.json()["result"]
    pprint.pprint(result)
else:
    print(response)

出力:
['九州電力玄海原発3、4号機(佐賀県)の運転差し止め仮処分申し立ての即時抗告審が10日、福岡高裁は住民側の請求を棄却した。',
'耐震設計の基になる基準地震動(想定される最大の揺れ)を合理性、火山の噴火リスク、配管の安全性の3点。阿蘇カルデラ火山の噴火による火砕流が原発の敷地に到達する可能性も、十分小さいとは言えないと訴えていた。住民側は即時抗告していた。']

すべての文の長さを揃える

endpoint = "https://clapi.asahi.com/align"
length = 50 # 圧縮後の1文の長さ。10〜50の整数。デフォルトは25。
auto_paragraph = True # 自動的に段落分けをするか否か

# JSON に変換
input_json = json.dumps({"text": text, "length": length, "auto_paragraph":auto_paragraph})
# リクエストの書式と認証方式を指定
headers = {"accept":"application/json",
        "Content-Type":"application/json",
           "x-api-key":key}

# リクエスト送信
response = requests.post(endpoint, input_json, headers=headers)

# 負荷軽減のために5秒スリープ
time.sleep(5)

# エンドポイントからレスポンスあったら結果を表示
if response.status_code == 200:
    result = response.json()["result"]
    pprint.pprint(result)
else:
    print(response)

出力:
['九州電力玄海原発3、4号機の運転差し止めを住民が求めた仮処分申し立ての即時抗告審で、福岡高裁(山之内紀行裁判長)は10日。耐震設計の基になる基準地震動(想定される最大の揺れ)の合理性、原発周辺の火山の噴火リスク、配管の安全性の3点。',
'住民側は「基準地震動が過小評価されている」と主張。原子力規制委員会の安全審査の内規は、破局的噴火が予測できることを前提としている点は不合理と指摘。カルデラ火山の噴火による火砕流が原発の敷地に到達する可能性も、十分小さいとは言えないと訴えていた。配管については「九電の検査方法では損傷が見逃されることがありうる」としていた。',
'基準地震動の評価について「各種調査で地域的な特性を把握した上、過小にならないようにしており合理的だ」と反論。「原発の運用期間中に破局的噴火が起きる可能性は極めて低い」と主張していた。配管については「健全性の確保に向け万全を期している」としていた。',
'佐賀地裁は2017年6月、「安全性に欠けるところがあるとは認められない」などとして、仮処分の申し立てを却下。住民側が即時抗告していた。']

重要な文を抽出する

endpoint = "https://clapi.asahi.com/extract"
rate = 0.3 # 全体の文からどのくらいの割合で文を抽出するか。0.1〜0.9の少数。デフォルトは0.7。この数値が小さいほど、返却される文の文字数は少なくなる
auto_paragraph = True # 自動的に段落分けをするか否か

# JSON に変換
input_json = json.dumps({"text": text, "rate": rate, "auto_paragraph":auto_paragraph})
# リクエストの書式と認証方式を指定
headers = {"accept":"application/json",
        "Content-Type":"application/json",
           "x-api-key":key}

# リクエスト送信
response = requests.post(endpoint, input_json, headers=headers)

# 負荷軽減のために5秒スリープ
time.sleep(5)

# エンドポイントからレスポンスあったら結果を表示
if response.status_code == 200:
    result = response.json()["result"]
    pprint.pprint(result)
else:
    print(response)

出力:
['「原発の運用期間中に破局的噴火が起きる可能性は極めて低い」と主張していた。',
'配管については「健全性の確保に向け万全を期している」としていた。住民側が即時抗告していた。']

重要な文を抽出後圧縮して、指定した長さにする

endpoint = "https://clapi.asahi.com/control-len"
length = 10 # 要約文のトータルの長さ。10〜2000の整数。デフォルトは500。
auto_paragraph = True # 自動的に段落分けをするか否か

# JSON に変換
input_json = json.dumps({"text": text, "length": length, "auto_paragraph":auto_paragraph})
# リクエストの書式と認証方式を指定
headers = {"accept":"application/json",
        "Content-Type":"application/json",
           "x-api-key":key}

# リクエスト送信
response = requests.post(endpoint, input_json, headers=headers)

# 負荷軽減のために5秒スリープ
time.sleep(5)

# エンドポイントからレスポンスあったら結果を表示
if response.status_code == 200:
    result = response.json()["result"]
    pprint.pprint(result)
else:
    print(response)

出力:
1日のアクセス上限に達したので省略。
['', '配管は万全', 'を期している。']

(参考)エラーメッセージ

detail HTTP Status 説明
bad parameters 400 パラメータが不正
Missing Authentication Token 403 APIキーが不正
Internal server error 500, 503 サーバ処理で異常が発生
Limit Exceeded 429 アクセス数の制限を超過(1日20アクセス)

以上になります、最後までお読みいただきありがとうございました。

APIの参考記事

Discussion