Apache Nutch のプラグインと言語判別


オープンソース Web 検索エンジン Apache Nutch の概要 - Mi manca qualche giovedi`? のつづき。


Apache Nutch はさまざまな機能をプラグインで追加できる。プラグインは extension-points と呼ばれるインターフェースを実装することで提供される。
ドキュメントは以下のものがあるが、いろいろ足りてない……。

extension-points の一覧

extension-points は org.apache.nutch.plugin.Pluggable を implements した interface。ただしプラグイン可能でないものはその限りではない(extension-points 経由で提供されている標準機能がいくつかある)。
したがって、http://nutch.apache.org/apidocs-1.2/org/apache/nutch/plugin/Pluggable.html を見れば標準で用意されているプラグインの一覧が得られる。
v1.2 現在では以下の extension-points がある。順番は indexer が PluginRepository に登録する順番

Summarizer
Nutch Summarizer. ドキュメントがなくて不明。検索結果のサマライザ??
Protocol
Nutch Protocol. URLからコンテンツを取得する際、プロトコルごとに取得方法を変える(http, ftp など)
SegmentMergeFilter
Nutch Segment Merge Filter.
NutchAnalyzer
Nutch Analysis. ドキュメントからの単語抽出
FieldFilter
Nutch Field Filter. フィールドをドキュメントに追加(IndexingFilter を抽象化したもの? 違いはまだよくわかっていない)
HtmlParseFilter
HTML Parse Filter. HTML のパース結果にメタデータを追加する
QueryFilter
Nutch Query Filter. クエリーを変換して、メタデータを追加する
ResponseWriter
Nutch Search Results. 検索結果を様々な出力フォーマットにて書き出す
URLNormalizer
Nutch URL Normalizer.
URLFilter
Nutch URL Filter. 取得を試みる URL をフィルタリングする(injector と crawldb updater にて使用)
OnlineClusterer
Nutch Online Search Results Clustering Plugin. オンライン検索結果をクラスタリングするアルゴリズム(Google の検索結果にて同じドメインの結果がまとめられているのを実現するためのもの?)
IndexingFilter
Nutch Indexing Filter. インデックスのフィールドにメタデータを追加する
Parser
Nutch Content Parser. コンテンツからデータ(テキスト)を取り出す
ScoringFilter
Nutch Scoring. CrawlDatum クラス(コンテンツの取得からスコアリングまでをハンドリングするクラス?)にてスコアリング変数を操作するフィルタ。"multi-stage scoring adjustments" を用意することで、フィルタ適用の順序を指定できる
Ontology
Ontology Model Loader. 不明。JavaDoc も空。ソース読むしか。

プラグインの組み込み

プラグインは、プラグインフォルダの $NUTCH_HOME/plugins/ に置かれる。構成は次の通り。

$NUTCH_HOME/plugins/
    [プラグイン名]/
        plugin.xml              プラグイン情報
        [適当なファイル名].jar  プラグイン本体


プラグインを有効にするには conf/nutch-site.xml の plugin.includes property にプラグイン名を追加すればいい。
標準で有効なプラグインは conf/nutch-default.xml に書いてある。

<property>
  <name>plugin.includes</name>
  <value>protocol-http|urlfilter-regex|parse-(text|html|js|tika)|index-(basic|anchor)|query-(basic|site|url)|response-(json|xml)|summary-basic|scoring-opic|urlnormalizer-(pass|regex|basic)</value>
</property>

plugin.xml について

プラグイン情報ファイルの plugin.xml には、プラグイン本体の jar ファイル名、extension-points と実装されたクラス名の対応、それらに与えるパラメータなどの情報が記述される。
プラグインには複数の extension-points の実装が含まれうる。これらを extensions と呼ぶ?

プラグイン本体の jar ファイル名

plugin/runtime に記述。

    <runtime>
      <library name="language-identifier.jar">
         <export name="*"/>
      </library>
   </runtime>
extension 情報(extension-point と個々の実装クラス)

plugin/extension に記述。

   <extension id="org.apache.nutch.analysis.lang.LanguageQueryFilter"
              name="Nutch Language Query Filter"
              point="org.apache.nutch.searcher.QueryFilter">
      <implementation id="LanguageQueryFilter"
                      class="org.apache.nutch.analysis.lang.LanguageQueryFilter">
        <parameter name="raw-fields" value="lang"/>
      </implementation>
   </extension>
extension@id
extension の id。後述の実装クラス名と一致させる?(運用? 必須?)
extension@point
プラグインする extension-point を表す interface 名
extension/implementation@id
extension の実装の id(extension の id との違いは……?)
extension/implementation@class
extension の実装クラス名
extension/implementation/palameter
extension に引き渡すパラメータ

標準の言語判定プラグイン

Nutch 標準の言語判定プラグインは $NUTCH_HOME/plugins/language-identifier である。
したがって、conf/nutch-site.xml の plugin.includes に language-identifier を追加して(標準ので有効なプラグインを残すなら、その設定を nutch-default.xml からコピーする必要がある?)クロールを行えば、インデックスに追加された lang フィールドに判定された言語名が格納され、また言語しぼり込み機能が有効になる。


language-identifier には3つの extension-points の実装が含まれている。

HTMLLanguageParser
メタデータ(meta タグ、HTTP ヘッダなど)に含まれる言語情報を取得し、ドキュメントのメタデータフィールドに格納する
LanguageIdentifier
メタデータにて指定された言語名をインデックス(に登録されるフィールドを持つ Document オブジェクト)の lang フィールドに言語名を設定する。メタデータにて言語が指定されていない場合、統計情報を元に言語判定を行い、その結果を用いる。
LanguageQueryFilter
検索条件に lang を追加する extension

このことから、言語判定に Language Detection Library for Java を用いるには、LanguageIdentifier extension の実装を差し替えればよいことがわかる。


次は Nutch のプラグインの実装について。