読者です 読者をやめる 読者になる 読者になる

RedPenで技術文書の誤りを指摘してもらおう

自然言語の誤りを指摘してくれるRedPenを手元で使えるようにしてみました、という記事です。気が向いたので、色々書いてみました。

エンジニアであっても意外と文書を書いたり見たりする機会が多い

エンジニアとしてはてなに入社後、コードレビューをする機会はもちろん多いですが、意外と自然言語(私の場合は日本語、英語がメイン)のレビューをする機会も多いことに気が付きました。他人の書いた文書に対するレビューに限らず、自分の書いた文書に対するレビューも含みます。

自然言語も機械が勝手に間違いを指摘して欲しい

プログラムでは各言語のlinterやciのテストを通すことで、レビュー前に単純な誤りに気づくことができます。typoやsyntax errorのようなささいなことを人間がやっていると疲れるので、機械が勝手にやってくれるのはいいですね。自然言語にもlinterっぽいものはいくつかあって、例えばMicrosoftのwordなどはそうでしょう。研究論文を書いてるときに簡単な誤りはwordに投げてざっとチェックして、というのをやっていました。

しかし、技術文書をwordに投げるとうまくいかないことが多いです。私の場合、markdownで文書を書く機会が多いですが、markdownのsyntaxをwordは当然ながら解釈してくれません。markdownのsyntaxに関する赤線なのか、日本語の文法としておかしいことへの赤線なのかを人間が判断していると、これまた消耗します。私はとにかく消耗したくないのです。

自然言語もルールで分かることは機械(RedPen)に指摘してもらう

自然言語もプログラミング言語と同様に文法を持ちますが、最大の違いは曖昧性の有無でしょう。自然言語処理の大部分は曖昧性をいかに扱うかとの戦いといっても過言ではありません。自然言語処理の研究分野でも最近誤り訂正の話題は活発に議論されていて、コンペティションも開かれています。Shared taskで有名なCoNLLでも2013年にテーマになりました。

100%に近い精度を出すことがまだまだ難しいため、このように研究分野になっているわけですが、ルールでも分かる簡単なものは将来と言わず今でも指摘して欲しいです。RedPenはその要望を満たしてくれるソフトウェアの1つです。

詳しい機能はサイトを見てもらうといいですが、私がよいと感じたのは以下の部分です。

  • 様々なマークアップ言語に対応している
    • markdownを含め、LaTeXにも対応
  • 日本語や英語など様々な言語に対応
  • 必要ない指摘は設定でオフにできる
    • 「誤りと指摘されたこの箇所は自分は誤りだとは思わない」というのがよくあるパターンですが、うざいと思ったら設定でオフにできます

インストールも簡単でした。

% brew install redpen

予想通り、指摘が多かったため、設定で以下の項目はオフにしました。

  • InvalidSymbol
  • KatakanaEndHyphen
  • EmptySection

指摘例

最近書いたブログの元テキストをRedPenに流してみました。私の場合、特に一文が長い表現を書いてしまう傾向があるのですが、SentenceLengthCommaNumberで怒ってくれているのはまさにそれですね。

% redpen --format markdown --conf /usr/local/Cellar/redpen/1.8.0/libexec/conf/redpen-conf-ja.xml ~/Dropbox/_posts/2017-03-20-清算用Slack-botを書いた.md 2>/dev/null
2017-03-20-清算用Slack-botを書いた.md:14: ValidationError[SentenceLength], 文長("121")が最大値 "100" を超えています。 at line: 昔のことは忘れてしまうので、清算用のSpreadsheetを作ろうとしましたが、出先で開くのは手間なので、slackからできるといいよねという妻の声がありましたが、外部でちょうどいいサーバーを持っていなかったので、そのときは流れました...。
2017-03-20-清算用Slack-botを書いた.md:14: ValidationError[CommaNumber], カンマの数 (5) が最大の "3" を超えています。 at line: 昔のことは忘れてしまうので、清算用のSpreadsheetを作ろうとしましたが、出先で開くのは手間なので、slackからできる といいよねという妻の声がありましたが、外部でちょうどいいサーバーを持っていなかったので、そのときは流れました...。
2017-03-20-清算用Slack-botを書いた.md:14: ValidationError[DoubledConjunctiveParticleGa], 一文に逆説の接続助詞 "が" が複数回使用されています。 at line: 昔のことは忘れてしまうので、清算用のSpreadsheetを作ろうとしましたが、出先で開くのは手 間なので、slackからできるといいよねという妻の声がありましたが、外部でちょうどいいサーバーを持っていなかったので、そのときは流れました...。
2017-03-20-清算用Slack-botを書いた.md:24: ValidationError[InvalidExpression], 不正な表現 "俺" がみつかりました。 at line: 俺は好きなエディタで書きたいし、gitでコード管理したいし、何ならTypeScriptで書きたいんじゃー、と思っていたところでいいエントリを見つけました。
2017-03-20-清算用Slack-botを書いた.md:29: ValidationError[InvalidExpression], 不正な表現 "最高" がみつかりました。 at line: 最高です、IDEAでリファクタリングや定義元に戻るとかもできるようになったので完璧です。

EmacsからRedPenを使う

Emacsで技術文書を書くことが多いので、Eamcs内からRedPenを叩けるとよさそうですが、すでに作っている方がいらっしゃいました。

作者の方がインストールの手間が省けるように、ディフォルトでは(作者が立てた)Herokuサーバーを見に行くようになっています。私の場合、オフラインで動いて欲しいことや社外に出すとまずい文書でも動いて欲しいということがあるため、設定でローカルのRedPenを見に行くように変更しました。

(el-get-bundle karronoli/redpen-paragraph.el)

(define-key markdown-mode-map (kbd "C-c C-r") 'redpen-paragraph)

(defvar redpen-commands
  '("redpen --format markdown --result-format json2 --conf /usr/local/Cellar/redpen/1.8.0/libexec/conf/redpen-conf-en.xml %s 2>/dev/null"
    "redpen --format markdown --result-format json2 --conf /usr/local/Cellar/redpen/1.8.0/libexec/conf/redpen-conf-ja.xml %s 2>/dev/null"))

(defvar redpen-paragraph-force-reading-whole t)

これでC-c C-rで校正の結果が出てきて、編集すべき箇所にすぐに飛べるようになったので、快適になりました。

まとめ

機械で指摘してくれる箇所は機械にやってもらって、人間はもっと本質的なところを考える時間を増やしていきたいですね。

理科系の作文技術 (中公新書 (624))

理科系の作文技術 (中公新書 (624))