greple -Msubst
greple
は、その名の通り grep
系のツールだが、モジュールで拡張することができて、テキスト処理のフレームワークとして機能する。 subst
モジュールは、辞書データに基づいて用語をチェックしたり修正したりするためのものだ。これについては、以前以下の記事で紹介した。
desumasu-converter
最近、シンプルな方法で日本語の「ですます調」と「である調」を変換するという記事を見かけたので、それを subst
モジュールの辞書として実装してみた。内容については元記事をご覧あれ。
greple -Msubst::desumasu
単に変換するだけなら元のツールを使えばいいので、わざわざ別実装する必要はないのだが、subst モジュールが持つ編集や校正をサポートする機能が使えるようになる。また、元々 greple が持っている範囲指定の機能なども有効なはずだ。
ただ、正直なところ、このツールをそのまま実用に供することはあるまいとも思う。Word や textlint にも類似の機能はあるようだ。まずは、ほぼ互換の機能を実装してみて、ブラッシュアップするための叩き台としてみた。
--dearu オプション:「ですます部」を検索
--dearu
オプションは「ですます調」を「である化」する。単独で使うと辞書にマッチする部分に色をつけて表示する。
--dearu --subst オプション:「である化」
--subst
オプションをつけると、マッチした箇所を「である調」に変換する。たまにおかしいところもあるが、概ね期待したように変換されている。サンプル文書だということもあるが、正直予想以上の結果だ。
--all オプション:全体表示
greple
は、デフォルトではマッチした行しか表示しない。ファイル全体を表示したければ --all
を指定する。
--diff オプション:差分出力
どのように修正されるかを見たい場合は --diff
オプションを指定すると、差分を unified diff の形式で出力する。
cdif:差分の強調表示
これではどこが変わっているのかわかりにくいので、たとえば cdif
コマンドを通すと、こんな風に色を着けることができる。
適用範囲の選択
たとえば引用文など、変換対象外にしたい部分がある場合、greple のオプションで指定することができる。
『
と 』
で囲まれた部分を除外したければ --exclude
オプションに 『.*?』
というパターンを指定して、次のようにする。
greple -Msubst::desumasu --dearu --exclude '『.*?』'
対象部分が複数行に渡る可能性がある場合は (?s)『.*?』
とすれば .
が改行文字にもマッチするようになる。
これ以外にも --inside
, --outside
, --include
, --exclude
オプションを組み合わせることで、様々な領域を指定することができるし、より複雑な構造を指定したい場合には、これらのオプションにパターンではなく関数を与えることもできる。
--overwrite, --replace, --create:ファイルの更新
問題がなければ、ファイルを修正してもいい。--overwrite
オプションを使うと、ファイルの内容を変更する。--replace
オプションでバックアップを作ったり、--create
で別の名前で作ることもできる。
git で管理していればバックアップを作る必要はないし、あると却って散らかって邪魔だ。下の例では、ファイルを更新した後に git diff
の出力を sdif
を通して表示している。
オプション
- --dearu
「ですます調」を「である化」する。- --dearu-n
「ね」を削除しない。 - --dearu-N
「ね」を無視する。
- --dearu-n
- --desumasu
「である調」を「ですます化」する。- --desumasu-n
「ね」を削除しない。 - --desumasu-N
「ね」を無視する。
- --desumasu-n
インストール
~~CPAN には当面リリースする予定はないので、~~インストールは以下の git リポジトリからお願いします。
cpanm https://github.com/kaz-utashiro/greple-subst-desumasu.git
[2022-04-22 追記]
CPAN にリリースしたので、こちらも利用可能です。
cpanm App::Greple::subst::desumasu
git リポジトリ
今後の計画
subst モジュールの辞書は、正誤両方にマッチするパターンに対して、期待する言葉を登録するものだ。現状の DESUMASU 辞書はそのような形になっていないので、作り直す可能性はある。それも、この実装をどのように実用化するかによる。要望等あれば、ここの質問や github の issue でどうぞ。