CUBE SUGAR CONTAINER

技術系のこと書きます。

RedPen で技術文書を校正する

今回は RedPen というオープンソースの文書校正ツールを使ってみる。 こういったツールを使うことで、文書の典型的な誤りや読みにくいところを見つけやすくなる。 似たようなツールとしては textlint なんてのもある。

環境は次の通り。

$ sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G1114
$ brew --version
Homebrew 1.4.1
Homebrew/homebrew-core (git revision dcf9; last commit 2017-12-29)

インストール

まずは Homebrew を使って RedPen をインストールする。

$ brew install redpen
$ redpen --version
1.10.1

デフォルトの設定ファイルを用意する

RedPen の動作には XML で書かれた設定ファイルが必要になる。 そこで、デフォルトで用意されている設定ファイルをコピーしてこよう。

$ brew ls redpen | grep conf 
/usr/local/Cellar/redpen/1.10.1/libexec/conf/logback.xml
/usr/local/Cellar/redpen/1.10.1/libexec/conf/redpen-conf-en.xml
/usr/local/Cellar/redpen/1.10.1/libexec/conf/redpen-conf-ja.xml
/usr/local/Cellar/redpen/1.10.1/libexec/conf/redpen-conf-plugin.xml
$ cp /usr/local/Cellar/redpen/1.10.1/libexec/conf/redpen-conf-ja.xml my-redpen-conf.xml

使ってみる

設定ファイルが準備できたら、早速試してみよう。 例えば、次のようにタイポのある文書を用意する。

$ echo "これはは嬉しい" > sample.txt

あとは -c オプションで設定ファイルを指定しつつ redpen コマンドを上記の文書に対して実行する。

$ redpen -c my-redpen-conf.xml sample.txt
[2017-12-31 18:23:56.046][INFO ] cc.redpen.Main - Configuration file: /Users/amedama/Documents/temporary/my-redpen-conf.xml
[2017-12-31 18:23:56.054][INFO ] cc.redpen.config.ConfigurationLoader - Loading config from specified config file: "/Users/amedama/Documents/temporary/my-redpen-conf.xml"
[2017-12-31 18:23:56.086][INFO ] cc.redpen.config.ConfigurationLoader - Succeeded to load configuration file
[2017-12-31 18:23:56.087][INFO ] cc.redpen.config.ConfigurationLoader - Language is set to "ja"
[2017-12-31 18:23:56.087][WARN ] cc.redpen.config.ConfigurationLoader - No variant configuration...
[2017-12-31 18:23:56.166][INFO ] cc.redpen.config.ConfigurationLoader - No "symbols" block found in the configuration
[2017-12-31 18:23:56.169][INFO ] cc.redpen.config.SymbolTable - "ja" is specified.
[2017-12-31 18:23:56.170][INFO ] cc.redpen.config.SymbolTable - "zenkaku" variant is specified
[2017-12-31 18:23:56.756][INFO ] cc.redpen.parser.SentenceExtractor - "[。, ?, !]" are added as a end of sentence characters
[2017-12-31 18:23:56.757][INFO ] cc.redpen.parser.SentenceExtractor - "[’, ”]" are added as a right quotation characters
[2017-12-31 18:23:57.086][INFO ] org.reflections.Reflections - Reflections took 49 ms to scan 1 urls, producing 6 keys and 58 values 
[2017-12-31 18:23:57.181][WARN ] cc.redpen.validator.ValidatorFactory - cc.redpen.validator.section.VoidSectionValidator is deprecated
[2017-12-31 18:23:57.186][WARN ] cc.redpen.validator.ValidatorFactory - cc.redpen.validator.sentence.SpaceBeginningOfSentenceValidator is deprecated
[2017-12-31 18:23:57.205][INFO ] org.reflections.Reflections - Reflections took 3 ms to scan 1 urls, producing 175 keys and 180 values 
[2017-12-31 18:23:57.215][INFO ] cc.redpen.util.DictionaryLoader - Succeeded to load InvalidExpressionValidator default dictionary.
[2017-12-31 18:23:57.226][INFO ] cc.redpen.util.DictionaryLoader - Succeeded to load double negative expression rules.
[2017-12-31 18:23:57.226][INFO ] cc.redpen.util.DictionaryLoader - Succeeded to load double negative words.
[2017-12-31 18:23:57.230][INFO ] cc.redpen.validator.JavaScriptValidator - JavaScript validators directory: js
sample.txt:1: ValidationError[SuccessiveWord], Found word "は" repeated twice in succession. at line: これはは嬉しい
sample.txt:1: ValidationError[JapaneseJoyoKanji], Found non-joyo kanji: "嬉" at line: これはは嬉しい

