はじめに

TEI (Text Encoding Initiative) は、人文学研究におけるテキストのデジタル化と共有のための国際標準です。本記事では、NDL古典籍OCR-Liteアプリケーションの出力形式に合わせてTEI ODDファイルをカスタマイズした過程を紹介します。

ODD (One Document Does it all) は、TEIスキーマをカスタマイズするための仕組みで、必要な要素と属性だけを含む独自のスキーマを定義できます。

背景:NDL古典籍OCR-Liteアプリケーションの開発

NDL古典籍OCR-Liteの出力結果をTEI/XMLで出力するアプリケーションを作成しています。このアプリケーションは、日本の古典籍をOCR処理し、その結果を標準的なTEI形式で出力することを目的としています。

出力されるTEI XMLには以下の情報を含めることにしました:

  • テキスト情報 : OCRで認識した文字列
  • レイアウト情報 : 各行の座標情報(バウンディングボックス)
  • 画像参照 : IIIF (International Image Interoperability Framework) 対応の画像URL
  • メタデータ : 文書タイトル、処理情報など

このアプリケーションで使用するスキーマをODDで記述してみました。以下、そのカスタマイゼーション過程を紹介します。

カスタマイゼーションのアプローチ

1. 初期アプローチ:標準モジュールの利用

最初は、TEIの標準モジュールを利用してODDを作成しました:

<s/c<<<<<shmmmmmceooooohmdddddeauuuuumSlllllapeeeeeSeRRRRRpceeeeeefffffci>dkkkkkeeeeeenyyyyyt======""""""thcttneeoerdiarxal"detn_/e"ssk>rtco"irrtnu"eiccnnlti_cuunoldrccueelrd="u"e"d=pies"n=tttc"aeilfrituatHldc=eees"a=iTdn"mEeaTiIrmEl"eIefpirtsrleeueesxrfDptfieaxsrbc=ceoe"sdttpyzeiS"ittn_lme"et">S/tl>mbtppbubglriacpahtiico"n/S>tmtsourceDesc"/>

include属性の重要性

moduleRef要素のinclude属性は、モジュールから特定の要素のみを選択的に含める重要な機能です:

<<!m-o-duhleeaRdeefrkey="he5ader"include="teiHeaderfileDesctitleStmtpublicationStmtsourceDesc"/>

include属性を使用する利点:

  • 必要な要素のみを明示的に指定できる
  • モジュール全体を含めるよりもスキーマサイズが小さくなる
  • どの要素を使用しているかが明確になる

include属性を使用しない場合:

<<!m-o-duleRefkey="header"/>

この場合、headerモジュールの全要素(encodingDesc、profileDesc、revisionDescなど)が含まれてしまいます。

複数要素の指定方法:

<<!m-o-duleRefkey="core"include="ptitlenameresprespStmtlbpbgraphic"/>

exclude属性を使った除外方法:

<<!m-o-duleRefkey="core"exclude="hideladdnote"/>

exclude属性はinclude属性の逆で、モジュールから特定の要素を除外します。大部分の要素が必要で、一部のみ不要な場合に有効です。

include vs exclude の選択基準:

  • 必要な要素が少ない場合 → includeを使用
  • 不要な要素が少ない場合 → excludeを使用
  • 明確性を重視する場合 → includeを使用(何を使っているかが明確)

しかし、この方法でも関連するmodel classesとattribute classesが自動的に含まれるため、完全に最小化することはできませんでした。

2. 改善アプローチ:不要な要素の削除

次に、不要なクラスを明示的に削除しました:

<<<<<<!cc!cc-ll-ll-aa-aassssssssSSSSppppmeeaeeocctccdteiiriilddiddeebeecnnunnlttttta==e==s""""smmcaaeoolttsddattees..llsde..eadehstimiatpgbLhhliLlekii"ekg"eht"tytepytdepy"=ep"=eta"=yta"pttmesto="sd""emmloom"ddoeedml=eo""=dd"emed=ole"deldetee=etl""eed/"te>/el>"e/t>e"/>

3. 最終アプローチ:最小構成での定義

最終的に、必要な要素と属性のみを明示的に定義する方法を採用しました:

<s/c<<sh!c/ce-l<chm-aa/least<<aamSsta/a/tsapSLt<<at<<atsSepitddttddtLSpcesDeatDeatipectestDestDseci>fcaefcaetc>ditftf>>edixy>ixy>nedmpdmptneleele=tn:>n:>"=tl<tl<n"=ad=adda"na"naltxgtxgt_tm=am=ak.l"Rl"Rog:je:jetliaflafeod"a"nb">kn>k_aegeolmy"yc"o==rd"m"_teIotmy=<Dd<eip"/"e/inead/=ddi=de>"eam"ds<astaa"c/dcalt>>dd>."ta"lst>as"anttgamyuropatdeg=e>e"="T"/Ea>Id<"d/"dp>arteaftiyxp=e">tei_"docLang="ja">

実装の詳細

座標情報の管理

OCRの座標情報を管理するため、専用の属性クラスを定義:

<c/l<<cada/lset<<<<aassta/a/a/a/tsScLt<<at<<at<<at<<atspitddttddttddttddtLSexsDeatDeatDeatDeatipcmtestDestDestDestDsel>fcaefcaefcaefcaetci:tftftftf>>dlixy>ixy>ixy>ixy>eadmpdmpdmpdmpnneleeleeleeletgn:>n:>n:>n:>==tl<tl<tl<tl<""=ad=ad=ad=adaj"na"na"na"nataugtugtlgtlgtt"l=al=ar=ar=a.>x"Ry"Rx"Ry"Rc"je"je"je"jeoafafafafom"m"m"m"ro>ko>ko>ko>kd<dedededei/eyeyeyeynd=X==Y==X==Y=ae""""""""tsatatatatecd<ed<ed<ed<ed>d/id/id/id/i""dd"dd"dd"dd>ea>ea>ea>eatststststycacacacap>.>.>.>.ennnn=uuuu"mmmmaeeeetrrrrtiiiiscccc"""""////m>>>>o<<<<d////edddd=aaaa"ttttaaaaadttttdyyyy"pppp>eeee>>>>

