非エンジニアでも出来る、ニュースのAI要約入門

こんにちは。クラフター社の取締役をしている、万代惇史です。

他には、親会社マネックスグループのマネックスゼロ室という新規事業部や、マネックス証券のAIサービス推進室というAI活用を進める部署でビジネスサイドとして働いています。

今回は、クラフター社のアドベントカレンダーの12月20日分に誘っていただき、AIに関する記事を書くことになりました。(25日まで、毎日クラフターのメンバーが記事を書いているので、ぜひご覧ください)

さて、AIをどのように使えるかというのは、多くの方が研究していると思いますが、今回は僕が普段ビジネスサイドの人間として「こうやってAIを使えば便利だよ」という一例「AIによるニュースの要約自動化」の方法を書いてみたいと思います!

こんな感じで、ニュース要約をAIにメールで送ってもらいます

ニュースを要約して読みたい!

普段、情報を収集しようと思うと、TechCrunchやCNBC、CoinDeskなど、英語のニュースサイトに目を通さないといけないことがあります。

そんなときに、日本語で要点だけパパっと読めれば、ひとつ10秒くらいで目を通せるのに、英語で長文の元記事を読むとなると、どうしても時間が掛かってしまいます。

「ニュースの要約を毎朝メールで送ってもらい、気になる記事があれば、元記事を読む」という方法が実現できれば、もっと効率的にニュースサイトを読んで、情報を収集することができるのに...。

ということで、今回はそんな便利な機能を、AIを使って実現していきたいと思います!

まずは、Google SpreadsheetにRSSをインポートする

まずは、AIで要約する記事を整理するために、Google SpreadsheetにRSSをインポートしたいと思います。

今回は、TechCrunchのRSSフィード(https://techcrunch.com/feed/)をインポートしますが、やり方を忘れたので、さっそくChatGPTに質問します。

日本語で回答してください。
Google Spreadsheetにフィードをインポートしたい。
フィードは、以下です。
https://techcrunch.com/feed/

ChatGPTへの質問

ChatGPTに言われた通りの関数を入力すると、

Google Spreadsheetに関数を入力

見事に、TechCrunchの最新記事10件を表示することができました!

TechCrunchの記事がインポートされた

10件以上の記事を要約したい場合は、10を好きな数字に変更してください。

シート名を「TechCrunch」に変更

後々、判別しやすいように、シート名を「TechCrunch」にしておきます。

スクレイピングして、本文を取得する

さて、上に載せたフィードをインポートした画像を見ていただくと、C列に各記事のURLが入っていることが分かります。そこで、C列のURLから記事を読みにいき、本文を取得したいと思います。

TechCrunchのソースコードを見ると、<article class="article-container article--post ">の中に本文が記載されているので、ここを抽出すると本文が取得できそうです。

この辺を抽出してみる

やりたいことを、どんどんChatGPTに伝えていきます。

Google Spreadsheetの「TechCrunch」シートのC列に、1行目~10行目までTechCrunchの記事のURLが記載されています。Google App Scriptを用いて、これらの記事の本文を取得して、F列に出力したいです。本文は<article class="article-container article--post ">の中に記載されています。

ChatGPTが書いてくれたコードはこちらです。

function fetchTechCrunchArticles() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('TechCrunch');
  var urls = sheet.getRange('C1:C10').getValues();
 
  for (var i = 0; i < urls.length; i++) {
    var url = urls[i][0];
    if (url) {
      var response = UrlFetchApp.fetch(url);
      var content = response.getContentText();
      var extractedContent = extractContent(content);
      sheet.getRange(i + 1, 6).setValue(extractedContent); // F列に出力
    }
  }
}

function extractContent(html) {
  var content = '';
  var match = /<article class="article-container article--post ">([\s\S]*?)<\/article>/.exec(html);
  if (match && match[1]) {
    content = match[1];
    // HTMLタグを除去する場合は以下の行を追加
    // content = content.replace(/<[^>]*>/g, '');
  }
  return content;
}

2つの機能がありますね。

2つめの機能から見ていくと、「extractContent(html)」で、渡されたHTMLの中から、<article class="article-container article--post ">と</article>の間にある文字を抽出して返しています。つまり、先ほど「この辺りを抽出したい」と書いた本文周りの部分を抽出する機能です。

1つめの機能では、C列のURLをもとにそれぞれの記事のHTMLを全て取得して、そのHTMLを2つ目の機能に渡すことで、本文周りを抽出しています。抽出した本文周りはF列に記録する形となっています。

