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

第5回 RedPenの内部

この記事を読むのに必要な時間:およそ 4 分

initメソッド

RedPenではvalidatorブロックのpropertyに名前と値のペアを渡すことで,設定を調整できます。initメソッドは設定ファイルからpropertyで指定された情報を取得するのに利用します。

たとえばSentenceLengthValidatorでは文の最大文長をpropertyを利用してデフォルトの設定を変更できます。次のコードはSentenceLengthValidatorで文長を150に設定した例です。

<validator name="SentenceLength">
    <property max_len="150" >
</validator>

以下のSentenceLengthValidatorのinitメソッドで,設定項目max_lenからユーザの指定した値を抽出しています。

@Override
protected void init() throws RedPenException {
  this.maxLength = getConfigAttributeAsInt("max_len", DEFAULT_MAX_LENGTH);
}

preValidateメソッド

一度文書内の情報を抽出したのちvalidateで検査を実行したい場合には,preValidateメソッドが利用できます。preValidateはvalidateと同様にすべてのブロック(文,もしくは節)にたいして適用されます。preValidateがブロックに適用されるのはvalidateが呼び出される前です。

たとえばpreValidateメソッドはDuplicateSection機能を実現するために利用されています。DuplicateSectionは文書内に存在する類似する節ペアを抽出します。

DuplicateSectionではpreValidateメソッドをはじめに文書中すべてのSectionにたいして呼び出し,ベクトル表現に変換します。その後,各Sectionを引数にしてvalidateメソッドを呼び出し,内容が著しく類似する節ペアを抽出するのです。

追加されたValidatorの利用

Validatorを拡張して作成したクラスが提供する機能を呼び出すには以下の二つのステップが必要です。ひとつは設定ファイルへの追加で,もうひとつはエラー文の追加です。

設定の追加

RedPenでは"cc.redpen.validator",または"cc.redpen.validator.sentence"にValidatorクラスを継承したクラスを作成すると利用できるようなります。ただし,継承したクラス名はValidatorで終わらないといけないという制約があります。

作成した機能を設定に追加する際には語尾のValidatorを抜かした名前を指定します。すると指定したValidatorが生成され,文書に適用されます。たとえばChineseSuffixValidatorというクラスを作成した場合には,設定ファイルにはChineseSuffixを追加します。以下はChineseSuffix機能を追加した設定例です。

<validators>
    <validator name="ChineseSuffix" />
</validators>
エラー文テンプレートの追加

エラー文は継承したValidator毎に存在します。以下はSentenceLengthValidatorのエラー文テンプレートです。

SentenceLengthValidator=文長("{0}")が最大値 "{1}" を超えています。

SentenceLengthValidatorでは"{0}"に入力文の長さ,"{1}"に指定した文の最大長を追加しています。これらの引数はValidationErrorを生成するメソッドcreateValidationError(もしくはcreateValidatorWithPosition)の引数として渡されます。各機能のエラー文テンプレートは2つのRedPenプロジェクト内のディレクトリに存在します。

  • redpen/redpen-core/src/main/resources/cc/redpen/validator/
  • redpen/redpen-core/src/main/resources/cc/redpen/validator/sentence/

両ディレクトリの中に各入力言語用のエラー文テンプレートファイル(error-messages.properties,error-messages-ja.properties)が存在します。機能(Validator)を追加した際にはここにエラー文を追加します。

その他のコンポーネント

上記のDocumentモデルとValidatorを理解していれば機能を実装するのに十分です。以下に紹介するのは,RedPenの内部の構造を変更する際によく使用するためのコンポーネントです。

RedPen

RedPenはDocumentParserや設定ファイルに登録されたValidator群を利用して文書の検査を行います。登録されたValidator群を文書内のブロックに適応し,エラーを収集します。検査が終了するとエラー集合を返します。

Formatter

FormatterはRedPenオブジェクトによって返されたエラー集合を出力するためのフォーマッティングを行います。出力フォーマットはテキスト,XML,JSONがサポートされています。

Configuration

Configurationは設定ファイルを読み込むためのクラスです。設定ファイルに追加された機能や,propertyによる設定項目の上書きが保持され,機能(Validator)の生成時に設定を反映するのに利用されます。

Tokenizer

Tokenizerは入力文書を単語に分割します。デフォルトではWhiteSpaceTokenizerというスペースで単語を分割するだけなのですが,設定ファイルの言語を日本語("ja")に指定すると日本語形態素解析器のKuromojiが動作します。

Tokenizerによって分割された単語は検査で利用できます。具体的にはValidator.validate関数の引数として指定されるSentenceオブジェクトは単語集合を保持しており,getTokensメソッドを利用することで取得できます。

まとめ

今回はRedPenの内部について解説しました。具体的にはRedPenに機能を追加するのによく利用するクラスDocumentParserとValidatorsを解説しました。次回は今回の知識を基に簡単な機能を追加してみます。

著者プロフィール

伊藤敬彦(いとうたかひこ)

ソフトウェアエンジニア。専門はデータマイニングと情報検索だが,他にも色々やってみたいと感じている。