読点自動化ツールにPOSTしたい (🍊)

タイトルの🍊は未完を意味しています.未完とは言えちゃんと動くけどね.改善したバージョンの記事も書いてるので併せてどうぞ.

ひとまず2通りの方法を試しました.1つめは実験で,2つ目は本番って感じかな?ちなみに使ったサービスは読点「、」挿入システムというやつです.京都の龍谷大学という大学のドメインにホストされてるね.

1) ローカル端末で curl する

このコマンドで上手くいった.

curl -XPOST \
 -d 'input_sentence=%A4%BD%A4%A6%A4%C0%A4%EF%A4%EC%A4%EF%A4%EC%A4%CB%A4%CF%A4%C7%A4%AD%A4%EB&enter=%CD%BD%C2%AC' \
 http://pumpkin.i.ryukoku.ac.jp/cgi-bin/dokuten_insert/di.cgi \
 | nkf -w

…え?何言ってるか分からん?僕もそう思います.ちょっと簡単に図解してみた.

要するにこんな構造です
  • curl コマンドに -XPOST オプションを付けて実行してる.このときデータは -d で渡すことになる
  • 今回は2つのデータをEUC-JPでURLエンコードして & で連結して渡してる
    • 1つ目は input_sentence=*** というもの.読点を入れるべき文章
    • 2つめは enter=*** というもの.「予測」という文字列をEUC-JPでURLエンコードしたもの (定数)
  • エンドポイントは http://pumpkin.i.ryukoku.ac.jp/cgi-bin/dokuten_insert/di.cgi
  • レスポンスの文字コードが EUC-JP なので, nkf -w UTF-8 に変換

上のサンプルコードでは,下のようなEUC-JPでURLエンコード済みテキストをPOSTしてる.内容は「そうだわれわれにはできる」という文字列です.

%A4%BD%A4%A6%A4%C0%A4%EF%A4%EC%A4%EF%A4%EC%A4%CB%A4%CF%A4%C7%A4%AD%A4%EB

「予測」は定数.こうなる.

%CD%BD%C2%AC

これを実行すると,こんなのが返ってくる.

/**** 前略 ****/

<p&gt;
「、」の位置をシステムが推定した結果です。入力文と変換文を比べてください。どうでしょうか?
</p&gt;

<h3&gt;入力文</h3&gt;
<div style="border: 1mm gray solid; padding:5mm;"&gt;
そうだわれわれにはできる
</div&gt;

<h3&gt;変換文</h3&gt;
<div style="border: 1mm gray solid; padding:5mm;"&gt;
そうだ<font size="5", color="red", style="border: 1mm red solid;"&gt;、</font&gt;われわれにはできる
</div&gt;

/**** 後略 ****/

上手く読点を挿入することができました!この返り値を整形するとこういう出力になる.もっと凝った整形もしたいけど,今回はこんな感じで.

  1. sed -e 's/<[^>]*>//g'タグを削除
  2. 行頭に「変換文」が来る行 (上の例だと12行目) 以降を sed -n '/^変換文/,$p'抽出
変換文

そうだ、われわれにはできる

2) Google App Script からPOSTする

こんなコードでやってみた.関数の名前がイケてないけど,実装途中ということで許してください…

function sendHttpPost(text){
    
    // Endpoint
    var url = 'http://pumpkin.i.ryukoku.ac.jp/cgi-bin/dokuten_insert/di.cgi';
    
    
    // payload を作成
    text = EscapeEUCJP(text);
    var enter = EscapeEUCJP('予測')
    
    var payload = '';
    payload += 'input_sentence=' + text;
    payload += '&amp;';
    payload += 'enter=' + enter;
    
    
    // options を作る
    var options =
    {
        'method' : 'post',
        'payload' : payload
    };
    

    // レスポンスの後半だけ残して,タグを取り除いて,1-2行目を消す
    var res = UrlFetchApp.fetch(url, options).getContentText('EUC-JP');

    res = res.split('<h3&gt;')[2];
    res = res.replace(/<("[^"]*"|'[^']*'|[^'"&gt;])*&gt;/g,''); 
    res = res.replace(/^変換文\n\n/,'');

    return res;

}

Javascript では EUC-JP エンコードができないので,ecl.js というライブラリを使ってる.具体的には EscapeEUCJP() この関数ね.初心者 (僕を含む) のために説明すると,GASでこれを使うには次の2つの作業をすればOK!

  1. ここからJSコードを全部コピー
  2. 新しいスクリプトファイルにペースト
こんな感じ

最後のテキスト整形を除いた状態で,例えば Logger.log(sendHttpPost('そうだわれわれにはできる')); とかを実行すると,さっきも上に載せたようなHTMLのテキストデータが出力されます.これを見ると,テキスト整形パートの res = res.split('<h3>')[2]; の意味も分かるでしょ.

ロガーにHTMLが出た

上のサンプルコードでは以下のテキスト整形で入力文に純粋に読点を挿入しただけの文章を出力してるね.

  1. res.split('<h3>')[2] で変換後のテキストだけを取り出す
  2. res.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g,'')HTMLタグを除去
  3. res.replace(/^変換文\n\n/,'')1-2行目を削除
読点挿入に成功!

もうちょっと長い文章でこの機能を試してみて正しく読点が挿入されるのかを実験してみようと思って意地悪めに長い文章を送りつけみたけどなかなか信頼できるいい結果を返してくれたから結構いい感じだと思います.↓

長い文章でもまぁまぁイケる

読点自動化ツールにPOSTしたい (🍊)” への1件のフィードバック

追加

コメントを残す

Powered by WordPress.com. テーマ: Baskerville 2 by Anders Noren

ページ先頭へ ↑

%d人のブロガーが「いいね」をつけました。