つまり、1つめの機能を呼び出すことで、それが2つめの機能を使いながら、F列に本文周りを記載していくという構成になっています。

では、このプログラムを動かしていきましょう。先ほど、TechCrunchをインポートしたスプレッドシートで「拡張機能 > Google App Script」と選ぶと、Google App Scriptの画面が表示されます。ここにコードをまるっと貼り付けます。

Google App Scriptは、プログラムを簡単に動かせるので便利

そして、保存ボタンを押してコードを保存したあと、「実行ログ」に左側の選択部分で1つめの機能(fetchTechCrunchArticles)が選択されていることを確認して、実行ボタンを押します。

そうすると、先ほどの「TechCrunch」シートのF列に抽出した本文周りがバッチリ書き込まれました!

F列に抽出したHTMLが書き込まれた

要約を作成する

今回、本文の辺りをざっくり抽出しているので、厳密には本文だけではありませんが、このくらいであればGPTは綺麗に処理できるので、さっそくこの抽出した情報をもとに要約を作っていきましょう。

まず、APIを通じてChatGPTを叩くため、その処理を行うプログラムを、これまたGoogle App Scriptに貼り付けます。

SECRET_KEY = ‘ここにそれぞれのOpenAIのAPIキーを記載’

function ChatGPT(prompt,modelName) {
  Logger.log("prompt: " + prompt);
  const url = "https://api.openai.com/v1/chat/completions";
  let messages = [{role:"user",content:prompt}]
  const payload = {
    model: modelName,
    messages: messages,
    top_p: 0.6,
    max_tokens: 2000
  };
  const options = {
    contentType: "application/json",
    headers: { Authorization: "Bearer " + SECRET_KEY },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };
  const response = UrlFetchApp.fetch(url, options)
  var res;
  var answer;
  try {
    res = JSON.parse(response.getContentText());
    answer = res.choices[0].message.content.trim()
    Logger.log("answer: " + answer);
    return answer;
  } catch (e) {
    answer = 'APIリクエストが失敗しました:' + e;
    Logger.log("answer: " + answer);
    return
  }
}

この関数は、引数としてprompt(GPTへの命令文)とmodelNameを受け取り、ChatGPTが命令を処理した結果を戻します。modelNameには用途に応じたモデルを選択します。今回は最新の高性能モデルGPT4-turbo(gpt-4-1106-preview)を使います。

‘ここにそれぞれのOpenAIのAPIキーを記載’の部分には、実際のOpenAIのAPIキーが入ります。こちらは別途OpenAIのアカウントを登録して取得が必要ですが、やり方はあちこちに書かれているので、今回は割愛します。(APIキーを直書きするのも微妙ですが、今回はこちらも一旦割愛します)

こちらも、Google App Scriptの画面に、先ほど貼り付けたものの続きで、まるっと貼り付けます。

続いて、この関数を使って、各本文の要約(タイトルと本文の要約)を作り、G列に貼り付けてもらいましょう。

Gooogle Spreadsheetの「TechCrunch」シートのF列の1行目~10行目に各記事の本文が記入されています。Google App ScriptとOpenAIのAPIを用いて、それぞれの日本語の要約とタイトルを作成して、G列に記入したいです

GPTへの指示は、以下のようにしてください。
「あなたは優秀なテック記事のライターです。以下の記事の内容を元に、日本語のタイトルと3文程度の要約を作成してください。

例)
タイトル:xxxxx
要約:xxxxxx。xxxxxx。xxxxx。

<本文>」

GPTに処理を依頼する関数は、すでにあります。
function ChatGPT(prompt,ModelName){}

ModelNameには「gpt-4-1106-preview」を使ってください。

上の指示に基づいて、ChatGPTが書いてくれたコードはこちら。

function summarizeArticles() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("TechCrunch");
  var articles = sheet.getRange("F1:F10").getValues();
  for (var i = 0; i < articles.length; i++) {
    if (articles[i][0] != undefined) { // 空でないセルのみ処理
      var article = articles[i][0];
      var summary = ChatGPT(createPrompt(article), "gpt-4-1106-preview");
      sheet.getRange(i + 1, 7).setValue(summary);
    }
  }
}

function createPrompt(article) {
  return 'あなたは優秀なテック記事のライターです。以下の記事の内容を元に、日本語のタイトルと3文程度の要約を作成してください。\n\n' +
    '例)\nタイトル:xxxxx\n要約:xxxxxx。xxxxxx。xxxxxx。\n\n' +
    '<本文>\n' + article;
}

