RedPenを使って技術文書を手軽に校正しよう

第6回RedPenの機能追加と今後

本連載を執筆している伊藤@takahi_iです。今回が最終回ということで、いままで深く扱えなかったトピックについて解説します。具体的には本稿の前半ではRedPenの機能追加を実際に行ってみます。後半ではRedPenの現状と今後の予定についてみていきます。

RedPenでの機能追加方法

先回RedPenの内部についての解説をしました。その知識をもとにRedPen内部の理解をもとに簡単な機能を実装してみます。実装する機能は半角カナ文字のチェックです。

機能追加:半角カナ機能

半角カナの混入は人目での判別が難しいため、自動で同定してしまいたい処理の一つです。機能を追加するには以下のステップが必要になります。

  • Validatorの追加
    • validateメソッドの実装
  • メッセージの追加
  • テストの作成

Validatorの追加

RedPenに機能を追加するには、抽象クラスValidatorを拡張したクラスを作成します。今回実装する機能をHankakuKanaと名づけることにします。前回すこしふれましたが、機能を呼び出すには実装するクラス名がValidatorというサフィックスをもつ必要があります。そのため今回実装するクラスはHankakuKanaValidatorという名前にします。

Validatorはいくつもメソッドを持ちますが、機能を実現する上でかならず実装しないといけないのがvalidateです。バージョン1.1のRedPenでは3つのvalidateメソッドが存在します。それぞれ、Document, Section, Sentenceを引数にとります。

validate(List<ValidationError> errorList, Document document)
validate(List<ValidationError> errors, Section section)
validate(List<ValidationError> errors, Sentence sentence)

通常機能を実現するにはValidationメソッドの一つを実装します。機能が一文を独立してチェックするだけで実現できるのであればSentenceを引数に取るメソッドを実装します。逆に文書の節間の関係等をチェックしたい場合にはSection、もしくはDocumentを引数にとるvalidateメソッドを実装する必要があります。

今回実装する機能(半角カナの検知)は一文中の文字を検査するだけで十分です。そのためSentenceを引数にとるvalidateメソッドを実装します。次のコードが作成したHankakuKanaValidatorとなります。

public class HankakuKanaValidator extends Validator {
  private static Pattern pattern = Pattern.compile("[\\uFF65-\\uFF9F\\s-]");
  public HankakuKanaValidator() {}

  @Override
  public void validate(List<ValidationError> errors, Sentence sentence) {
    Matcher matcher = pattern.matcher(sentence.getContent());
    while (matcher.find()) {
      errors.add(createValidationError(sentence,
          sentence.getContent().charAt(matcher.start())));
    }
  }
}

上のコードではpatternというstatic変数に半角カナを検知する正規表現を代入しています。実際に検査を行うvalidateメソッドでは、patternが入力文(sentence)にマッチするかをチェックします。マッチした場合にはcreateValidationErrorメソッドというValidatorが提供するヘルパークラスを使います。createValidationErrorメソッドはValidationErrorという検査のエラー情報を保持するクラスを生成してくれます。

createValidationErrorの第一引数は入力文です。第二引数以降は次節で述べるエラーメッセージの引数として利用されます。HankakuKanaValidatorではマッチした半角文字を引数として渡しています。

メッセージの追加

RedPenではエラーが含まれる文だけでなく、具体的に文のどこが悪かったのかを解説する(エラーメッセージの出力)機能があります。たとえばSentenceLength機能は以下のようなエラー文を出力します。

文長("80")が最大値 "100" を超えています。

出力するエラーメッセージにはパラメータを追加して文の具体的な情報を付加できます。たとえばHankakuKanaValidatorでは検知された半角カナ文字を出力します。付加する情報はcreateValidationErrorの第二引数以降で指定します。

先ほど作成したHankakuKanaValidatorでは第二引数に発見した半角文字を与えたことを思い出してください。HanakakuKana機能のエラーメッセージは以下のとおりです。

HankakuKanaValidator=半角カナの文字 "{0}" が見つかりました。

ここで、{0}はcreateValidationErrorメソッドの第二引数(第一引数はエラーの入っているSentenceオブジェクトなのでひとつずれる)に置き換えられます。

テストの作成

では、作成したHankakuKanaValidatorが期待通りに動作するか検証するためにテストを書いてみます。テスト用のクラスとしてHanakakuKanaValidatorTestを作成しました。今回書いたテストは2つです。一つはtestDetectHankakuKanaで、もう一つはtestRunValidaotrWithoutHanakakuKanaです。testDetectHanakakuKanaは、入力文に含まれる二文字の半角カナ("ハ"と"ナ")にたいしてエラーが出力されるかを検査します。

testRunValidaotrWithoutHanakakuKanaでは入力文に半角カナが含まれていない場合に、エラーを一つも追加しないことを検査しています。

public class HankakuKanaValidatorTest {
  @Test
  public void testDetectHankakuKana() {
    Validator validator = new HankakuKanaValidator();
    List<ValidationError> errors = new ArrayList<>();
    validator.validate(errors, new Sentence("岩の木陰にハナが咲いている", 0));
    assertEquals(2, errors.size());
  }

  @Test
  public void testRunValidatorWithoutHanakakuKana() {
    Validator validator = new HankakuKanaValidator();
    List<ValidationError> errors = new ArrayList<>();
    validator.validate(errors, new Sentence("岩の木陰にハナが咲いている", 0));
    assertEquals(0, errors.size());
  }
}

テストを実行するにはredpenのトップディレクトリ上でmvn testコマンドを実行します。今回の変更を加えた状態でのテストの実行は次項で取り上げますが、無事にテストがすべてパスしたことがわかります。

動作の確認

