山下泰平の趣味の方法

これは趣味について考えるブログです

AI を使って校正できるようにした

Emacs で校正できるようになった

昔からなんどか Emacs で校正できるようにしようと考えてたんだけど、なかなか良い方法がなかった。キーを叩くと書いてる文書を Word 形式に変換し、 Word が開いて校正を自動で実行みたいなことをできるようにした記憶があるんだけど、面倒くさくてあまり使わなかった。

それでずっと放置していたら AI がすごく使えるものになっていたので AI を使い校正できるようにした。私が使っているのは Emacs だけど、拡張性のあるエディタならなんでできるし、今さら新たに Emacs を使い始めるのは正気じゃない。だから別のエディタを使ったほうが良いと思う。私は Emacs を使っているけど org-mode を使っていないし Dvorak 配列で入力しているみたいな感じなので不便しかない。メジャーなものを使うのが良いと思われるというわけで、以下の手順で校正ができるようになる。

API を使えるようにする

Geminiは無料で使える。

https://ai.google.dev/gemini-API/docs?hl=ja

ChatGPT は金をチャージみたいなのをすると API 経由で使えるようになる。

OpenAI Platform

こういうの分からないで迷ってる人いるかもしれないので参考までに書いておくと ChatGPT を使うとものすごい金が減るイメージだったけど、そうでもない。

計算したら10ドルくらいで本一冊分くらいの校正ができる雰囲気だった。

エディタの中で AI を使えるようにする

Emacs で校正するなら Cahtgpt-shell(https://github.com/xenodium/chatgpt-shell) が良いと思う。(本格的にバリバリ拡張を書くのであれば gptel.el が良さそう)

chatgpt-shell.el の使い方

最初から AI が使えるエディタもあるので、過去の資産がなければ、そういうのを選んで使ったほうが良いと思う。

プロンプトを作る

プロンプトというのは、AI に何を求めるかを指定するもので、丁寧に指示を出すと、AI の出力も良くなる。

自分がなにができて、なにをしてもらいたいかを明確にする。人間相手にこんな指示を出してるんだとしたら威張ってるみたいで微妙だが、 AI にははっきり伝えたほうがいい。


** 目標

あなたは誠実かつスマートに校正をする。

戦前の文化に関する書籍の校正を行う。

書き手は戦前の文化の知識を持ち、文章スキルもある。

文法上の誤り、誤字脱字を修正する。

誤字と脱字を重点的に修正する。

半角と全角の統一はしない。

戦前の文化に関する書籍向けの文章を完璧に校正する。

** 全般的な指示

文書はMarkdown形式で書かれている。

変更がない時にはコメントをつけない。

漢数字は漢数字のままとする。

「ですます調」と「である調」に変更を加えない。

「」内の文章は引用の可能性があるため、誤字脱字のみ修正し、文法の修正は行わない。

Markdown形式で引用と認識される部分は、誤字脱字のみ修正し、文法の修正は行わない。

変更点のみを箇条書きで出力し、変更前の文と変更後の文を区別し行頭を揃えて表示する。

以下が本文で、これを校正する。


プロンプトは使いながら調整する。面倒くさいけど仕方ない。

面倒くさいので AI に拡張を書かせた

一括で構成箇所を反映というようなことは ChatGPT-shell だと chatgpt-shell-proofread-region でできるんだけど、AI の校正を受け入れるかどうかは自分で決めたい。なので、AI には変更点のみを出力してもらい、自分で変更を反映させるようにしている。校正を実行すると、次のような画面になる。

校正の結果を流し読みてい、修正しようと思った場合に元ファイルに移動し、内容を反映させないといけないんだけど面倒くさい。だから AI に拡張を書いてもらうことにした。

emacs に次の機能を付けたいです。

  1. カーソルの上の前後2文字を記録
  2. 別のウィンドウに移動
  3. 検索して前後2文字に該当する場所に移動

これを ChatGPT に投げると、次のようなコードが返ってきた。

(defun jump-to-context-in-upper-window ()
  "カーソル前後2文字を取得し、上のウィンドウへ移動してその文字列を検索する関数。
カーソル位置の前後2文字を結合して検索文字列とし、
上のウィンドウのバッファ先頭からその文字列を検索します。"
  (interactive)
  (let* ((pre (buffer-substring-no-properties
               (max (point-min) (- (point) 2))
               (point)))
         (post (buffer-substring-no-properties
                (point)
                (min (point-max) (+ (point) 2))))
         (context (concat pre post)))
    (condition-case nil
        (progn
          ;; 上のウィンドウへ移動
          (windmove-up)
          ;; バッファ先頭に移動してから検索
;          (goto-char (point-min))
          (if (search-forward context nil t)
              (message "文字列「%s」が見つかりました。" context)
            (message "文字列「%s」は見つかりませんでした。" context)))
      (error (message "上のウィンドウが存在しません。")))))

「上のウィンドウのバッファ先頭からその文字列を検索」する必要はないので、そこは機能しないようにした。あとは普通に使えている。なんでこれが動いてるのかは不明、とにかく動いている。文字を置き換えるついでに書き直すというようなこともするので、これで十分だという判断、置き換えるか置き換えないかを質問してもらって、置き換える場合は置き換える、置き換えない場合は次の箇所に移動するという感じにしてもいいと思うし AI に頼んだら書いてもらえるんだけど、誤字を修正するついでに書き直すのか、そのまま置き換えるのか判断が生じて面倒くさいので、しばらくこのまま使い続けると思う。

まとめ

自分ではなんの努力もしていないし、全く意味不明でよく分からないが、校正できるようになった。ついでに Copilot で文章の補完もできるようにしたけど、こちらは低調、しばらく放置してたら、自分ではなんの努力もしていないし、全く意味不明でよく分からないが、なんか文章を勝手に書いてくれるようになったみたいになって欲しいのでみんなに頑張ってもらいたい。