文章を書く時、文法的な誤りや用語の揺らぎは避けたいものです。しかし、自分だけでは気づかないところがあったり、煩雑すぎたりする場合があります。そこで、textlintというツールを使えば、文章の校正を行うことができます。本記事では、textlintについて詳しく紹介し、文章の校正に役立てる方法を解説します。
今回試したコードはhttps://github.com/t0k0sh1/emendationにあります。
textlintがチェック対象としているのは、テキストファイルやマークダウンファイルなどのテキストファイルのみです。WordやExcelなどのファイルを処理する場合はテキストを抽出するなどの工夫をする必要があります。
textlintの導入
自然言語向けのLinterであるtextlintを導入します。
ここでは、校正チェックを行うプロジェクトemendation
を作成します。textlint
はNode.jsで利用可能はパッケージですので、npm init
コマンドで初期化しておきます。
$ mkdir emendation
$ cd emendation
$ npm init -y
textlintのインストール
textlintをインストールします。特段前提条件となるパッケージやライブラリはなく、普通にインストール可能です。
$ npm install textlint
ルールプリセットのインストール
次にルールプリセットをインストールします。技術書や技術系の記事、設計書の執筆を行っている場合は、技術書向けのルールを使用するのがよいでしょう。
$ npm install textlint-rule-preset-ja-technical-writing
lintスクリプトの設定
package.json
にlint
を実行できるスクリプトを追加します。files
ディレクトリ内にあるテキストファイルを対象にするようにしています。
"scripts": {
"lint": "textlint ./files/*.txt"
},
ルールの適用方法
textlintで使用するルールを適用する方法には、以下の2つの方法があります。
- textlintコマンドに
—preset
オプションで使いたいルールを指定する .textlintrc.json
に適用するルールを記述する
実用上は細かいカスタマイズを必要とするため、後者の方法でルールを適用するようにします。
まずは、textlint --init
コマンドで.textlintrc.json
ファイルを作成します。
$ textlint --init
.textlintrc.json is created.
コマンドを実行すると以下のようなファイルが生成されます。
{
"plugins": {},
"filters": {},
"rules": {}
}
生成時点ではルールは何も設定されていません。先ほどインストールしたルールプリセットを適用する記述を追加します。
{
"plugins": {},
"filters": {},
"rules": {
"preset-ja-technical-writing": true
}
}
動作を確認するために、filesディレクトリに以下のようなsample.txtを作成します。
Vueで作成した確認ダイアログを表示し、OKボタンをクリックしたときだけ処理を続行する方法をボタンクリックの場合とフォームを使ったサブミットの2パターンの実装方法を見ていきました
この考え方は他のフレームワークでも適用可能です。今回はVue 3.3.4で動作確認していますが、Vue 3で実装された機能を使っていないため、Vue 2でも動作すると思います。
このファイルは1行目の「。」が漏れているので、この点が検出されると思います。
では、実際に実行してみます。
$ npm run lint
> emendation@1.0.0 lint
> textlint ./files/*.txt
/Users/t0k0sh1/Workspace/emendation/files/sample.txt
1:89 error 文末が"。"で終わっていません。 ja-technical-writing/ja-no-mixed-period
2:84 error 弱い表現: "思います" が使われています。 ja-technical-writing/ja-no-weak-phrase
✖ 2 problems (2 errors, 0 warnings)
2つのエラーが検出されました。
1つは想定どおり「。」が漏れていることを検出していますが、もう1つは想定していなかったエラーです。このエラーは「〜だと思う」という弱い言い回しを検出しているようです。
ルールのカスタマイズ①不要なルールの抑止
不要なルールの抑止の説明を行うためにja-no-weak-phrase
のルールを無効化してみます。以下のように記述することでルールを無効化できます。
{
"plugins": {},
"filters": {},
"rules": {
"preset-ja-technical-writing": {
"ja-no-weak-phrase": false
}
}
}
では、再度実行してルールが抑止されていることを確認します。
$ npm run lint
> emendation@1.0.0 lint
> textlint ./files/*.txt
/Users/t0k0sh1/Workspace/emendation/files/sample.txt
1:89 error 文末が"。"で終わっていません。 ja-technical-writing/ja-no-mixed-period
✖ 1 problem (1 error, 0 warnings)
先ほどまで検知されていたja-no-weak-phrase
のルールが検知されなくなっていることが確認できました。
ルールのカスタマイズ②独自の辞書ルールの追加
辞書ルールを定義するファイルを作成することで、独自の辞書ルールを追加することが可能です。
ファイル名に制約はないですが、ここではprh.yaml
ファイルを作成します。
まずはルールを使用するように定義を修正します。
{
"plugins": {},
"filters": {},
"rules": {
"preset-ja-technical-writing": {
"ja-no-weak-phrase": false
},
"prh": {
"rulePaths": ["./prh.yml"]
}
}
}
次に辞書ルールを定義します。
version: 1
rules:
- expected: View
patterns:
- Vue
ここでは動作を確認するために、View
をVue
とタイポする想定でルールを作成しています。expected
に正しい書き方、patterns
に誤った書き方を記述します。
$ npm run lint
> emendation@1.0.0 lint
> textlint ./files/*.txt
/Users/t0k0sh1/Workspace/emendation/files/sample.txt
1:1 ✓ error Vue => View prh
1:89 error 文末が"。"で終わっていません。 ja-technical-writing/ja-no-mixed-period
2:28 ✓ error Vue => View prh
2:49 ✓ error Vue => View prh
2:72 ✓ error Vue => View prh
✖ 5 problems (5 errors, 0 warnings)
✓ 4 fixable problems.
Try to run: $ textlint --fix [file]
Vue
がエラーとして検出できることを確認しました。
辞書ルールを定義することで、固有名詞の揺らぎや言い回しの不統一などを検知することが可能になります。
辞書ルール定義の発展した方法
辞書ルールが増えたときに管理が煩雑になりがちです。これを解消するために辞書ルールを分割することを考えます。
以下のように記述することで、ルールを外出しすることが可能です。
version: 1
imports:
- ./rules/すでに.yml
- ./rules/かつ.yml
- ./rules/また.yml
さらに各ルールを指定パスに定義しておきます。
version: 1
rules:
- expected: すでに
patterns:
- 既に
version: 1
rules:
- expected: かつ
patterns:
- /且つ|且/
version: 1
rules:
- expected: また$1
patterns:
- /又(、|は|は、)/
specs:
- from: 又
- to: また
この例は、副詞をひらく書き方を正として、ひらいていない書き方を検出するルールとなります。
以下のように例文を用意して動作確認します。
既に会議は始まっており、私たちは遅れている。且つ、プレゼンテーション資料もまだ完成していない。又は、次の会議までに資料を仕上げ、改めて説明することも一つの選択肢だ。
以下が実行結果です。
$ npm run lint
> emendation@1.0.0 lint
> textlint ./files/*.txt
/Users/t0k0sh1/Workspace/emendation/files/sample.txt
1:1 ✓ error 既に => すでに prh
1:23 ✓ error 且つ => かつ prh
1:48 ✓ error 又は => または prh
1:75 ✓ error 一つ => 1つ
数量を表現し、数を数えられるものは算用数字を使用します。任意の数に置き換えても通用する語句がこれに該当します。 ja-technical-writing/arabic-kanji-numbers
✖ 4 problems (4 errors, 0 warnings)
✓ 4 fixable problems.
Try to run: $ textlint --fix [file]
辞書ルールで定義した箇所が検出されることが確認できます。
自動訂正を行う
textlintにはルールによって自動訂正を行うことができます。–fixオプションを使うことで、訂正可能なルールについて自動的に訂正を行うことが可能です。
package.json
にlint:fix
スクリプトを追加します。
"scripts": {
"lint": "textlint ./files/*.txt",
"lint:fix": "textlint --fix ./files/*.txt"
},
先ほどチェックしたテキストに対して、lint:fix
コマンドを実行することで、自動訂正されることを確認します。
まずは、修正前のテキストを再掲します。
既に会議は始まっており、私たちは遅れている。且つ、プレゼンテーション資料もまだ完成していない。又は、次の会議までに資料を仕上げ、改めて説明することも一つの選択肢だ。
再度、チェックのみを行います。
$ npm run lint
> emendation@1.0.0 lint
> textlint ./files/*.txt
/Users/t0k0sh1/Workspace/emendation/files/sample.txt
1:1 ✓ error 既に => すでに prh
1:23 ✓ error 且つ => かつ prh
1:48 ✓ error 又は => または prh
1:75 ✓ error 一つ => 1つ
数量を表現し、数を数えられるものは算用数字を使用します。任意の数に置き換えても通用する語句がこれに該当します。 ja-technical-writing/arabic-kanji-numbers
✖ 4 problems (4 errors, 0 warnings)
✓ 4 fixable problems.
Try to run: $ textlint --fix [file]
検出したエラーのうち、チェックマークがついているものが自動訂正可能なものです。できないものもありますが、今回検出したエラーはすべて自動訂正可能です。
では、lint:fix
コマンドを実行して自動訂正します。
$ npm run lint:fix
> emendation@1.0.0 lint:fix
> textlint --fix ./files/*.txt
/Users/t0k0sh1/Workspace/emendation/files/sample.txt
1:75 ✔ 一つ => 1つ
数量を表現し、数を数えられるものは算用数字を使用します。任意の数に置き換えても通用する語句がこれに該当します。 ja-technical-writing/arabic-kanji-numbers
1:1 ✔ 既に => すでに prh
1:23 ✔ 且つ => かつ prh
1:48 ✔ 又は => または prh
✔ Fixed 4 problems
メッセージからも訂正されたことが確認できますが、修正後のテキストも確認しておきます。
すでに会議は始まっており、私たちは遅れている。かつ、プレゼンテーション資料もまだ完成していない。または、次の会議までに資料を仕上げ、改めて説明することも1つの選択肢だ。
検知された点が修正されていることが確認できました。
ルールを書くときの注意点(正規表現)
「かつ」が正しい書き方だとした場合、誤った書き方は「且つ」または「且」となります。このような場合、正規表現で長い方を先に書くようにすることで、「且つ」を「かつつ」に訂正しないようにできます。
version: 1
rules:
- expected: かつ
patterns:
- /且つ|且/
また、「又」が誤った書き方で「また」に訂正したい場合、「又」が別の単語で使われていてそちらを訂正しないようにするためには、正規表現で接続詞としての「又」のみを検知しつつ、適切に訂正できるようになります。この例では、正規表現(、|は|は、)
部分は$1
で充当されるため、「又は」は「または」に訂正されるようになります。
version: 1
rules:
- expected: また$1
patterns:
- /又(、|は|は、)/
正規表現の設定ミスなどにより思わぬ訂正が行われる可能性もあります。必ずチェックで正しく検出できているかを確認のうえ、訂正するようにしてください。
まとめ
textlintは、文章の自動校正ツールとして非常に優れています。自己チェックと併用してtextlintを使うことで、より良い文章を効率的に作成することができるようになるでしょう。ぜひ、textlintを使ってみてください。