文書執筆の指南書で解説されている問題点を textlint で発見する

# はじめに

この記事は[文書執筆の指南書で解説されている問題点を RedPen で発見する - Qiita](http://qiita.com/takahi-i/items/a8b994ef17fd66fe6237 "文書執筆の指南書で解説されている問題点を RedPen で発見する - Qiita")の[textlint](https://github.com/textlint/textlint "textlint")版です。

そのため、先に元ネタとなる記事を読んでおく必要があります。

実装の細部は異なりますが、RedPenとtextlintは似たようなルールを持っているので、
それを比較して読みたい人向けの記事となっています。

![linter-atom](https://qiita-image-store.s3.amazonaws.com/0/734/22d0f0ce-bd45-c5d8-c368-99d42225c80d.png)

Atomのプラグインである[linter-textlint](https://github.com/1000ch/linter-textlint "linter-textlint")を使いながら書きました。
(QiitaにはPull Request駆動で書ける仕組みがないので、簡易的なチェックしかしてません)

## 対象とする読者

本稿の対象は論文やマニュアルなどの技術文書を書く人です。本稿を読むにあたって特に専門的な知識は必要ありません。ただし textlint についての記事ですので、[textlintをインストール](https://github.com/textlint/textlint/blob/master/docs/getting-started.md) しておくとよいでしょう。

# 指南書で紹介されている文書の問題点

以下、上記の指南書で解説されている文書の問題点と、textlint による検知方法について解説します。
また、この中で登場するルールは基本的に日本語を対象にしたルールです。

追記(2016-07-13): この辺のルールをまとめたプリセットは以下にあります

- [textlint-ja/textlint-rule-preset-ja-technical-writing: 技術文書向けのtextlintルールプリセット](https://github.com/textlint-ja/textlint-rule-preset-ja-technical-writing "textlint-ja/textlint-rule-preset-ja-technical-writing: 技術文書向けのtextlintルールプリセット")

## 文の長さ

> 「理科系の作文技術」の8章「わかりやすく簡潔な表現」を含め、数多くの文書執筆の指南書で「文は短く簡潔」に書くべきと言われています。長い文を理解するのには時間がかかりますし、そもそも読者が文を理解できない可能性があります。上記の執筆指南書ではありませんが、「[技術文書の書き方](http://www.yamanouchi-yri.com/yrihp/tgb-00/tgb-00-01f.htm)」という資料では文を 100 文字以内にするべきと解説しています。
>
> RedPen では文の長さに関する機能に、[SentenceLength](http://redpen.cc/docs/latest/index_ja.html#sentencelength) があります。SentenceLength は入力文書の中に長すぎる文（センテンス）が見つかるとエラーを出力します。また、私は文を短くする方法について「[文が長すぎる問題とその対処](http://qiita.com/takahi-i/items/54dfd5d466cbc55c7146)」という記事を書きました。あわせて参考にしてください。

textlintでは[textlint-rule-sentence-length](https://github.com/azu/textlint-rule-sentence-length "textlint-rule-sentence-length")のルールで文章の長さをチェックすることができます。

## 言葉の品性

> 技術文書では感情的な単語や、曖昧な単語など利用するべきではない単語があります。たとえば、「文章の書き方」の 17ページ目より「言葉の品性」の解説で利用するべきでない単語について紹介しています。
>
> RedPen が提供する [InvalidExpression](http://redpen.cc/docs/latest/index_ja.html#invalidexpression) は使用するべきでない単語が見つかるとエラーを出力します。ただし、InvalidWord 用の表現辞書は十分でないので、各自気になる表現を追加してください。

textlintでは[textlint-rule-prh](https://github.com/azu/textlint-rule-prh "textlint-rule-prh")で正規表現ベースの辞書を作成できます。

- [textlint + prhで表記ゆれを検出する | Web Scratch](http://efcl.info/2015/09/14/textlint-rule-prh/)
- [azu/technical-word-rules: JavaScript中心のIT技術用語のLint用辞書](https://github.com/azu/technical-word-rules)

英語向けでは、ジェンダーやポリティカルコネクトな単語をチェックする[alex](http://alexjs.com/ "alex")を使った[textlint-rule-alex](https://github.com/azu/textlint-rule-alex "textlint-rule-alex")があります。

細かいものだと!?！？を禁止する[textlint-rule-no-exclamation-question-mark](https://github.com/azu/textlint-rule-no-exclamation-question-mark "textlint-rule-no-exclamation-question-mark")というルールがあります。

## 冗長な表現

>「文章の書き方」では「〜ことができる」や「〜を行う」を冗長な表現として紹介しています。[「することができる」は有害と考えられる」](http://qiita.com/takahi-i/items/a93dc2ff42af6b93f6e0) で紹介したようにスクリプトで冗長表現を検知するとよいでしょう。今後、RedPen >本体でも冗長表現を検知する機能を提供する予定です。

<del>このルールが今のところtextlintにはないです。
冗長な表現という単位が難しいのでルールにしきれてない感じでした。</del>

一部表現に対応したルールがあります。

- [textlint-ja/textlint-rule-ja-no-redundant-expression: 冗長な表現をチェックするtextlintルール](https://github.com/textlint-ja/textlint-rule-ja-no-redundant-expression "textlint-ja/textlint-rule-ja-no-redundant-expression: 冗長な表現をチェックするtextlintルール")

<!-- textlint-disable no-start-duplicated-conjunction -->

## 用語の揺らぎ

> 「文章の書き方」の6ページ、「言葉の揺れ」は、文書で使用する単語（用語）が揺れないようにとアドバイスしています。文書で利用される用語に揺らぎがあると、読者が内容を理解できなくなる恐れがあります。RedPen では、[SuggestExpression](http://redpen.cc/docs/latest/index_ja.html#suggestexpression) という機能で用語の揺らぎに対処します。用語として使うべき単語と、単語の揺らぎのペアを登録していると、文書に単語の揺らぎが現れた時にエラーを出力します。
>
> さらに [@kongou_ae](https://twitter.com/kongou_ae) さんが作成されたプラグイン [redpen-validator](https://github.com/kongou-ae/redpen-validator) を利用すると、ひらがなと漢字の使い分けなどより詳しく文書を検査できます。
>
> また、句読点などのシンボルも文書内で統一されていない場合があります。読みにくさへ大きく影響はしませんが、見栄えが悪いので統一しましょう。この問題に対して RedPen ではシンボルの誤用を検知する [InvalidSymbol](http://redpen.cc/docs/latest/index_ja.html#invalidsymbol) を提供しています。

こちらも[textlint-rule-prh](https://github.com/azu/textlint-rule-prh "textlint-rule-prh")でプロジェクトごとに表記揺れの辞書を作っていく形になると思います。または、[textlint-rule-terminology](https://github.com/sapegin/textlint-rule-terminology "sapegin/textlint-rule-terminology: Textlint rule to check correct terms spelling")を使うことでも辞書管理が出来ます。

textlintは`$ textlint --fix `で辞書を元に自動修正ができるようになっています。

- [textlint 6.0リリース。--fixでの自動修正に対応 | Web Scratch](http://efcl.info/2016/03/15/textlint--fix/ "textlint 6.0リリース。--fixでの自動修正に対応 | Web Scratch")

そのため、後から表記揺れの辞書を追加してまとめて自動修正するという導入方法も取ることができます。

- [style(all): 表記揺れを修正 by azu · Pull Request #124 · azu/JavaScript-Plugin-Architecture](https://github.com/azu/JavaScript-Plugin-Architecture/pull/124 "style(all): 表記揺れを修正 by azu · Pull Request #124 · azu/JavaScript-Plugin-Architecture")
- [techbooster.yml](https://github.com/vvakame/prh/blob/master/misc/techbooster.yml "techbooster.yml")をベースにして漢字の開きなどを後から統一しました。

また、[textlint-rule-preset-JTF-style](https://github.com/azu/textlint-rule-preset-JTF-style "textlint-rule-preset-JTF-style")というプリセットにもひらがなと漢字の使い分けのルールが含まれています。

次の記事でも似たような話が書かれています。

- [ドキュメントの継続的な開発方法 | IIJ Engineers Blog](http://eng-blog.iij.ad.jp/archives/16 "ドキュメントの継続的な開発方法 | IIJ Engineers Blog")

<!-- textlint-enable no-start-duplicated-conjunction -->

## 二重否定

> 二重否定を使用した文は読者の理解を阻害します。「数学文書作法」の 4.2節、「二重否定を避ける」では、二重否定を避ける理由について解説しています。RedPen では [DoubleNegative](http://redpen.cc/docs/latest/index_ja.html#doublenegative) という機能で二重否定の利用を検知します。ただし、実装が十分でないため、検知しきれない事例があります。二重否定が検知できていない例が見つかったら RedPen の Issue に登録していただけますと助かります。

textlintでは[textlint-rule-no-double-negative-ja](https://github.com/azu/textlint-rule-no-double-negative-ja "textlint-rule-no-double-negative-ja")が同様のルールを提供しています。

形態素解析した結果を使い

- なくはない
- ないでもない
- ないものではない
- ないことはない
- ないわけではない
- ないとはいいきれない
- ないとはかぎらない

の[二重否定をチェックする機能を実装](https://github.com/azu/textlint-rule-no-double-negative-ja/blob/master/src/no-doubled-negative-ja.js)しています。

以下の論文などを参考に実装した記憶があります。

- [<研究論文>二重否定表現「～なくは/ もない」「～ないでも/ はない」「～ないことは/ もない」「～ないものでは/ もない」の使い分けを巡って](http://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/187059/1/Ronko3_043.pdf "Ronko3_043.pdf")

## 括弧の利用方法

> 「文章の書き方」の 25ページ目、「注釈と括弧」では必要でない括弧を削るべきと解説しています。括弧があると文が読みにくくなるのです。残念ながら、RedPen では「必要でない括弧」を識別できません。かわりに、RedPen の [ParenthesizedSentence](http://redpen.cc/docs/latest/index.html#parenthesizedsentence) は括弧の用法に制限をかけます。かけられる制限は**長さ**、**入れ子**、**一文に存在してよい数**です。詳しくはマニュアルを参照してください。

[textlint-rule-preset-JTF-style](https://github.com/azu/textlint-rule-preset-JTF-style "textlint-rule-preset-JTF-style")の一部に括弧関連のルールがありますが、textlintもこの辺のルールがありません。

- [JTF日本語標準スタイルガイドのルールセットで文章をチェックできるtextlintプリセット | Web Scratch](http://efcl.info/2015/10/19/textlint-plugin-JTF-style/ "JTF日本語標準スタイルガイドのルールセットで文章をチェックできるtextlintプリセット | Web Scratch")

## 「の」の多用

> 「文章の書き方」の 29ページ目では格助詞「の」の利用に注意するべきという記載があります。格助詞「の」は名詞を接続する便利な助詞ですが、使うと文が曖昧になります。そのため「の」のかわりに、情報量の多い単語で名詞を接続しましょう。RedPen は [JapaneseAmbiguousNounConjunction](http://redpen.cc/docs/latest/index.html#japanese-ambiguous-noun-conjunction) を提供しています。JapaneseAmbiguousNounConjunction は **格助詞の「の」+名詞連続+格助詞の「の」**という「の」の利用でも曖昧性が生じやすいパターンを検知します。

textlintでは[textlint-rule-no-doubled-joshi](https://github.com/azu/textlint-rule-no-doubled-joshi "textlint-rule-no-doubled-joshi")によって、1センテンスに同じ助詞が連続するケースをチェックできます。

[textlint-rule-no-doubled-joshi](https://github.com/azu/textlint-rule-no-doubled-joshi "textlint-rule-no-doubled-joshi")を入れるとかなりのエラーを見つける事ができると思います。
また、このルールはfalse positiveになりやすいので、[判定処理](https://github.com/azu/textlint-rule-no-doubled-joshi#%E5%88%A4%E5%AE%9A%E5%87%A6%E7%90%86 "判定処理")の工夫したり、[例外](https://github.com/azu/textlint-rule-no-doubled-joshi#%E4%BE%8B%E5%A4%96 "例外")の設定など細かく手を入れています。

Thanks @[takahashim](https://github.com/takahashim "takahashim").

## 弱い表現

> 「かもしれない」などの**弱い表現（ぼかした表現）**は技術文書の持つ正確性を損なってしまいます。弱い表現の利用は十分注意してください。ぼかした表現については「数学文書作法」の 2.5章に記述されています。RedPen では [WeakExpression](http://redpen.cc/docs/latest/index_ja.html#weakexpression) という機能で弱い表現を検知します（英語のみ対応）。日本語についても早期に対応致します。

textlintでは[textlint-rule-ja-no-weak-phrase](https://github.com/textlint-ja/textlint-rule-ja-no-weak-phrase "textlint-rule-ja-no-weak-phrase")で弱い表現をチェックすることができます。

次のような表現を弱い表現として認識しています。
基本的には辞書ベースにすぎないので、特殊なアルゴリズムがあるわけではないです。

- 〜かもしれない
- 〜と思う
- 〜と思います

# あきらかな誤り

> 以下の項目は指南書では指摘されていないですが、執筆者がやってしまう、あきらかな誤りです。

<!-- @suppress -->
## 単語の連続使用

> 「私**はは**エンジニアです」のように助詞を連続して書いてしまう場合があります。RedPen は同一単語が連続で使用された箇所を検知する [SuccesiveWord](http://redpen.cc/docs/latest/index_ja.html#successiveword) という機能を提供しています。

textlintではこのルールがまだありません。
こういうtypoはIMEを使うと多いので、何かいいアルゴリズムがあれば実装したいと思います。

上記の例は助詞が連続していたので、[textlint-rule-no-doubled-joshi](https://github.com/azu/textlint-rule-no-doubled-joshi "textlint-rule-no-doubled-joshi")によって偶然見つける事ができました。

![スクリーンショット typo](https://qiita-image-store.s3.amazonaws.com/0/734/a6145163-6e68-9ce6-92d3-2f17c54a43cd.png)

## 同一の節

> 私は「節の順番を換えた際に元あった場所の節を消し忘れた」という事例を知っています。これはケアレスミスと言えますが、同時に長い文書を書いているとどうしても起こってしまう問題です。RedPen の [DuplicateSection](http://redpen.cc/docs/latest/index_ja.html#duplicatedsection)は類似する節（章）を発見するとエラーを出力します。

このルールはtextlintにはないです。
パラグラフか[センテンス](https://github.com/azu/sentence-splitter "sentence-splitter")で類似を判定すれば実装できそうな気がします。

<!-- @suppress -->
## ギャップのある節

> 長い文書を書いていると節間の内包関係に注意がいかず、ミスがおこります。たとえば、以下のサンプルでは 1章の直下に節 1.1.1 が現れています。しかし本来であれば、節 1.1.1 と 1 章の間には節1.1が来なくてはなりません。

```
= 1章
...
=== 節 1.1.1
=== 節 1.1.2
...
```

> RedPen の [GappedSection](http://redpen.cc/docs/latest/index_ja.html#gappedsection) は節の入れ子関係にギャップがあるとエラーを出力します。

textlintはデフォルトのtxt、Markdownに加えて、プラグインで[HTML](https://github.com/textlint/textlint-plugin-html "textlint-plugin-html")、[rst](https://github.com/jimo1001/textlint-plugin-rst "textlint-plugin-rst")、[簡易asciidoc](https://github.com/azu/textlint-plugin-asciidoc-loose "textlint-plugin-asciidoc-loose")、[Re:VIEW](https://github.com/orangain/textlint-plugin-review "textlint-plugin-review")などをサポートしています。

プラグインで任意のフォーマットをサポートできるのもあって、textlintが定める[AST(Abstract Syntax Tree)](https://github.com/textlint/textlint/blob/master/docs/txtnode.md "TxtAST")では、構造に依存する部分については決めていません。
そのため、セクション周りの構造的なルールはファイルフォーマットに依存していることがあります。

Markdownでは[textlint-rule-incremental-headers](https://github.com/matsu-chara/textlint-rule-incremental-headers "textlint-rule-incremental-headers")というルールが同様のことをチェックできます。

- ページの始まりの見出しは#(h1)から始まる。
- ページの始まり以外の見出しで#(h1)が使われていない。(##, ###,...を利用する。)
- 見出しの深さ(h1, h2, h3など)は必ず１つずつ増加する。(h1, h3のように急に深くならない)

# 指南書での記述が発見できていない項目

> 以下、書籍や指南書での記述は発見できていないのですが、私が過去に注意された項目です。

## ですます調、である調

> 日本語には「ですます調」、「である調」があります。この二つの調が一つの文で現れると、文書の品質が疑われる恐れがあります。[JapaneseStyle](http://redpen.cc/docs/latest/index.html#japanesestyle) は文書に両方の表現が現れるとエラーを出力します。残念ながら、RedPen の JapaneseStyle ではですます調、である調の混在を検知できない事例が報告されています。この問題については早めに解決いたします。

textlintでは[textlint-rule-no-mix-dearu-desumasu](https://github.com/azu/textlint-rule-no-mix-dearu-desumasu "textlint-rule-no-mix-dearu-desumasu")のルールで「ですます調」、「である調」の混在をチェックできます。

見出し、本文、箇条書き それぞれでどちらを優先するかというオプションも持っています。
見出しは混在させない、本文は「ですます調」、箇条書きは「である調」というような設定ができます。

これもfalse positiveになりやすいので、デフォルトでは形態素解析して文末の語調をチェックしています。
false positiveになりやすい理由としては「ですます調」、「である調」の明確な定義が存在していないからだと考えています。

## 空の節、章

> 学術雑誌用の論文を書いていた時のことです。論文のある節の直後で小節を開始したところ、査読者から注意を受けました。注意の内容は「学術雑誌用の論文はスペースが充分あるので、小節が開始するまえに節の要約を入れると読者が理解しやくなる」でした。RedPen が提供する [VoidSection](http://redpen.cc/docs/latest/index.html#voidsection) は空（小節が列挙されているだけ）の節を発見するとエラーを出力します。

<del>このルールはまだありません。</del>

次のルールが利用できます。

- [azu/textlint-rule-no-empty-section: textlint rule not allow to create empty section.](https://github.com/azu/textlint-rule-no-empty-section "azu/textlint-rule-no-empty-section: textlint rule not allow to create empty section.")

## 長い漢字の連続

> 私は昔とある書籍を書いていて、[編集者の方から「長い漢字の連続は読みにくい」とい言われました](http://atl.recruit-tech.co.jp/blog/3940)。連続する漢字は、単語の切れ目がわかりにくく読みづらくなります。[LongKanjiChainh](ttp://redpen.cc/docs/latest/index_ja.html#long-kanji-chain) は長過ぎる漢字連続が使用された箇所を教えてくれます。

textlintでは[textlint-rule-max-kanji-continuous-len](https://github.com/azu/textlint-rule-max-kanji-continuous-len "textlint-rule-max-kanji-continuous-len")でチェックできます。

[Further Reading](https://github.com/azu/textlint-rule-max-kanji-continuous-len#further-reading "Further Reading")として書いていますが、デフォルトで6文字以上を「長い漢字」として判定する根拠はありません。

漢字を連続しすぎないことが読みやすさに繋がるという、心理学研究結果はあります。
しかし、この文字数については根拠を見つけられませんでした。

- [日本心理学会第79回大会](http://www.myschedule.jp/jpa2015/search/detail_program/id:602)
- [jpa2015_Michiko_0519_2 - 90737.pdf](http://www.myschedule.jp/jpa2015/img/figure/90737.pdf)

4文字と5文字に壁があり、マージンを取って6文字以上をエラーとする という形でデフォルト値を決めました。
例外のオプションがまだないので、Pull Requestを待っています。

# 実現できていない機能

```
以下、未だ RedPen でサポートできていない項目です。今後この記事とともに順次追加してゆく予定です。

* 順接の「が」
* 「代名詞」の多用
* 「も」の多用
* 同一レベルの節が一つしかない
* 受動態の多用
* 疑問文
```

<del>- 順接の「が」
  - [textlint-rule-no-doubled-conjunctive-particle-ga](https://github.com/takahashim/textlint-rule-no-doubled-conjunctive-particle-ga "textlint-rule-no-doubled-conjunctive-particle-ga")</del>

追記: 順接の「が」ではありませんでした。[コメント欄](http://qiita.com/azu/items/60764ed6f415d3c748bf#comment-7133c760e6c70fbfe9db)を参照

- 「も」の多用
  - [textlint-rule-no-doubled-joshi](https://github.com/azu/textlint-rule-no-doubled-joshi "textlint-rule-no-doubled-joshi")

その他のルールについては[Collection of textlint rule · textlint/textlint Wiki](https://github.com/textlint/textlint/wiki/Collection-of-textlint-rule "Collection of textlint rule · textlint/textlint Wiki")にまとめられいます。

# おわりに
> 著名な文書執筆に関する指南書で述べられている「文書の悪い点」を RedPen で検知する方法について解説しました。今後 RedPen のリリースとともに本文書の内容に修正が加わってゆく予定です。

[文書執筆の指南書で解説されている問題点を RedPen で発見する - Qiita](http://qiita.com/takahi-i/items/a8b994ef17fd66fe6237 "文書執筆の指南書で解説されている問題点を RedPen で発見する - Qiita")の[textlint](https://github.com/textlint/textlint "textlint")版でした。

textlintについて日本語で話すGitterのチャットは以下にあります。
ルールについて気になる事がある人は見てみるといいかもしれません。

[![Gitter](https://badges.gitter.im/textlint-ja/textlint-ja.svg)](https://gitter.im/textlint-ja/textlint-ja)

現状のtextlintは使いやすさよりも作りやすさを優先したデザインになっています。
これは、自然言語には正解がないため、ルールや拡張の作りやすさを高めた方がより面白くなるという予感を元にした設計です。

そのため、textlint本体は日本語や英語といった既存の言語構造に依存しないように気をつけています。
例えば、ある日突然[絵文字言語](https://github.com/textlint/textlint/issues/133)ができた場合にも、その言語に対してルールを書けるような作りとなっている必要があります。

> こういうツールに対しては、「自然言語ってのはコードの正誤ほど簡単に白黒つけられないんだよな〜」といった否定的な見解が避けがたく出てくるものだと思いますが、そうであるからこそ、「唯一の正解」を設けない
> [textlintで日本語テキストの文字校正を試してみた - the code to rock](http://note103.hateblo.jp/entry/2016/06/13/074744 "textlintで日本語テキストの文字校正を試してみた - the code to rock")

また、textlintは類似するアーキテクチャを持つ[ESLint](http://eslint.org/ "ESLint")と違い、ビルトイン(コア)のルールすら存在しません。
これは、ユーザーが自らルールを選ばないと、曖昧性のある結果が出た際にツール自体へ否定的な感情を持つためです。
使いやすさよりも作りやすさが優先されるのもこの辺の考えがあるためです。

逆に使いやすさではChrome上で拡張として動く[textlint: 文章チェッカー](https://chrome.google.com/webstore/detail/textlint-proofreader/hdongmdneapmhfblomidbafplpanpdmm?hl=ja&gl=JP)の方が簡単です。

- [textlint: 文章チェッカー - Chrome ウェブストア](https://chrome.google.com/webstore/detail/textlint-proofreader/hdongmdneapmhfblomidbafplpanpdmm?hl=ja&gl=JP "textlint: 文章チェッカー - Chrome ウェブストア")

ルールを書かないユーザーにとっての使いやすさは、また別レイヤーにあると思います。
そのため、目先の目標として文章に対してCIは回すことがもっと身近にすることと、そこから新しい文章設計の手法を考えることです。

- [textlintをTravis CIで動かして継続的に文章をチェックする - Qiita](http://qiita.com/azu/items/e36501d25593d008f6ac)
- [Travis CIでtextlintの指摘をPull Requestのレビューコメントとして書き込む - Qiita](http://qiita.com/azu/items/c2305f3dded3fda968e0)
- [JavaScript Plugin Architectureというプラグイン設計について学ぶ無料の電子書籍を書いた | Web Scratch](http://efcl.info/2016/06/06/JavaScript-Plugin-Architecture/ "JavaScript Plugin Architectureというプラグイン設計について学ぶ無料の電子書籍を書いた | Web Scratch")

## 参考

- [textlint - pluggable linting tool for text and markdown](http://textlint.github.io/)
- [textlintで日本語の文章をチェックする | Web Scratch](http://efcl.info/2015/09/10/introduce-textlint/)
- [Collection of textlint rule · textlint/textlint Wiki](https://github.com/textlint/textlint/wiki/Collection-of-textlint-rule)