textlint で文章中の表記揺れを、独自のルールをもとに修正する

# やりたいこと

以下は「Soldier グループ」という組織に関する文章です。

> Soldier グループは、会社の中でも特に結束力が強いことで有名です。昨年のプロジェクトでは、Soldier グループが中心となり、大規模なシステムの導入を成功させました。その際、Soldier グループは緻密な計画を立てただけでなく、各部署との連携にも力を入れました。特に、突発的な問題が発生した際の迅速な対応は、ソルジャーチームの強みを見せつける結果となりました。
>
> さらに、ソルジャーグループは単なる業務遂行だけでなく、チーム内のコミュニケーションを大切にしています。毎週金曜日のミーティングでは、各メンバーが意見を出し合い、問題点や改善案を共有します。この取り組みのおかげで、Soldierチームには上下関係を気にせず話し合える風通しの良さが根付いています。また、メンバー同士の信頼関係が強固なため、他部署からの信頼も厚いです。
>
> 最近では、新人メンバーも Soldier group に配属され、スムーズに業務に溶け込んでいます。先輩たちは新人の成長を全力でサポートし、チーム全体でスキルを向上させようという意識が強いです。このように、soldierグループ は成果を出すだけでなく、次世代のリーダーを育てる場としても機能しています。これからも Soldier グループは組織の中核として、多くの人に影響を与え続けることでしょう。

この文章には

- 「ソルジャーグループ」(Soldier がカタカナ)
- 「Soldier チーム」 (グループがチームになっている)
- 「Soldier group」(グループが英語)
- 「soldierグループ」 (soldier の先頭が小文字、かつ英単語とカタカナの間に半角スペースが無い[^1])

と複数の表記揺れがあります。この表記揺れを検知して訂正したいです。

# 前提

Node.js が使用可能であること。この記事では v22.12.0 を使用します。

```shell-session
$ node -v
v22.12.0
```

# 方法

[textlint](https://github.com/textlint/textlint) および [textlint-rule-prh](https://github.com/textlint-rule/textlint-rule-prh) をインストールします。

- textlint
  - 文章の校正を行うためのライブラリ
- textlint-rule-prh
  - 文章の校正を補助する [proofreading-helper (prh)](https://github.com/prh/prh) というライブラリを textlint ルールとして利用できるようにしたもの

```shell-session
$ npm install textlint textlint-rule-prh
```

textlint の設定ファイルとして `.textlintrc.json` を、prh での校正ルールとして `prh_rules.yml` を用意します。後者は YAML ファイルであれば任意のファイル名で OK です。

```.textlintrc.json
{
  "rules": {
    "prh": {
      "rulePaths": [
        "./prh_rules.yml"
      ]
    }
  }
}
```

```prh_rules.yml
version: 1
rules:
  - expected: Soldier グループ
    pattern:
      - /([sS]oldier|ソルジャー)\s?(チーム|グループ|[tT]eam|[gG]roup)/
    specs:
      - from: Soldier team
        to: Soldier グループ
      - from: Soldierチーム
        to: Soldier グループ
      - from: ソルジャーチーム
        to: Soldier グループ
      - from: soldierグループ
        to: Soldier グループ
```

prh の校正ルール (YAML) の書き方は textlint-rule-prh の README.md を参考にしてください。

- [textlint-rule/textlint-rule-prh > README.md > prh format](https://github.com/textlint-rule/textlint-rule-prh/blob/master/README.md#prh-format)

それでは前述の文章を about_solder_group.txt というテキストファイルに保存し、textlint を実行します。

```shell-session
$ npx textlint about_solder_group.txt

/Users/quanon/Documents/about_solder_group.txt
  1:160  ✓ error  ソルジャーチーム => Soldier グループ    prh
  3:5    ✓ error  ソルジャーグループ => Soldier グループ  prh
  3:107  ✓ error  Soldierチーム => Soldier グループ       prh
  5:14   ✓ error  soldier group => Soldier グループ       prh
  5:104  ✓ error  soldierグループ => Soldier グループ     prh

✖ 5 problems (5 errors, 0 warnings)
✓ 5 fixable problems.
```

prh が 4 件の表記揺れを発見してくれました。同様のコマンドを `--fix` オプションを指定して実行します。

```shell-session
$ npx textlint --fix about_solder_group.txt

/Users/quanon/Documents/about_solder_group.txt
  1:160  ✔   ソルジャーチーム => Soldier グループ    prh
  3:5    ✔   ソルジャーグループ => Soldier グループ  prh
  3:107  ✔   Soldierチーム => Soldier グループ       prh
  5:14   ✔   soldier group => Soldier グループ       prh
  5:104  ✔   soldierグループ => Soldier グループ     prh

✔ Fixed 5 problems

$ npx textlint about_solder_group.txt # 修正済みなので再実行しても何も出力されない
```

テキストファイルで置換が行われ、表記揺れを修正することができました！

# 参考

- [textlint/textlint: The pluggable natural language linter for text and markdown.](https://github.com/textlint/textlint)
- [textlint-rule/textlint-rule-prh: textlint rule for prh.](https://github.com/textlint-rule/textlint-rule-prh)
- [prh/prh: proofreading helper](https://github.com/prh/prh)
- [textlint + prhで表記ゆれを検出する | Web Scratch](https://efcl.info/2015/09/14/textlint-rule-prh/)

[^1]: 英単語の日本語の間に半角スペースを入れるのは僕個人のこだわりで、普通は入れないことが多いと思います。しかし、この半角スペースが無いように統一したい場合にもこの方法は役立つでしょう。