はじめに
イスラーム圏の歴史テキストを扱う OpenITI(Open Islamicate Texts Initiative) プロジェクトでは、TEI/XMLの代わりに mARkdown という軽量記法でテキストをタグ付けできます。
TEI/XMLは構造化の国際規格として強力ですが、特にアラビア語のような右から左に書く言語(RTL)では、XMLタグとの混在でエディタ上の表示が乱れるという問題があります。mARkdownはこの課題を解決する記法です。
本記事では、mARkdownで書かれたテキストを TEI XMLに自動変換 するPythonツール oitei を実際に動かしてみます。
oiteiとは
- OpenITI mARkdown → TEI XML の変換ライブラリ(Python)
- OpenITI TEI Schema に準拠したXMLを出力
- PyPIで公開されており
pip installで導入可能 - 依存ライブラリ:
oimdp(mARkdownパーサー)、lxml
https://github.com/OpenITI/oitei
インストール
Python 3.8以上が必要です。oimdp(OpenITI mARkdown Parser)と lxml が依存関係として自動インストールされます。
OpenITI mARkdownの記法
mARkdownファイルは以下の3部構成です。
- マジックバリュー (1行目):
######OpenITI# - メタデータ :
#META#で始まる行 - 本文 :
#META#Header#End#の後に記述
主なタグ
| 記法 | 意味 |
|---|---|
| `### | ` |
| `### | |
### $ | 伝記エントリ |
# | 段落の開始 |
@P02 名前 | 人物名(後続2語を含む) |
@T11 地名 | 地名(後続1語を含む) |
@YB732 | 誕生年(ヒジュラ暦732年) |
@YD808 | 没年(ヒジュラ暦808年) |
%~% | 詩行(hemistich)の区切り |
固有表現タグ(@P, @T 等)の後ろの 2桁の数字 は、1桁目がエンティティ番号、2桁目が「後続する何単語を名前に含むか」を指定します。例えば @P02 Ibn Khaldun は「後続2語(Ibn Khaldun)を人名として含む」という意味です。
サンプルファイルの作成
以下の内容で sample_markdown.md を作成します。
変換の実行
たった4行で変換が完了します。
変換結果
生成された TEI XML は以下の通りです。
変換のポイント
mARkdownの各タグが適切なTEI要素に変換されています。
| mARkdown | TEI XML |
|---|---|
| `### | ` 章見出し |
### $ 伝記 | <div type="biography" subtype="man"> |
@P02 Ibn Khaldun | <persName>Ibn Khaldun</persName> |
@T11 Tunis | <placeName>unis</placeName> |
@YB732 | <date type="birth" calendar="#ah" when-custom="732"/> |
@YD808 | <date type="death" calendar="#ah" when-custom="808"/> |
%~% 詩行区切り | <caesura/> |
#META# メタデータ | <xenoData> |
ヒジュラ暦の年号には自動的に calendar="#ah" が付与され、暦体系が明示されます。
日本語テキストへの適用
oiteiはイスラーム圏のテキスト向けに設計されていますが、日本語テキストにも適用できるか試してみます。
注意点:スペース区切りの問題
mARkdownの固有表現タグ(@P, @T 等)は、スペース区切りで「後続N語」 を名前として取り込む仕組みです。日本語はスペースで単語が区切られないため、工夫が必要です。
@P02 Ibn Khaldun→ 後続2語 = “Ibn Khaldun” ✅(英語・アラビア語)@P02 源 頼朝→ 後続2語 = “源” “頼朝” … だが<persName>源 頼朝</persName>にはなるものの不自然
対処法 : 日本語の名前はスペースなしで1語にまとめ、@P01(後続1語)を使います。
日本語サンプル
架空の人物・地名を使った単純な例で試します。
日本語の変換結果
人物名・地名・詩行がTEI要素に変換されており、このXMLも tei_all.rng でバリデーションに通ることを確認しました。
!
oiteiはイスラーム圏テキスト向けのツールであるため、以下の点に注意が必要です。
teiHeaderにcalendar="#ah"(ヒジュラ暦)が固定で出力されるpublisherが “Open Islamicate Texts Initiative” 固定- 日本語で使う場合、固有表現タグの前後にスペースが必要
本格的に日本語テキストのTEI化を行う場合は、oiteiの出力をベースにヘッダ等を修正するか、別のツールの利用を検討してください。
TEIスキーマによるバリデーション
生成されたXMLがTEI規格に適合しているか検証します。
TEI公式のRelaxNGスキーマ(tei_all.rng)で バリデーションに通る ことを確認しました。
!
OpenITI独自のカスタムスキーマ(tei_openiti.rng)でも検証を試みましたが、434KBと大きいスキーマのコンパイルに非常に時間がかかり、ローカル環境では完了しませんでした。tei_all は tei_openiti のスーパーセットであるため、tei_all で通れば基本的な適合性は確認できます。
まとめ
- oitei を使えば、OpenITI mARkdown → TEI XML の変換がPython数行で可能
- XMLタグの手書きが不要で、特にRTL言語を扱う際のエディタ上の混乱を回避できる
- 生成されるXMLはTEI標準スキーマのバリデーションに通る
<persName>,<placeName>,<date>等の固有表現タグが自動付与される
軽量な記法で書いて、必要な時にTEI XMLに変換する。このワークフローは、特にイスラーム圏の歴史テキストを扱う研究者にとって有用なアプローチです。