DITA-OT htmlsearchプラグインへのMeCab形態素解析エンジンの組み込み手順

ちょっと長いです。土日2日分の苦闘の記録ですので。

OS: WinXP 32bit
DITA-OT: 1.5.2 M6
MeCab: 0.98
cmecab-java: v1.7

1) 下記からMeCabをダウンロードして、インストール。
http://mecab.sourceforge.net/

2) 下記から cmecab-java-1.7-i386.zip をダウンロードして、解凍。
http://code.google.com/p/cmecab-java/downloads/list

3) 解凍してできた cmecab-java-1.7 を、%DITA-OT%demo\htmlsearch の下へ移動。

4) 環境変数PATHに、下記の2つのパスを追加。
(1) %DITA-OT%demo\htmlsearch\cmecab-java-1.7\bin
CMeCab.dll、CMeCab_protobuf.dllにアクセスするために必要。
(2) C:\Program Files\MeCab\bin
CMeCab.dllからlibmecab.dllにアクセスするために必要。

5) %DITA-OT%demo\htmlsearch\interator.xml の中で、インデクサを呼び出す際のクラスパスに cmecab-1.7.jar と protobuf-java-2.3.0.jar を追加(下記参照)。

    <path id="nw-cms.jar.path">
      <pathelement location="${dita.dir}${file.separator}demo${file.separator}htmlsearch${file.separator}lib${file.separator}nw-cms.jar" />
      <pathelement location="${dita.dir}${file.separator}demo${file.separator}htmlsearch${file.separator}cmecab-java-1.7${file.separator}bin${file.separator}cmecab-1.7.jar" />
      <pathelement location="${dita.dir}${file.separator}demo${file.separator}htmlsearch${file.separator}cmecab-java-1.7${file.separator}lib${file.separator}protobuf-java-2.3.0.jar" />
    </path>

6) %DITA-OT%startcmd.bat を実行してコマンドプロンプトを開き、ant -f integrator.xml を実行。

7) %DITA-OT%demo\htmlsearch\java\com\nexwave\nquindexer\SaxHTMLIndex.java の修正。
cleanBuffer関数を下記のように書き換える。

  private String cleanBuffer (StringBuffer strbf) throws Exception {
          String str = strbf.toString().toLowerCase();

    // Taggerを構築。
    // 第一引数には、MeCabの辞書の文字コードを与える。
    // 第二引数には、MeCabのcreateTagger()関数に与える引数を与える。
    Tagger tagger = new StandardTagger("UTF-8", "");

    // tagger.parse()を呼び出して、文字列を形態素解析する。
    // 返されるオブジェクトは、Iterator<String>を実装している。
    Node node = tagger.parse(str);

    String retStr = "";
    while (node.hasNext()) {
      String surface = node.next();
      String feature = node.feature();
      int posid = node.posid();
      // 名詞だけ拾って、戻り値の文字列変数に追加する
      //System.out.println(posid);
      if (posid == 1) {
        if (retStr.length() == 0) {
          retStr = surface;
        } else {
          retStr = retStr + " " + surface;
        }
      }

/*
      // 名詞だけ拾って、戻り値の文字列変数に追加する
      Pattern pattern = Pattern.compile("^名詞.*");
      Matcher matcher = pattern.matcher(feature);
      if (matcher.matches()) {
        if (retStr.length() == 0) {
          retStr = surface;
        } else {
          retStr = retStr + " " + surface;
        }
      }
*/
    }

    // taggerをクローズ
    tagger.close();

    System.out.println(retStr);
    return retStr;
  }

8) MeCabの品詞IDを定義しているファイル(pos-id.def)の修正。

名詞 1
動詞 2
形容詞 3
副詞 4
助詞 5
接続詞 6
助動詞 7
連体詞 8
感動詞 9
*[MeCab] 10

9) 辞書をリコンパイル

> cd C:\Program Files\MeCab\dic\ipadic
>"C:\Program Files\MeCab\bin\mecab-dict-index.exe" -t utf8
reading .\unk.def ... 40
emitting double-array: 100% |###########################################|
reading .\Adj.csv ... 27210
  :
  :
done!

※ 辞書のエンコーディングの指定(-t utf8)を忘れないこと!

10) インデクサをコンパイル

> cd %DITA-OT%demo\htmlsearch\java
> javac -cp %DITA-OT%tools\ant\lib\ant.jar;%DITA-OT%demo\htmlsearch\cmecab-java-1.7\bin\cmecab-1.7.jar;%DITA-OT%demo\htmlsearch\cmecab-java-1.7\lib\protobuf-java-2.3.0.jar -sourcepath . -d .. -encoding UTF-8 com\nexwave\nquindexer\*.java
注:入力ファイルの操作のうち、未チェックまたは安全ではないものがあります。
注:詳細については、-Xlint:unchecked オプションを指定して再コンパイルしてください。

ワーニングメッセージは取りあえず無視 (^_^;)

11) jarファイルを作成。

> cd ..
> jar -cvf nw-cms.jar com
マニフェストが追加されました。
com/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
com/nexwave/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
com/nexwave/nquindexer/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
  :
  :

12) %DITA-OT%demo\htmlsearch の下にできた nw-cms.jar を、%DITA-OT%demo\htmlsearch\lib の下へ移動。

●おまけ●
検索結果を表示するときに、< や > が含まれていると正しく表示されない不具合の対処。
%DITA-OT%demo\htmlsearch\basefiles\search\nwSearchFnt.js

《 修正前 》

tempPath = tempInfo.substring(0, pos1);
tempTitle = tempInfo.substring(pos1+3, pos2);
tempShortdesc = tempInfo.substring(pos2+3, tempInfo.length);

《修正後》

tempPath = tempInfo.substring(0, pos1);
tempTitle = tempInfo.substring(pos1+3, pos2).replace(//g, '>');
tempShortdesc = tempInfo.substring(pos2+3, tempInfo.length).replace(//g, '>');