[2017-12-31 18:23:57.269][ERROR] cc.redpen.Main - The number of errors "2" is larger than specified (limit is "1").

すると、タイポしている点と「嬉」という漢字が常用漢字でないことを RedPen が教えてくれた。

ちなみに RedPen 自体のデバッグ用出力がうっとおしいときは標準エラー出力を捨ててしまうと良い。

$ redpen -c my-redpen-conf.xml sample.txt 2>/dev/null
sample.txt:1: ValidationError[SuccessiveWord], Found word "は" repeated twice in succession. at line: これはは嬉しい
sample.txt:1: ValidationError[JapaneseJoyoKanji], Found non-joyo kanji: "嬉" at line: これはは嬉しい

ただ、たまに重要なことが出力されていたりもするので設定ファイルをいじった直後なんかはいきなり捨てない方が良いかも。

上記の問題を修正してやれば RedPen は何も言わなくなる。

$ echo "これはうれしい" > sample.txt
$ redpen -c my-redpen-conf.xml sample.txt 2>/dev/null

設定ファイルのカスタマイズ

先ほどの例ではデフォルトの設定ファイルを使って文書をチェックした。 けど、もちろんどんなことをチェックしたいかは人だったり文書によって異なる。 そのため、どういったチェックをする・しないについて設定ファイルのカスタマイズが重要になってくる。

ちなみに、チェックできる内容の全ては公式ドキュメントを参照すると良い。

RedPen 1.10 ドキュメント

ただし、今回はその中の一部について紹介していく。

一行の長さをチェックする

例えば文章の一行の長さが長すぎると、どうがんばっても読みにくくなる。

一行の長さについては SentenceLength バリデータでチェックできる。 例えば、以下は一行の長さが 100 文字を超えると指摘するようにした場合。

$ grep -A 2 SentenceLength my-redpen-conf.xml
        <validator name="SentenceLength">
            <property name="max_len" value="100"/>
        </validator>

一行が 101 文字のテキストファイルを作ってみよう。

$ python -c "print('A' * 101)" > sample.txt
$ cat sample.txt
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

上記のファイルを RedPen にかけると ValidationError になる。

$ redpen -c my-redpen-conf.xml sample.txt 2>/dev/null
sample.txt:1: ValidationError[SentenceLength], The length of the sentence (101) exceeds the maximum of 100. at line: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

試しに上限を 120 文字に引き上げてみよう。

$ grep -A 2 SentenceLength my-redpen-conf.xml
        <validator name="SentenceLength">
            <property name="max_len" value="120"/>
        </validator>

今度は何も言われない。

$ redpen -c my-redpen-conf.xml sample.txt 2>/dev/null

読点の数をチェックする

読点がたくさんあるような文は、構造が複雑だったりして読みにくい場合がある。 こういった内容も RedPen でチェックできる。

$ echo "点が、一文に、いっぱい、あると、だめ" > sample.txt
$ redpen -c my-redpen-conf.xml sample.txt 2>/dev/null     
sample.txt:1: ValidationError[CommaNumber], The number of commas (4) exceeds the maximum of 3. at line: 点が、一文に、いっぱい、あると、だめ

読点の数は CommaNumber バリデータでチェックできる。

$ grep CommaNumber my-redpen-conf.xml 
        <validator name="CommaNumber"/>

不適切な言い回しをチェックする

こういった言い回しは文書に含めたくない、といったユースケースもある。 例えば汚い言葉やスラングとかね。

$ echo "罵詈" > sample.txt

