お知らせ

本記事で紹介する流れをわかりやすくした記事を作成しました。以下も参考にしてください。

概要

NDL古典籍OCR-Liteを用いたアノテーション付きIIIFマニフェストファイルとTEI/XMLファイルの作成を行うツールを試作したので紹介します。

アノテーション付きIIIFマニフェストファイルの作成

まず、NDL古典籍OCR-Liteを用いて、IIIFマニフェストファイルを入力として、アノテーション付きIIIFマニフェストファイルを出力するGradioアプリを作成しました。Hugging FaceのSpaceを用いて公開しています。

https://nakamura196-ndlkotenocr-lite-iiif.hf.space/

出力結果として、以下のようなアノテーション付きIIIFマニフェストファイルが得られます。

{}""""}"]@itl,icdya"]t{}{}o"pbne,n:eeo"m"""""}"]"]"""""}"]"]t"lnsitwhl,i,aitwhl,i,ae":"e"dyiea"]t{}n{}dyiea"]t{}n{}xh:":"pdibnen"pdibnentt"::etgeo"m"""]o"""]:etgeo"m"""]o""""tM{["hhln1sitititi"hhln2sitititi:pa[":"t"e""dyt{}adyt{}{}{}{}{}{}{}":"t"e""dyt{}adytsn.h:":":"pet"pe,,,,,,h:":":"pet"pe":it":::em"""""}i:em"""""}"""""}"""""}"""""}"""""}"""""}"""""}t":::em"""""}i:emh/ftC6{["sitmtbo"sitmtbitmtbitmtbitmtbitmtbitmtbitmtbtC6{["sitmtbo"st/epa84[":"dyoao""""""]n":"dyoao""dyoao""dyoao""dyoao""dyoao""dyoao""dyoao""pa84[":"dyoao""""""]n":"tds"sn97h:"ptrditfwhssh:"ptrdtv"ptrdtv"ptrdtv"ptrdtv"ptrdtv"ptrdtv"ptrdtvsn97h:"ptrditfwhssh:plt:00t":eigydyoiee{}"t":eigyya:eigyya:eigyya:eigyya:eigyya:eigyya:eigyya:00t":eigydyoiee{}"t":."/a,6tA["ve""prdir:tA["ve"pl"ve"pl"ve"pl"ve"pl"ve"pl"ve"pl"ve"pl/a,6tA["ve""prdir:tA[n,/s,pn":at::emtgv"""pn":at:eu":at:eu":at:eu":at:eu":at:eu":at:eu":at:eu/s,pn":at::emtgv"""pn]/dd"snht""ahhiitp[snht""eht""eht""eht""eht""eht""eht""ed"snht""ahhiitp[snill,:t"i:{":t"tcdyr:t"i:{:"t"i:{:"t"i:{:"t"i:{:"t"i:{:"t"i:{:"t"i:{:"l,:t"i:{":t"tcdyr:i..ttAoh":"e"pottAo:tAo:tAo:tAo:tAo:tAo:tAo:.ttAoh":"e"potign/apnn"t"::":ef/apnn""pnn""pnn""pnn""pnn""pnn""pnn""n/apnn"t"::":ef/afoddtsn"htI6:"idtsn"hT"sn"hT"sn"hT"sn"hT"sn"hT"sn"hT"sn"hT"ddtsn"htI6:"idt..lli::tpm"84":lli::te::te::te::te::te::te::telli::tpm"84":lliij..ottsai97[he.ottxttxttxttxttxttxttx..ottsai97[he.oopgnn/a"p:gm00t""nn/a"pt/a"pt"/a"pt"/a"pt/a"pt/a"pt/a"ptgnn/a"p:gm00t""nn//odPdtss/ea,6tI:dPdtcsudtcsudtcsudtcsudtcsudtcsudtcsuodPdtss/ea,6tI:dPaa.lalic:/"g,pmlalio:alio:alio:alio:alio:alio:alio:a.lalic:/"g,pmlappj.g.o:/d,esa".g.om/l.om/l.om/l.om/l.om/l.om/l.om/lj.g.o:/d,esa".giipgennp/l/:glgennm/Bnnm/Bnnm/Bnnm/Bnnm/Bnnm/Bnnm/Bpgennp/l/:glge///o"d"ad.j/eeo"d"edod"edod"edod"edod"edod"edod"edo/o"d"ad.j/eeo"pia.,l,ilnp/Sv.,l,nldl,nldl,nldl,nldl,nldl,nldl,nld"a.,l,ilnp/Sv.,ripj.n.dedeej.t.y.t.y.t.y.t.y.t.y.t.y.t.ypj.n.dedeejeiipgtnlglrlpgin"gin"gin"gin"gin"gin"gin"ipgtnlglrlpsf//oid.".v2/ond,ond,ond,ond,ond,ond,ond,//oid.".v2/e/ia.nlg,ni"a.gl.gl.gl.gl.gl.gl.glia.nlg,ni"an3ipjg.odcpj".j".j".j".j".j".j".ipjg.odcpt4iip"g.leip,gp,gp,gp,gp,gp,gp,giip"g.leia3f//,oj.2//o/o/o/o/o/o/of//,oj.2/t7/ia.pg"ia.a.a.a.a.a.a./ia.pg"ii63ipj/o,ipjpjpjpjpjpjpj3ipj/o,io84iipa.iipipipipipipip4iipa.in63f//pjf//////////////3f//pjf//7/iaip/iaiaiaiaia"iaia7/iaip/3m63ip//3ipipipipipipip63ip//3/a84iiia4iiiiiiiiiiiiii84iiia4cn63f/ip3f/f/f/f/f/f/f/63f/ip3oi/7/iii7/i/i/i/i/i/i/i/7/iii7nfc63if/63i3i3i3i3i3i3ic63if/6tea84i/i84i4i4i4i4i4i4ia84i/i8esn63f3i63f3f3f3f3f3f3fn63f3i6xtv/7/4i/7/7/7/7/7/7/7/v/7/4i/t.ac633fc63636363636363ac633fc.jsa847/a84848484848484sa847/ajs/n6363n63636363636363/n6363nso1v/784v/7/7/7/7/7/7"/72v/784von"ac663ac6c6c6c6c6c6c6"ac663an",sa8/7sa8a8a8a8a8a8a8,sa8/7s",/n6R6/n6n6n6n6n6n6n6/n6R6/,1v/081v/v/v/v/v/v/v/2v/082/ac06/acacacacacacac/ac06/psa0/asasasasasasasapsa0/aa/n0Rn/n/n/n/n/n/n/na/n0Rng1v00n1v1v1v1v1v1v1vg2v00ne/a00o/a/a/a/a/a/a/ae/a00o"ps10sasasasasasasas"ps20s,a//0"n/n/n/n/n/n/n/,a//0"g1f0,n1n1n1n1n1n1n1g2f0,e"u0o#o#o#o#o#o#o#e"u0/,l1sxsxsxsxsxsxsx/,l2il"/y/y/y/y/y/y/yil"m/,0w1w2w3w4w5w6wm/,af"h"h"h"h"h"h"hafgu,=,=,=,=,=,=,=guel5554446elal2203329aln/7997784n/n0032553,n0o/,,,,,,4o/"d2233229"d,e7020879,ef507455,fa,92,"363au1,,1,,1ul1260460lt413353,t.,8,,,,2.j9,81529jp3404259pg52"7221g""4,5"""",,"",,,,,,"

TEI/XMLファイルの作成

上記で得られたアノテーション付きIIIFマニフェストファイルを入力として、TEI/XMLファイルを作成するライブラリを作成しました。

https://www.npmjs.com/package/@nakamura196/iiif-to-tei

以下のような構成から使用することができます。

{}"""""}"""}nvdms,aldaeeac"uie""mrsirttcp@gescnieheenl"ir"psonnao:oi:ttrsdkbnps""eea"""t""::"nm:c:ii::cuoon""ir"n"nd{e""ea^v1"ec,Is11e.:xhS"91r0.oC:6.t."j"0"0"s\,{i.,",""i2,,Ei"rfr-otro:-tneoi"t:es"t^1s.p0e.c1i"f,ied\"&&exit1"

data/inputフォルダにマニフェストファイルを格納し、以下を実行すると、data/outputフォルダにTEI/XMLファイルが出力されます。

cccccci}cj}oooooofos)nnnnnnno;iicssssss(snmmotttttt!fctJFccfcppnfsoSiosooos{fpgios.njOlnn.nrrtsalnu.mssNescsXwsttItoptekoostoctMroiI=hbupxdln.noLil{{iItuiieFfjsn}coteiFr==_tsr.iosts)oue.sIfTed_tSllrotii;ntFloIToqrridsyoeEnxnnspiomIoTueeriSngsaDmccctulgeFTEiqqryc(calollte(FTeIruu=n(`=htOnuutFS`uoiCeii=coJ(auvddeiynTo(rr"(uSgjteeei.lncE=n'ee."otOls=prIFXjectIvf((/.upNooutmams(iCres''d/tubnJteaclo=o:ooer'pgadpt.FSrgsnunnqt)altau_siO=ei=pt$vue;toattdylN=sm.ap{}eirhb/a_ine.i:icxtuprr''i/drcpinlomhtafte}))noi,(=aietenl.Ftre(;;purp>rfwr:vjihor'=ut){asTueol.m@tp)t{eoIetrieb}rr"urh(TI,rtn,a'ee;t{e:.feIue(sifpq"cjsiFeroteirou;u$o.(T.uenio/ir{irjoctiafmirsonesTopXm-ieiu(aoEnumeti(vtidnIvtl(of'epnFDCe_)j--@:upiaord;st/tntultntioesoat_teav(rnir-krd_S)ej,F'ctauidy;rsi;/emerintopliiu}rcenaen'r}`,(rDt)d)a))j(ah}e;1;;"s{t.x9*oab'6.n)a;/jF;s$isie{iolnpineaaf",mt-)eht)'(.o;ujb-tsatfose8nei'Fn')ia))lm;;ee,(ou.tjpsuotnF'i)le)}`.)x;ml');

出力されるTEI/XMLファイルの例は以下です。

<<<<???T/xxxE<<<TmmmIt/t/f/Ellle<te<ta<<fI--xif/exb/ecs/s/a>vmmmHi<<<fito<<bxsu<<<<<<<<su<sceoolelt/p/s/iH>dd/dotirgzzzzzzzurgusrddnaei<tu<po<sleyi<<<<<<<did>mfrooooooorfrriseesdDttibpuum/oea>vaaaaaaaivyiaannnnnnnfaafmill=eelitl>brs<muDdbbbbbbbv>lcpeeeeeeeacpaio"rsetliClcDm/sreen>neehcehclnhhh>cSlecoiees<mDcsr=ttttttt=ixxxxxxxeiee=rrt>teSancDsIiseec>"yyyyyyy"sscmmmmmmm>sc>>"eetm>ttvaecddIsD>1ppppppp2aallllllla1ffptmiets>endce"eeeeeee"mmu:::::::mu.==:>toricnoe>s>=======/eeriiiiiiier0""/>nto>t>nc""""""">AAldddddddAl"hh/Seniht>lllllllss========s=ttwtdSftiiiiiiii==""""""""="ettwmtitfnnnnnnn""hzzzzzzz"hnppw.tfmepieeeeeeehhtooooooohtc::.>rtrse"""""""tttnnnnnnntto/to>>:rttpeeeeeeetpd/em/>cccccccpps-------psiwwi</oooooooss:0000000s:nww-/Idrrrrrrr::-------:gwwctIlrrrrrrr/0123456=...iI.eeeeeeed"""""""d"ttotFnsssssssddldlUeerldpppppppll.uuuuuuul.TiigeMl=======..nlllllll.nF--/>a."""""""nndxxxxxxxnd-ccnng#######ddl=======dl8..siozzzzzzzll."""""""l."oo/f.ooooooo..g5554446.g?rr1ejnnnnnnnggo2203329go>gg.speeeeeeeoo.7997784o./0t/-------..j032553".jrr"<a0000000jjp""""""jpee>/p-------ppupllpi0123456/auuuuuulaee>/"""""""aapllllllyapaai>>>>>>>ppiyyyyyy=pissiii======"ieei/i""""""4i//f<<iii2233229iixx///iii7020879iimm3aaiif507455"ifll4bbff"92"36f//3>>/3""""l3tt7334llr34ee6<443rllrllx43ii8/337xrrxrr=37//6a776=xx=xx"76cc/b668"=="==168uum>8865""4""086ssa6635544406ttn/R8517434Rooimc0415824"c0mmfaa0"15"06a0//enn0""""ln0sssiv0llrv0cctfa0rllrllya0hh.<es0yrryrr=s0eej/s/1=yy=yy"/2mmsat1/"=="==32/aaob."f1""1""4"f//n>ju2237339urr<sul1437300ulee/oll035970"llllinx/"32"58/x/aad"=f/"""">=fxxn>"u>///"unno0l>>>0lgg>"l"l//<//tt/u0u0eeal/l/iibydyd__>=e=eaa"f"fll0a0all"u"u..llrrltltnnr.r.ggxjxj""=p=p"g"gtt6"6"yy8/8/pp9>9>ee00==""""aallpprrppyyll==ii""cc44aa77tt<00ii/66ooa""nnb>>//>xxmmll""sscc<hh/eeammbaa>ttyyppeennss==""hhttttpp:://rpeulralx.nogc.locr.grngsdsstdrlu/cstcuhreem/a1t.r0o"n?">?>

Oxygen XML Editorを使って、以下のように出力結果を確認することができます。

参考:Turborepoを用いたモノレポ開発

上述したnpmパッケージの開発にあたり、Turborepoを用いたモノレポを用いました。

ウェブアプリはNext.jsを用いて開発しました。以下から利用することができます。

https://iiif-tei-monorepo-web.vercel.app/

APIについては、Swagger UIを通じて、以下からご確認いただけます。

https://iiif-tei-monorepo-web.vercel.app/api-docs

Pythonからは以下のように使用することができます。

iiff@ccmmrrdllppooaaaoommtssrras"iibs"dddtttdc"nna"eeeyalC"ccsI"fffrjptaolleIIesiasnuu_II"A"ssc"IAR"p}ir_"AAR"teeqoncsvdduFI_"r"eeo"Ire"afem"Pre"rxxungleeerTFi"g"lln"Igt"yta"Igt"yccear__lonsffvFsulouksu:eesistif:Tti:a..e:moro"pp}re:prr#r#r#irprprtmsOmaEotpacrapnamtan_aneeefetataspep"acOI_ipotntsdaiyryssHsstiiost"gspCT__in_ii:nolsel:pTpunursjsri"eitlE(b_vffo=ino"""eqoosjh}tToloedrreesetiosmiiIsaberenTfsaiibluaTnese,iPnttreanqomn:ioeesarossE{e:dnnafedEsloamsrtiurnVOpslnnlestmt:Is[ccs.s:Iefndee=roasree.apo:beatAf_e___t"lle_t.=e'o.JerieesqJltro:l:P,u_emoX"ouuUm(X=cprCurSrs_lstuSuito[IrunabM:pddrasMoasotaOeumsVuseOeolbsalrdnjLteelkeLrny=n=iNslsal.sNEndotp:lpiemiIF"elevl{t3sptg=ltetDraa=oriofcaoma:_fqeoe0eo.u.xserltl]_A=ieTtnnacr,uran_ng=regc.co,aFbPnsE:isgsoeetdtfseeEeeRorca==aIattIf"eipqps_,-oetrsrtped(Dll"sp(moIe]smtuateTr.(eur(tqefiasFN"ei=sapXIs"iieysny_j'slo'iuE"cseao"__entMIt=:losl.dpsssutrtoerItslnubfliiLF_entoppetoul.(ensrn,serUa"ffoo{o"s(aoo'anctgfistovelRs{,enbp:.pdsi:t(c.e"X.EraA:Lesssjtba:tnu)egtAmRxln_et:eioay(t'sse(Plecaiysul_copslD,a(st'I'qesdt:rfoOtnteoip)'(d,uprl.bpsi_acp,'eEeteJ)".ajt.oudtletrsi:S:hrpeiinr)[iFrartoOtsiconslscarioEnNtt_tnc.talolrx(prb:alirtsrs:cfr:ialun,ie''e"e/psD[dco),,{pAs/(eiCelAn:etPpl'_co_un/'riIoo/utnidyjUronc'r[vme]snonrsa)lsea_)okreel}trgfnn_aq:h/rtea'omsuoa,Oscwse{spp,sngesstiAtis}:tt:/nimte.r3cyoirrf(0o]nl:rDae0n,seoei)0v],rtl}"e'ae"r=)id)tl:"Nso:{nse{t)dre(tea)i}sl"ts)r}:")
#c#telrxiyce3:en:#m}tp#wpptaeritrniiti=i_nhEnf"""xtfxtIe@itm(o.c(Iscdyl"pwefIto"perp"F_n:e=nitTot"(tiobe":c"eoTjxhlo(n:Eett"iutIc"tMetea{Ct:panpiselsntu_}i=":i.txe"eh/fc.m:)n{t/eoxlttdsnm)(pltvl":."e"hn,r,t/dttil_"pi.fwsigr":foo",/..m)/ij_eiopmni//aciaanofppid-iifit//enepisgirit=-ei("msfmuoe/atnn3nfot4i-ra3f8et7e"pi6s)oo8t-n6_aw//ose3mbb/ajf.cne:voicenftrte)cesextlt...jajspsopon"n")",,

まとめ

NDL古典籍OCR-Liteを用いたOCRテキストからTEI/XMLファイルを作成する流れについて紹介しました。

今後は、上記のように複数のアプリを介さず、1つのアプリで完結するような仕組みも構築したいと思います。

色々と足りない点がありますが、参考になる部分がありましたら幸いです。