PowerCMS X ブログ

2024-04-05

Typoless (タイポレス) APIをPHPから利用する

Typoless (タイポレス) 別ウィンドウで開きますとは、朝日新聞社が提供する校正支援サービスです。新聞社のノウハウを最先端のAIで実現した新しい校正支援サービスとのことで、PowerCMS Xで校正支援機能を提供している 別ウィンドウで開きますこともあって、その存在には注目していました。

Typolessウェブサイトのスクリーンショット

今年から APIプランの提供が始まっていたこともあり、少し触ってみました。ユーザー登録画面 別ウィンドウで開きますから「API連携プランではじめる」を選択して登録すると、14日間無料(上限は20万文字)で試すことができます。API仕様書は以下にあります。校正 API、カスタム辞書編集 APIが利用できます。

校正 API ( proofread )

<?php
$endPoint = 'https://typoless.asahi.com/web-api/proofread';
$APIKey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // APIキー
$customDictId = 'ABCDEFGH-1234-5678-9IJK-LMNOPQRST'; // カスタム辞書ID
$text = 'Typoless APIのテストてす。満点の星空'; 
$requestBody = ['text' => $text, // 校正したいテキスト
                           'includeRevisedText' => true, // 校正済み文章の取得フラグ(初期値false)
                           'disableTye' => false, // TyE(AIによる校正)の無効化(初期値false)
                           'disableAsahiDict' => false, // 朝日辞書の無効化(初期値false)
                           'disableCustomDict' => false, // カスタム辞書の無効化(未指定の場合、isDefault=trueの辞書を使用する。)
                          ];
if ( $customDictId ) {
    $requestBody['customDictId'] = $customDictId; // カスタム辞書のID
}
$content = json_encode( $requestBody );
$headers = ["Content-type: application/json", "X-Api-Key: {$APIKey}"];
$curl = curl_init( $endPoint );
curl_setopt( $curl, CURLOPT_POST, true );
curl_setopt( $curl, CURLOPT_HTTPHEADER, $headers );
curl_setopt( $curl, CURLOPT_POSTFIELDS, $content );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
$json = curl_exec( $curl );
var_dump( json_decode( $json, true ) );

取得結果は以下の通りです。scoreは範囲は0~1、値が大きいほど自信度が高い、checkTypeが"tye"の場合のみ付与されるとのこと。注意点としては、candidatesは配列になっています(複数の変換候補があるケースのため)。

array(3) {
  ["results"]=>
  array(3) {
    [0]=>
    array(3) {
      ["checkType"]=>
      string(3) "tye"
      ["correction"]=>
      array(4) {
        ["position"]=>
        array(2) {
          ["start"]=>
          int(16)
          ["end"]=>
          int(17)
        }
        ["originalText"]=>
        string(3) "て"
        ["candidates"]=>
        array(1) {
          [0]=>
          string(3) "で"
        }
        ["score"]=>
        float(0.7267)
      }
      ["comment"]=>
      string(10) "て => で"
    }
    [1]=>
    array(3) {
      ["checkType"]=>
      string(10) "asahi_dict"
      ["correction"]=>
      array(3) {
        ["position"]=>
        array(2) {
          ["start"]=>
          int(19)
          ["end"]=>
          int(24)
        }
        ["originalText"]=>
        string(15) "満点の星空"
        ["candidates"]=>
        array(1) {
          [0]=>
          string(12) "満天の星"
        }
      }
      ["comment"]=>
      string(129) "満点の星空 => 満天の星
[誤字・誤用]満点→満天
「満天の星空」は重言。「満天の星」が適切"
    }
    [2]=>
    array(3) {
      ["checkType"]=>
      string(3) "tye"
      ["correction"]=>
      array(4) {
        ["position"]=>
        array(2) {
          ["start"]=>
          int(23)
          ["end"]=>
          int(24)
        }
        ["originalText"]=>
        string(3) "空"
        ["candidates"]=>
        array(1) {
          [0]=>
          string(3) "。"
        }
        ["score"]=>
        float(0.9957)
      }
      ["comment"]=>
      string(10) "空 => 。"
    }
  }
  ["message"]=>
  string(7) "success"
  ["revisedText"]=>
  string(45) "Typoless APIのテストです。満天の星"
}

※ revisedTextに最後の「。」が無いのは不具合?

修正箇所の修正位置(開始・終了)が含まれているので、これを利用して修正を自動化することもできます。ただ、修正前のテキストと修正後のテキストの文字数が同じであるとは限らないため、少し面倒です。

以下は PowerCMS Xでの修正の適用コード。

<?php
require_once( 'class.Prototype.php' );
$app = new Prototype();
$text = $app->param( 'text' );
$corrections = $app->param( 'corrections' );
$pos = 0;
foreach ( $corrections as $idx => $correction ) {
    $correction = json_decode( $correction, true );
    $original = $correction['originalText'];
    $apply = $correction['candidates'][0];
    $correction['candidates'] = $apply;
    if ( $pos !== 0 ) {
        $position = $correction['position'];
        $position['start'] = $position['start'] + $pos;
        $position['end'] = $position['end'] + $pos;
        $correction['position'] = $position;
    }
    $corrections[ $idx ] = $correction;
    $calc = mb_strlen( $apply ) - mb_strlen( $original );
    $pos += $calc;
}
foreach ( $corrections as $correction ) {
    $position = $correction['position'];
    $apply = $correction['candidates'];
    $length = $position['end'] - $position['start'];
    $pre = mb_substr( $text, 0, $position['start'] );
    $after = mb_substr( $text, $position['end'] );
    $text = $pre . $apply . $after;
}
header( 'Content-type: application/json' );
echo json_encode( ['result' => $text ] );
exit();

そのほかに、カスタム辞書(ルール)を追加したり更新したりすることもできます。PowerCMS Xのユーザー辞書と連動するなどの開発もできるかもしれません。

こうなったらいいなのメモ

  • HTMLのタグ混じりの文章をそのまま渡すことができると嬉しい。
  • もうすこし長い範囲で修正前後を拾ってくれると楽かもしれない「て」=>「で」とかだと単純な置換では済まないので(「テストてす」=>「テストです」のように)。
  • 辞書のルール取得や更新のエンドポイントが「/dictionaries/${辞書ID}/rules/${ルールID}」(ルールIDは数字ではなくUUIDのような文字列)なのですが、patternで指定できるか、検索エンドポイントがあるとありがたい。
  • エクスポートした辞書のCSVにルールIDが含まれていると連携して使う場合に便利。
  • 辞書のルール取得APIで件数が増えた時、LIMIT/OFFSETが指定できると良いかもしれない。
  • 「アクセシビリティー」「セキュリティー」など、最後に「ー」が付く形で統一されているようですが、これは、どちらのルールかを選択できると良いように思いました。
  • 利用状況(辞書へのルール登録数、上限まであと何個登録できるか)、月間利用文字数などがわかると良い(※)。

※ APIプランの価格設定的に、ウェブサービスなどの事業者も想定ユーザーになると思うのですが、その場合は利用状況などのデータが取れるとサービスを企画しやすいかもしれません。一方、WEBアプリケーションプランは月額2,200円〜とお手軽価格で APIプランと同じく14日間無料で試せますので、興味のある方はぜひお試しください 別ウィンドウで開きます

カテゴリー:技術情報

投稿者:Junnama Noda

ブログ内検索

アーカイブ