2つ目の機能は、GPTに投げるプロンプト(命令文)を作成する機能になっています。1つ目の機能は、先ほどF列に記入した本文周りのHTMLを読み取っては、2つ目の機能を使いながら命令文を作成して、要約を作成しています。作成された要約はG列に書き込まれます。

問題なさそうなので、こちらもGoogle App Scriptに貼り付けて、保存したら、試しに実行してみましょう。関数「summarizeTechCrunchArticles」が選択されていることを確認して、実行ボタンを押します。

summarizeArticlesを選択して実行

すると、タイトルと要約が作成され、G列に出力されました!

G列に作成された要約が記入された

これで、各ニュースの要約作成は完了です。

メールで自分宛てに送る

さて、あとは作成した要約を自分宛てに送るだけです。こちらもChatGPTにコードを書いてもらいました。

Google Spreadsheetの「TechCrunch」シートのG列の1行目~10行目に、ニュースのタイトルと要約が記載されています。また、C列の1行目~10行目に元記事のURLがあります。これらをGoogle App Scriptでひとつにまとめて、自分宛てにGmailでメールしたいです。

・メールの件名は「TechCrunch要約:本日の日付」としたい。
・それぞれの行について、G列の要約のあとに、C列のURLを記載したい
・それぞれの行の内容のあとは2行あけたい

出来上がったコードがこちら。

function sendTechCrunchSummary() {
  // 現在アクティブなスプレッドシートを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('TechCrunch');

 // G列とC列の1行目から10行目までのデータを取得
  var titlesAndSummaries = sheet.getRange('G1:G10').getValues();
  var urls = sheet.getRange('C1:C10').getValues();

  // メールの本文を作成
  var body = '';
  for (var i = 0; i < titlesAndSummaries.length; i++) {
    body += titlesAndSummaries[i][0] + '\nURL: ' + urls[i][0] + '\n\n';
  }

  // 本日の日付を取得してメールの件名を設定
  var today = new Date();
  var subject = 'TechCrunch要約:' + Utilities.formatDate(today, Session.getScriptTimeZone(), 'yyyy-MM-dd');

  // 特定のメールアドレスにメールを送信
  var recipient = 'example-email@gmail.com'; // 宛先のメールアドレス
  MailApp.sendEmail(recipient, subject, body);
}

「example-email@gmail.com」のところには宛先つまり自分のメールアドレスを書いてください。

こちらのコードをGoogle App Scriptに貼り付けて実行すると、無事にメールが送信されました!

要約がメールで送られてきた!

これで、英語の記事とにらめっこをすることなく、日本語の要約にささっと目を通して、内容を確認することができます。もちろん、気になる記事があれば、リンクから元記事に飛んで(英語ですが)じっくり読むこともできます。

毎朝送ってもらいたい!

これでプログラムは出来たので、あとは毎朝送ってもらうようにします。

毎日の処理としては、以下の3つになります。
・記事の本文を取得する:fetchTechCrunchArticles()
・記事の要約を作る:summarizeArticles() 
・要約をメールで自分に送る:sendTechCrunchSummary()

そこで、それぞれを朝の5時、6時、7時に動くようにトリガーを設定しておきましょう。Google App Scriptの左側のメニューからトリガーを選んで、それぞれ設定していきます。

トリガーを設定

トリガーを3つ設定すると、こんな感じになります。

3つのトリガーを設定済み

以上です!

これで毎朝メールが送られてくるので、情報収集が捗るようになります。今回は、ざっくりと実装したので、細かい部分はそれぞれで改善してみてもらえればと思います。

AIを活用しよう!

以上、ビジネスサイドの人間として、AIをどんなふうに活用できるかというアイデアをひとつ書いてみました。

今回のようにニュースを要約させれば、同じ朝の10分でも、もっとたくさんの情報をインプットできるようになります。他にもいろんな使い方がありますが、総じてAIは「有限な時間の中で、自分がこなせるタスクの量を増やしてくれる頼もしい仲間」だといえます。

クラフター社では、ChatGPTをプライベートな環境でセキュアに使える「Crew」を提供しています。「AIを導入して、業務を効率化したい」というお悩みをお持ちの会社さんや自治体さんがいらっしゃれば、ぜひお気軽にクラフター社までご相談ください。
https://www.gocrew.jp/jp

明日は、デザイナーのMichiさんです。クラフター社のアドベントカレンダー、引き続き、お楽しみください。


この記事が参加している募集

AIとやってみた

この記事が気に入ったらサポートをしてみませんか?