PHPで Geminiを使ってテキストの要約を行う

(1/1)
Gemini は、2023年(令和5年)12月に Googleが発表した生成AIモデルだ。テキスト生成、翻訳、要約などを無料で利用することができる。今回は、PHPで Gemini API を使い、テキストを任意の長さに要約するプログラムを作ってみることにする。

(2025年12月20日)PHP8.5対応:curl_closeを実行しないようにした
(2025年9月19日).pahooEnv導入

目次

サンプル・プログラムの実行例

PHPで Geminiを使ってテキストの要約を行う

サンプル・プログラム

圧縮ファイルの内容
summaryGemini.phpサンプル・プログラム本体
summaryGemini.php 更新履歴
バージョン 更新日 内容
1.2.0 2025/12/20 PHP8.5対応:curl_closeを実行しないようにした
1.1.0 2025/09/19 .pahooEnv導入
1.0.0 2025/01/02 初版
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加

準備:PHP の https対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

準備:初期値など

getHolidayGoogle.php

  58: // 初期値(START) =============================================================
  59: 
  60: // 表示幅(ピクセル)
  61: define('WIDTH', 600);
  62: 
  63: // 指定できる西暦年の範囲;現在年±10
  64: define('MIN_YEAR', date('Y'- 10);
  65: define('MAX_YEAR', date('Y'+ 10);
  66: 
  67: // -- 以下のデータは .env ファイルに記述可能
  68: // Google Cloud Platform APIキー
  69: // https://cloud.google.com/maps-platform/
  70: if (isset($_ENV['PAHOO_GOOGLE_API_KEY_1'])) {
  71:     define('GOOGLE_API_KEY', $_ENV['PAHOO_GOOGLE_API_KEY_1']);
  72: else {
  73:     define('GOOGLE_API_KEY', '');
  74: }
  75: 
  76: // 初期値(END) ===============================================================

Gemini API」を利用するには、事前に APIキー を入手する必要がある。「Gemini - 各種クラウド連携サービス(WebAPI)の登録方法」を参考に、APIキー が入手してほしい。取得した APIキー は、.pahooEnv ファイルに記入するか、$GEMINI_API_KEY に格納する。

その他の初期値については、「変更不可」の記載がないかぎり、自由に変更してかまわない。

Gemini API

Gemini API」は、要求データをJSON形式でPOSTで渡し、応答データをJSONで受け取るクラウドAPIである。
URL
URL
https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=(APIキー)
要求データ構造(json) contents parts text プロンプト(テキスト;UTF-8)
応答データ構造(json) candidates content parts text 応答文(テキスト;UTF-8)

解説:Gemini APIにリクエストする

summaryGemini.php

 221: /**
 222:  * Gemini APIにリクエストする
 223:  * @param   string $text  プロンプト(テキスト;UTF-8)
 224:  * @return  string 応答テキスト/FALSE:失敗
 225: */
 226: function geminiRequest($text) {
 227:     $this->webapi = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=' . $this->GEMINI_API_KEY;
 228:     $headers = array(
 229:         'Content-Type: application/json',
 230:     );
 231:     $payload = array(
 232:         'contents' => array(
 233:             'parts' => array(
 234:                 'text' => $text
 235:             )
 236:         )
 237:     );
 238:     $ret = FALSE;
 239: 
 240:     $ch = curl_init();
 241:     curl_setopt($ch, CURLOPT_URL, $this->webapi);
 242:     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
 243:     curl_setopt($ch, CURLOPT_POST, TRUE);
 244:     curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
 245:     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 246:     curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
 247:     curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
 248:     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 249:     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 250: 
 251:     $data = curl_exec($ch);
 252:     if (PHP_VERSION_ID < 80500) {
 253:         curl_close($ch);
 254:     }
 255: 
 256:     // エラー処理
 257:     if ($data == FALSE) {
 258:         $this->errmsg = 'Gemini APIにアクセスできません';
 259:         $ret = FALSE;
 260:     } else {
 261:         $arr = json_decode($data, TRUE);
 262:         if ($arr == FALSE) {
 263:             $this->errmsg = 'Gemini APIの応答が不正です';
 264:             $ret = FALSE;
 265:         } else if (isset($arr['error'])) {
 266:             $this->errmsg = $arr['error']['message'];
 267:         // 正常応答
 268:         } else if (isset($arr['candidates'][0]['content']['parts'][0]['text'])) {
 269:             $ret = (string)$arr['candidates'][0]['content']['parts'][0]['text'];
 270:         } else {
 271:             $this->errmsg = 'Gemini APIの応答が不正です';
 272:             $ret = FALSE;
 273:         }
 274:     }
 275: 
 276:     return $ret;
 277: }

Gemini API へ要求データを送り、応答データを受け取る処理は、cURL関数を使ってユーザー定義メソッド geminiRequest に実装した。

なお、Gemini API を利用する処理は、ユーザー定義クラス pahooGoogleGeminiAPI として分離してある。

解説:テキスト要約

summaryGemini.php

 394: // メイン・プログラム =======================================================
 395: 
 396: // Gemini API インスタンスを用意する.
 397: $pgg = new pahooGoogleGeminiAPI();
 398: 
 399: // パラメータを取得する.
 400: $summary = $errmsg = '';
 401: $maxSize = MAX_SIZE;
 402: $sour    = getValidString('sour', $errmsg, $def=DEF_SOUR, 1, 199);
 403: if ($errmsg == '') {
 404:     $maxSize = mb_strlen($sour);
 405: }
 406: $size = getValidNumber('size', $errmsg, DEF_SIZE, TRUE, (int)($maxSize / 10+ 1, $maxSize);
 407: $opt = getValidNumber('opt', $errmsg, 0, TRUE, 0, 1);
 408: 
 409: // リセット
 410: if (isButton('reset')) {
 411:     $sour = DEF_SOUR;
 412:     $summary = $errmsg = '';
 413: }
 414: 
 415: // Gemini API を利用してテキストを要約する.
 416: if (($errmsg == ''&& isButton('exec'&& ($sour !'')) {
 417:     foreach ($Options as $val=>$label) {
 418:         if ($val == $opt)   break;
 419:     }
 420:     $sentence = '次の文書を、' . $label . 'で、' . $size . '文字以内で要約してください。' . "\n\n" . $sour;
 421:     $summary = $pgg->geminiRequest($sentence);
 422:     $summary = trim($summary);
 423: }
 424: 
 425: // 表示HTMLを作成する.
 426: $HtmlBody = makeCommonBody($sour, $summary, $size, $opt, $errmsg, $pgg);
 427: 
 428: // 画面に表示する.
 429: echo $HtmlHeader;
 430: echo $HtmlBody;
 431: echo $HtmlFooter;
 432: 
 433: // インスタンスを解放する.
 434: $pgg = NULL;

メイン・プログラムは、パラメータの取得やユーザー定義クラス pahooGoogleGeminiAPI のインスタンス化、そして、前述のユーザー定義メソッド geminiRequest を呼び出してテキストの要約を行う。

元のテキスト(要約したいテキスト)を Gemini APIに渡す直前に、「次の文書を、[である調 or ですます調] で、$size 文字以内で要約してください。」という1文を冒頭に付け加えることで、Gemini に要約することを指示する。[である調 or ですます調] と文字数 $size は、テキスト入力時に選択できるようにしてる。文字数指定に利用している jQuery UI の Spinner については、「解説:Spinner - jQuery UI - PHPで素数かどうか判定」をご覧いただきたい。

参考サイト

(この項おわり)
header