IIIF対応の実装

IIIFマニフェストとの連携のため、sameAs属性を追加:

<e/l<<eeda/lmet<aeesta/tmncLt<<atetitddtLnSxsDeatitpmtestDsSel>fcaetpc:tf>elixy>ciadmp>dneleegn:>n=tl<t"=ad=j"na"asgtf"a=aa>m"RcejesAafis"m">kiIelmIye<oI="/dF"detme=eos"idcade>da=dt""Uaa>R.dLpd<"i>dnetsecr>"/></datatype>

行番号の形式制約

Schematronを使用して、行番号の形式を制約:

<c/o<cnc/oso<cntns/osrsc<sntaths/csrir:cshtanarhc:ritiu:hranSnla:uitptesalnSe>ssetpcces>>eorecintr>dtteet>nxetts==t""=pt"aemgiae:t:-lcnbhu[em@sbn(.e]@r"ni>,(ng:"1sd.c+1h\,e.m2ed.=+3"$)s'c)h"e>matron">

例(Example)の記述方法

exemplumとegXMLの基本構造

ODDでは、exemplum要素とegXML要素を使って使用例を記述します:

<<!m-o-duhleeaRdeefrkey="he5ader"include="teiHeaderfileDesctitleStmtpublicationStmtsourceDesc"/>

0

複雑な例の記述

複数の要素を含む例を示す場合:

<<!m-o-duhleeaRdeefrkey="he5ader"include="teiHeaderfileDesctitleStmtpublicationStmtsourceDesc"/>

1

名前空間の問題と解決策

問題:TEI要素が認識されない

egXML内でTEI要素(特にルート要素)を使用する際、名前空間の問題が発生することがあります:

<<!m-o-duhleeaRdeefrkey="he5ader"include="teiHeaderfileDesctitleStmtpublicationStmtsourceDesc"/>

2

解決策1:名前空間プレフィックスを使用

<<!m-o-duhleeaRdeefrkey="he5ader"include="teiHeaderfileDesctitleStmtpublicationStmtsourceDesc"/>

3

解決策2:コメントで簡略化

<<!m-o-duhleeaRdeefrkey="he5ader"include="teiHeaderfileDesctitleStmtpublicationStmtsourceDesc"/>

4

解決策3:例を省略

検証エラーを避けるため、問題のある例を完全に省略することも選択肢です。

言語別の例の提供

多言語対応の例を提供する場合:

<<!m-o-duhleeaRdeefrkey="he5ader"include="teiHeaderfileDesctitleStmtpublicationStmtsourceDesc"/>

5

属性の使用例を示す

属性の様々な値を示す場合:

<<!m-o-duhleeaRdeefrkey="he5ader"include="teiHeaderfileDesctitleStmtpublicationStmtsourceDesc"/>

6

Romaでの表示

これらの例は、Romaツールで生成されるHTMLドキュメントに自動的に含まれます。例があることで:

  • 要素の使用方法が明確になる
  • 属性の実際の値がわかる
  • スキーマの利用者が実装しやすくなる

日本語対応

多言語対応の記述

ODDファイル内で日英両言語の説明を提供:

<<!m-o-duhleeaRdeefrkey="he5ader"include="teiHeaderfileDesctitleStmtpublicationStmtsourceDesc"/>

7

ドキュメント言語の設定

Romaツールで日本語インターフェースを使用するため:

<<!m-o-duhleeaRdeefrkey="he5ader"include="teiHeaderfileDesctitleStmtpublicationStmtsourceDesc"/>

8

実際の出力例

このODDから生成されるTEI XMLの例:

<<!m-o-duhleeaRdeefrkey="he5ader"include="teiHeaderfileDesctitleStmtpublicationStmtsourceDesc"/>

9

Romaツールでの利用

ODDファイルの読み込み

  1. Roma にアクセス
  2. “Upload ODD” から作成したODDファイルをアップロード
  3. 必要に応じて追加のカスタマイズを実施

スキーマの生成

Romaから以下の形式でスキーマを生成可能:

  • RelaxNG Schema
  • W3C Schema (XSD)
  • DTD
  • Schematron

HTMLドキュメントの生成

Romaの “Documentation” タブから、HTMLドキュメントを生成できます。最小構成版では、実際に使用する要素と属性のみが文書化されます。

トラブルシューティング

よくある問題と解決方法

  1. egXML内でのTEI要素のエラー

    • 問題:<egXML>内で<TEI>要素がエラーになる
    • 解決:名前空間プレフィックスを使用するか、例を簡略化
  2. mode=“keep"が無効

    • 問題:attDefmode="keep"が認識されない
    • 解決:mode="change"を使用
  3. 不要なクラスが多すぎる

    • 問題:標準モジュールを使うと不要なクラスが含まれる
    • 解決:mode="add"で必要なものだけを定義

まとめ

TEI ODDのカスタマイゼーションには複数のアプローチがあります:

  1. 標準モジュール利用 : 簡単だが不要な要素が多い
  2. 削除方式 : 標準から不要なものを削除
  3. 追加方式 : 必要なものだけを明示的に追加(推奨)

プロジェクトの要件に応じて適切な方法を選択することが重要です。NDL古典籍OCRの場合、最小構成での定義により、明確で管理しやすいスキーマを実現できました。

参考資料

ライセンス

このODDファイルはCreative Commons Attribution 4.0 International Licenseの下で提供されています。