はじめに

イスラーム圏の歴史テキストを扱う 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

インストール

pipinstalloitei

Python 3.8以上が必要です。oimdp(OpenITI mARkdown Parser)と lxml が依存関係として自動インストールされます。

OpenITI mARkdownの記法

mARkdownファイルは以下の3部構成です。

  1. マジックバリュー (1行目): ######OpenITI#
  2. メタデータ : #META# で始まる行
  3. 本文 : #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 を作成します。

##################MMMM######EEEE#T#@#T#@#T%T#TTTThPhPh~h#AAAA|i$0e$0|e%i#####s23sOHCIcACfTpTALehibISibAhohceiuaaasnbetubaleonttndpncyuplnIlhgettKtBtomcTeourehhKioaBewolI:ra#reahofkariru#:gElanrknndSenOfdl@rTgieaD:dniudoTawnsme#ernun1laoigpmA:sn1-l:solortGR-lueaIweDaRPairAbnpaoazaogTuitasgmizeshsetcrrraitataxhoabasrmmtodgopcwypsprurrhualhlfcanysseieotpnrihiwavetonaeseOnosrrxpf@esoteTanen.nt1no:Ih1wtTeinhITmeesupdmanodAmirpeRpsthsklayedeinsrontitwtcne@cisxYeaaDtBnnne.7t.dm3eoI2rH%te~ao%dnfwedaAmlsnodedniabseroctdnrarinrainatngive.nas@nYM@hDaTbo8n1ew0y1l8lOsRspicaenhyenoycI@lhTTaaoI1rn1sdtmhACtlrRaraokiatudrvegooerhwln.emtdohwHveoeferrdlkwoasrmtnoodft@oeT@r1Tt11th1aeBgaBgMgaiuhgnqdhgaadddabddiitomo.garh@Ha.Tep1h1diicDeaadlmaiasnncdu@sYgDe.3o1g3ra.phicalinformation.

変換の実行

imtwmdeipito=_hrswtotorprpioeietinnnet(g(re"".is=swaarmomipiptltleeee(_i_tm.teaceiroi_kn.sdvxtoemrwrlint"n.(,gmm)dd"")w,."t)"orsa"ts)r.iwrnregia(td)e(r):

たった4行で変換が完了します。

変換結果

生成された TEI XML は以下の通りです。

<<TAL?Tiua//xE<ttnx<TmItlhge/t/Ele<<<eounte<tIxxif/p/x:raoexb/e>vmmHi<<<fr<pe:gDito<bxellelt/p/s/ioc/rnSeaH>dd/otrnnaei<<tu<<po<slfa<cooaD:teyi<<<<dd>sssdDttaibpa/uuboeilc/afDmeaa>vhp/d/!iyi=:eeliutluv<abriuDlea<cliapmA>d>e><pi<<d-v>o"xrsettlibapvlcbreenlpaeltloreal>vhp/i->nhi>cSlhecli>aielcsDde>lneaeardbe><<T<a<iHpv=t=>teSailC4icD/eceanAedDAb>>/talp<dndne>>'t"mrttsar.lae>D>srdnnaexTuiC>ydbepada1pht/mihbe0atsecDandrsmetchTp>/rlttCw.:t>>toeiabics>eroaDclxhaheI>saede<r0t>nrltIio>csre>:topi=bNcipo'/pS>iinln>cxH>ssrts"naetetltw:tOtvtiS>mecpfebmNydyaeew/mpyeettlg>aoriiKeappcnwte>rym:icrsoh>meieetc.w>nCn>tireOgaIe=n=Nhotwoa>da=Ontrlb>""aedewImt=e"pehadnubdmii.smi"<pe:epunieeMn-wlooa/rnhnKira>ugc3annhpeIIfy<hsttaq=..msa">sTni"/ahhia'ooil>eItrhl""rdUrrcA<rrssed/odTggat/vmotuaupcciF//ttpeAdbdnlaam-n2er>"Rupt>all/a8s0i>kcayceeph'/0Tbdtrp/ennl.?11euoiaepNdda>./xtwog=eaaac0Xtinnr"rmrre"Iso<amse==NnnD/paN>""acIehhna##mlnNme"miaaeuiooao>enhh>dtndf>""ei>"aCtwww>tohahhimeseevmnneesb--raocc(cmruuOipnsspaltteleioonnmmISt==The""Iax78)rt30<e.28/""pA//ul>>bilkiesher>

変換のポイント

mARkdownの各タグが適切なTEI要素に変換されています。

mARkdownTEI 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語)を使います。

@@PT0011<p<eprlsaNcaemNea>me></<p/eprlsaNcaemNea>me>

日本語サンプル

架空の人物・地名を使った単純な例で試します。

#############MMMM###EEEE#@@#%#TTTTPP~#AAAA|00|%#####11OHpTALeeiuaanttndIlhgeTeourI:ra#@@#:gETTen00:d11#J%a~p%anese@T01

日本語の変換結果

<<d/d/i<<<di<<<dvhp/p/ivhp/l/i>e><<p><<pv>e><pg<lvalp>lp>>al>>l/g>dbebedb><<l>>/r/r>/cc>>s>s<>aaNNpeeaalssmmauueecrr>>e<aaN///ah>><me/eah//>depp>aeedrr>ssNN/aapmmleea>>ceNa<<mppell>aacceeNNaammee>>//ppllaacceeNNaammee>>

人物名・地名・詩行がTEI要素に変換されており、このXMLも tei_all.rng でバリデーションに通ることを確認しました。

!

oiteiはイスラーム圏テキスト向けのツールであるため、以下の点に注意が必要です。

  • teiHeadercalendar="#ah"(ヒジュラ暦)が固定で出力される
  • publisher が “Open Islamicate Texts Initiative” 固定
  • 日本語で使う場合、固有表現タグの前後にスペースが必要

本格的に日本語テキストのTEI化を行う場合は、oiteiの出力をベースにヘッダ等を修正するか、別のツールの利用を検討してください。

TEIスキーマによるバリデーション

生成されたXMLがTEI規格に適合しているか検証します。

#c#xumTrhxlEltmlItli-plnAssitlL:nl/t-treetile-aicx_.naoglrlgt./errine_glael\als.er/nxgmls/atmepil/ec_utsetio.mx/mslchema/relaxng/tei_all.rng
sample_tei.xmlvalidates

TEI公式のRelaxNGスキーマ(tei_all.rng)で バリデーションに通る ことを確認しました。

!

OpenITI独自のカスタムスキーマ(tei_openiti.rng)でも検証を試みましたが、434KBと大きいスキーマのコンパイルに非常に時間がかかり、ローカル環境では完了しませんでした。tei_alltei_openiti のスーパーセットであるため、tei_all で通れば基本的な適合性は確認できます。

まとめ

  • oitei を使えば、OpenITI mARkdown → TEI XML の変換がPython数行で可能
  • XMLタグの手書きが不要で、特にRTL言語を扱う際のエディタ上の混乱を回避できる
  • 生成されるXMLはTEI標準スキーマのバリデーションに通る
  • <persName>, <placeName>, <date> 等の固有表現タグが自動付与される

軽量な記法で書いて、必要な時にTEI XMLに変換する。このワークフローは、特にイスラーム圏の歴史テキストを扱う研究者にとって有用なアプローチです。

参考リンク