ここまででHankakuKana機能の実装が終わり、テストが通りました。それでは実際に使ってみましょう。はじめにRedPenのトップディレクトリでmvn installを実行しRedPenの生成物を出力します。

次に以下のコマンドを実行して生成物を解凍します。

$cd redpen-cli/target/
$tar xvf redpen-cli-1.1-assembled.tar.gz  
x redpen-cli-1.1/lib/redpen-core-1.1.jar
x redpen-cli-1.1/lib/kuromoji-0.7.7.jar
x redpen-cli-1.1/lib/commons-cli-1.2.jar
x redpen-cli-1.1/lib/json-20080701.jar
x redpen-cli-1.1/lib/logback-classic-1.1.1.jar
x redpen-cli-1.1/lib/logback-core-1.1.1.jar
x redpen-cli-1.1/lib/slf4j-api-1.7.6.jar
...

解凍されたディレクトリに移動します。

$cd redpen-cli-1.1

このディレクトリ以下にRedPenの設定ファイル(conf/redpen-conf-ja)とサンプルテキスト(sample-doc/ja/sampledoc-ja.txt)が入っています。はじめに、設定ファイルにの最後にHankakuKana機能を追加します。設定例は以下のとおりです。

<redpen-conf lang="ja">
  <validators>
     <validator name="SentenceLength">
        <property name="max_len" value="100"/>
     </validator>
  ...
  <validator name="SpaceBetweenAlphabeticalWord" />
  <validator name="CommaNumber" />
  <validator name="SuccessiveWord" />
  <validator name="HankakuKana" />
  </validators>
</redpen-conf>

次にサンプル文書に半角カナ文字を追加してみます。

最近利用されているソフトウェアの中には複数の計算機上で動作(分散)するものが多く存在し、このような分散ソフトウェアは複数の計算機で動作することで大量のデータを扱えたり、高負荷な状況に対処できたりします。
本稿では,複数の計算機(クラスタ)でで動作する各サーバーを「インスタンス」と呼びまます。
たとえば検索エンジンやデータベースではインデックスを複数のインスタンスで分割して保持します。
このような場合、各インデクスの結果をマージしてclientプログラムに渡す機構が必要となります。

変更した箇所はマージという単語を半角カナマージに置き換えただけです。この状態でredpenを以下のコマンドで実行します。

$ bin/redpen -c conf/redpen-conf-ja.xml  sample-doc/ja/sampledoc-ja.txt
...
sampledoc-ja.txt:4: ValidationError[HankakuKana], Found Hankaku Kana character "マ". at line: このような場合、各インデクスの結果をマージしてclientプログラムに渡す機構が必要となります。
sampledoc-ja.txt:4: ValidationError[HankakuKana], Found Hankaku Kana character "ー". at line: このような場合、各インデクスの結果をマージしてclientプログラムに渡す機構が必要となります。
sampledoc-ja.txt:4: ValidationError[HankakuKana], Found Hankaku Kana character "シ". at line: このような場合、各インデクスの結果をマージしてclientプログラムに渡す機構が必要となります。
sampledoc-ja.txt:4: ValidationError[HankakuKana], Found Hankaku Kana character "゙". at line: このような場合、各インデクスの結果をマージしてclientプログラムに渡す機構が必要となります。

上記の出力より、半角カナが無事見つけられていることがわかります。

最近のニュースと今後の予定

連載開始時点から、RedPenには多くの改変が加えれれてきました。その中の多くは第4回で紹介しましたが、それ以降追加された大きな機能は以下の2つです。

ポジション情報の追加

RedPenはエラーを出力する際に、検知されたエラーを含む文が存在する文書内の行数を表示します。利用者の人から2つのポジション情報をエラーに含めてほしいというリクエストを頂きました。そこでバージョン1.1から以下の2つの位置情報をエラーに含める変更を加えました(注意:2つ目のポジション情報は一部の機能だけが対応しています⁠⁠。

  • 文内で文が開始されるポジション
  • エラーが発生したポジション情報

現状では、ポジション情報に対応しているのはMarkdownフォーマットだけです。今後、Plainテキスト、Textileフォーマットについてもにポジション情報を追加していく予定です。

サンプルUIの更新

もう一つ、1.1以降ではじまった大きな改良にUIがあります。1.0の頃の素朴なUIから 1.1では大分モダンな感じになっています。

RedPenサーバ
画像

見た目以外の改良点には、現行バージョンではMarkdown、Textileフォーマットへの対応があります。コマンド一つで立ち上がるので、試しに使ってみてください。

Android アプリ

最近@hotchemiさんがRedPenのAndroidアプリを公開されました。Android端末があれば簡単にRedPenの機能を体験できます。是非一度使ってみてください。

RedPen Androidアプリ
画像

文字設定の推測

現在では言語毎に設定されたデフォルト文字をオーバライドするには、設定ファイルに変更を 記載する必要があります(シンボルの設定変更については本連載の第1回を参照してください⁠⁠。自分がRedPenを使ってみて文字設定を書くのは正直面倒と感じています。そこでどの句読点などの文字が使われているのかを入力文書から推測することを考えています。

まとめ

今回は連載最後ということで、解説しておきたかった残りトピックを取り上げました。そのため機能の追加と、今後の方針についてというかなり発散した内容となってしまいました。

RedPenについての連載自体はこれで終わりますが、今後もRedPenはゆっくりと開発が続いていきます。興味を持っていただいた人は是非使って使用感を教えていただけますと幸いです。さらに、機能の追加をはじめとしたコードへの貢献はいつでも大歓迎です。今後ともどうぞよろしくお願いいたします。

おすすめ記事

記事・ニュース一覧