そういったときは InvalidExpression バリデータを使う。 言い回しを設定するには二つの方法があって、例えば以下は設定ファイルにべた書きするときの例。 <property> タグの name 要素に list を指定して、value にカンマ区切りで言葉を入れていく。

$ grep -A 2 InvalidExpression my-redpen-conf.xml
        <validator name="InvalidExpression">
            <property name="list" value="罵詈,雑言" />
        </validator>

文章に指定した言葉が入っていると InvalidExpression になる。

$ redpen -c my-redpen-conf.xml sample.txt 2>/dev/null
sample.txt:1: ValidationError[InvalidExpression], Found invalid expression "罵詈". at line: 罵詈
sample.txt:1: ValidationError[JapaneseJoyoKanji], Found non-joyo kanji: "詈" at line: 罵詈

もう一つの指定方法を使うときは、改行区切りで言葉をリストアップしたテキストファイルを用意する。

$ cat << 'EOF' > ng-expressions.txt
罵詈
雑言
EOF

今度は、<property> タグの name 要素に dict を指定した上で value に上記テキストファイルの名前を指定する。

$ grep -A 2 InvalidExpression my-redpen-conf.xml    
        <validator name="InvalidExpression">
            <property name="dict" value="ng-expressions.txt" />
        </validator>

機能的には同じだけど、最初のやり方では言葉が多いときに設定ファイルが読みにくくなる。 基本的には後者を使った方が良いのかな。

$ redpen -c my-redpen-conf.xml sample.txt 2>/dev/null
sample.txt:1: ValidationError[InvalidExpression], Found invalid expression "罵詈". at line: 罵詈
sample.txt:1: ValidationError[JapaneseJoyoKanji], Found non-joyo kanji: "詈" at line: 罵詈

文章の揺れや望ましい表現がある言葉をチェックする

より適切な言い回しがあったり、複数の表記方法があるときに「揺れ」を防ぐには SuggestExpression バリデータを使う。

デフォルトではコメントアウトされている。

$ grep SuggestExpression my-redpen-conf.xml 
        <!--<validator name="SuggestExpression" />-->

使ってみることにしよう。 例として、場合によってはひらがなに開いたほうが良いとされる表現「更に」を含む文章を用意する。

$ echo "更に革新的な" > sample.txt

バリデータのコメントアウトを外して、「更に」は「さらに」が適切なんだよと次のように設定ファイルに記載する。

$ grep -A 2 SuggestExpression my-redpen-conf.xml
        <validator name="SuggestExpression">
            <property name="map" value="{更に,さらに}" />
        </validator>

すると RedPen が「こっちを使った方が良いよ!」と教えてくれるようになる。

$ redpen -c my-redpen-conf.xml sample.txt 2>/dev/null     
sample.txt:1: ValidationError[SuggestExpression], Found invalid word "更に". Use the synonym "さらに" instead. at line: 更に革新的な

こちらも、先ほどの InvalidExpression バリデータと同様に、上記の対応関係を外部のテキストファイルに記載できる。 このファイルでは、言い換える前の言葉を最初に入れて、タブで区切ってより適切な言葉を後ろに指定する。

$ cat << 'EOF' > suggest-expressions.txt 
更に  さらに
EOF

この通り外部のテキストファイルを使ってチェックできるようになった。

$ grep -A 2 SuggestExpression my-redpen-conf.xml
        <validator name="SuggestExpression">
            <property name="dict" value="suggest-expressions.txt" />
        </validator>
$ redpen -c my-redpen-conf.xml sample.txt 2>/dev/null
sample.txt:1: ValidationError[SuggestExpression], Found invalid word "更に". Use the synonym "さらに" instead. at line: 更に革新的な

まとめ

今回はオープンソースの文書校正ツール RedPen を使ってみた。 この記事で紹介したバリデータは機能のごく一部にすぎない。 また、今回は触れなかったものの RedPen は JavaScript を使って独自のバリデーションルールを作ることもできるらしい。

技術文書の校正は真面目にやるとかなり時間がかかる。 こういったツールを使うことで一次的な校正を手早く済ませることができると大幅な時間の節約になると思う。