greple で「ですます調」を「である化」する

# greple -Msubst

`greple` は、その名の通り `grep` 系のツールだが、モジュールで拡張することができて、テキスト処理のフレームワークとして機能する。 `subst` モジュールは、辞書データに基づいて用語をチェックしたり修正したりするためのものだ。これについては、以前以下の記事で紹介した。

https://qiita.com/kaz-utashiro/items/85add653a71a7e01c415

# desumasu-converter

最近、シンプルな方法で日本語の「ですます調」と「である調」を変換するという記事を見かけたので、それを `subst` モジュールの辞書として実装してみた。内容については元記事をご覧あれ。

https://kanasys.com/tech/722

https://github.com/kssfilo/desumasu-converter


# greple -Msubst::desumasu

単に変換するだけなら元のツールを使えばいいので、わざわざ別実装する必要はないのだが、subst モジュールが持つ編集や校正をサポートする機能が使えるようになる。また、元々 greple が持っている範囲指定の機能なども有効なはずだ。

ただ、正直なところ、このツールをそのまま実用に供することはあるまいとも思う。Word や textlint にも類似の機能はあるようだ。まずは、ほぼ互換の機能を実装してみて、ブラッシュアップするための叩き台としてみた。

### --dearu オプション：「ですます部」を検索

`--dearu` オプションは「ですます調」を「である化」する。単独で使うと辞書にマッチする部分に色をつけて表示する。

![スクリーンショット 2021-05-29 15.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/436e0018-12e3-9329-3482-969e5a687fd4.png)

### --dearu --subst オプション：「である化」

`--subst` オプションをつけると、マッチした箇所を「である調」に変換する。たまにおかしいところもあるが、概ね期待したように変換されている。サンプル文書だということもあるが、正直予想以上の結果だ。

![スクリーンショット 2021-05-29 15.09.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/e3220312-267f-4a0c-6a7e-df0797318948.png)

### --all オプション：全体表示

`greple` は、デフォルトではマッチした行しか表示しない。ファイル全体を表示したければ `--all` を指定する。

![スクリーンショット 2021-05-29 15.09.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/326a4025-3e5b-d50f-2cf1-31787df6f2d2.png)

### --diff オプション：差分出力

どのように修正されるかを見たい場合は `--diff` オプションを指定すると、差分を unified diff の形式で出力する。

![スクリーンショット 2021-05-29 21.48.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/d145c83d-9e4c-9db4-98c0-534304bc92f6.png)

### cdif：差分の強調表示

これではどこが変わっているのかわかりにくいので、たとえば `cdif` コマンドを通すと、こんな風に色を着けることができる。

![スクリーンショット 2021-05-29 15.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/833c00c9-2055-5f1a-65c8-efd5d070529e.png)

### 適用範囲の選択

たとえば引用文など、変換対象外にしたい部分がある場合、greple のオプションで指定することができる。

`『` と `』` で囲まれた部分を除外したければ `--exclude` オプションに `『.*?』` というパターンを指定して、次のようにする。

```
greple -Msubst::desumasu --dearu --exclude '『.*?』'
```

対象部分が複数行に渡る可能性がある場合は `(?s)『.*?』` とすれば `.` が改行文字にもマッチするようになる。

これ以外にも `--inside`, `--outside`, `--include`, `--exclude` オプションを組み合わせることで、様々な領域を指定することができるし、より複雑な構造を指定したい場合には、これらのオプションにパターンではなく関数を与えることもできる。

### --overwrite, --replace, --create：ファイルの更新

問題がなければ、ファイルを修正してもいい。`--overwrite` オプションを使うと、ファイルの内容を変更する。`--replace` オプションでバックアップを作ったり、`--create` で別の名前で作ることもできる。

git で管理していればバックアップを作る必要はないし、あると却って散らかって邪魔だ。下の例では、ファイルを更新した後に `git diff` の出力を `sdif` を通して表示している。

![スクリーンショット 2021-05-29 15.12.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36551/cc0462fe-c156-be01-9111-ab824660451f.png)

# オプション

- --dearu
  「ですます調」を「である化」する。
  - --dearu-n
    「ね」を削除しない。
  - --dearu-N
    「ね」を無視する。
- --desumasu
  「である調」を「ですます化」する。
  - --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 リポジトリ

https://github.com/kaz-utashiro/greple-subst-desumasu

# 今後の計画

subst モジュールの辞書は、正誤両方にマッチするパターンに対して、期待する言葉を登録するものだ。現状の DESUMASU 辞書はそのような形になっていないので、作り直す可能性はある。それも、この実装をどのように実用化するかによる。要望等あれば、ここの質問や github の issue でどうぞ。