kzhr's diary

ad ponendum

天草平家と天草伊曾保の画像・翻刻対照HTMLを作る

突然謎の感情をあらわにすると、日本語史の講読で、講読資料の翻刻を作ったり、翻字したりするのも学習のうちだろうと頭のなかで煩悶が駆け巡るが、それは自分が興味を持ってぶち当たってからでいいというのが昨今らしく、まだ30代半ばなのに隔世の感を覚える。それはさておき、そのような時代背景もあり、天草平家と天草伊曾保については、国語研がありがたくも画像と翻刻を公開してくれているので、標記のものを作ろうと思い至った。(なお、本記事で用語解説は基本的にしない。)


とはいえ、国語研のテキストはローマ字と国語研UniDic流本文であり*1、当時の発音に基づいたローマ字だけでは学生にいきなり渡すにはしんどいところもあり、かといって現代化された表記で適当に発音されるのも耳が喜ばないので、平仮名翻字を用意しておく必要がある。翻字のありかたについては、注1の片岡ほか論考に既存のものが取り上げられているが、音韻・音価の変化の激しい時代であり、読みやすさをあまりに重視して現代的あるいは古典的表記に振ると、当時の音とはかけ離れてしまう問題がある*2。そのへんは、変換ロジックを用意する一手間がある(しかも、のちに見るように、一意に定まる保証はない)。

dglb01.ninjal.ac.jp

www2.ninjal.ac.jp

PDFを作りたかったけれど、断念したので、とりあえずHTMLにした。

あ、画像はcurl的ななにかでよしなに落としておいてください。

変換については、表記の正規化を図った上で変換テーブルを用意するのがけっきょくは実用的である(行またぎの処理が複雑になりすぎるので)。ただし、これでは、san.bia.cuとto.bi.a.ga.ruのように識別不能なものもある。発音としてはっきり区別できていたかは定かでない。このほか、天草伊曾保における外来語には対応できないが(e→イ、tho→トであとはイレギュラーなもののみになるはず)、読み方がはっきりと分らないので、もとよりそのへんは手で直すよりない。これを、原則的に最長一致で変換してゆく。こまかいことがらはプログラムを見てほしい。

#!which perl

use strict;
use warnings;
use utf8;

use open qw/ :std :utf8 /;

my $argv = shift @ARGV;
die "no argument" unless $argv;
die "not a file (please check if it is on the same directory)" unless -f $argv;

open my $fh, "<", $argv or die;

my %table = &convert_table();

my $p = "";
my $l = 1;

while (my $line = <$fh>) {
    chomp $line;
    next unless $line;
    if ($line =~ /\A(.+)\z/ms) {
        $p = $1;
        $l = 1;
        next;
    }

    # remove line numbers
    $line =~ s/\A\d+\t//ms;

    my $orig = $line;

    # eratta
    $line =~ s/{.+?}//g;
    $line =~ tr/«»‹›//d;

    # normalisation
    $line =~ s/I([aeiou])/j$1/g;
    $line =~ tr/A-Z/a-z/;
    $line =~ s/\Avm\./右馬./ms;
    $line =~ s/\Aqi\./喜一./ms;
    $line =~ s/ô/oU/g;
    $line =~ s/ŏ/aU/g;
    $line =~ s/ŭ/uU/g;
    $line =~ s/ã/an/g;
    $line =~ s//en/g;
    $line =~ s/ĩ/in/g;
    $line =~ s/õ/on/g;
    $line =~ s/ũ/un/g;
    $line =~ s/à/aA/g;
    $line =~ s/â/aA/g; # possibly a typo of "à"
    $line =~ s/v/u/g;
    $line =~ s/ſ/s/g;
    $line =~ s/([csxtp])\1/Q$1/g;
    $line =~ s/cq/Qq/g;
    $line =~ s/ç/C/g;
    $line =~ s/ij(?![ie])/ii/g;
    $line =~ s/t\-\z/Q/ms;
    $line =~ s/\-\z//ms;
    $line =~ tr/,./、。/;

    # strong "u"
    $line =~ s/(?<![qg])ua//g;
    $line =~ s/(?<![qg])uo//g;

    # logic
    my @cc = split //, $line;

    my $transcr = "";
    my $length = scalar(@cc);
    my $i = 0;
    LOOP: while (1) {
        last if $i >= $length;
        for my $j (3, 2, 1, 0) {
            if ($i + $j < $length) {
                my $c = join "", @cc[$i .. $i + $j];
                if (exists $table{$c}) {
                    $transcr .= $table{$c};
                    $i += $j + 1;
                    next LOOP;
                }
            }
        }
        $transcr .= $cc[$i];
        $i++;
    }

    $transcr =~ s/\s//g;
    printf "%s-%02d\t%s\t%s\n", $p, $l, $orig, $transcr;
    $l++;
}

sub convert_table {
    my %ct = ();
    while (my $line = <DATA>) {
        chomp $line;
        my @c = split /\s+/, $line;
        $ct{$c[0]} = $c[1];
    }
    close DATA;
    return %ct;
}

__DATA__
a   あ
A   ァ
i   い
y   い
u   う
U   ゥ
e   い
ca  か
qi  き
cu  く
qu  く
qe  け
co  こ
ga  が
gui ぎ
gu  ぐ
gue げ
go  ご
sa  さ
xi  し
su  す
xe  せ
so  そ
za  ざ
ji  じ
gi  じ
zu ず
je  ぜ
zo  ぞ
ta  た
chi ち
tCu つ
te  て
to  と
tho と
da  だ
gi  ぢ
zzu づ
de  で
do  ど
na  な
ni  に
nu  ぬ
ne  ね
no  の
fa  は
ha  は
fi  ひ
fu  ふ
fe  へ
fo  ほ
ba  ば
bi  び
bu  ぶ
be  べ
bo  ぼ
pa  ぱ
pi  ぴ
pu  ぷ
pe  ぺ
po  ぽ
ma  ま
mi  み 
mu  む
me  め
mo  も
ya  や
yu  ゆ
ye  え
yo  よ
ra  ら
ri  り
ru  る
re  れ
ro  ろ
ua  わ
uo  お
n   ん
m   ム
Q   っ
t   ッ
qia きゃ
qiu きゅ
qio きょ
qeo きょ
qua くゎ
guia    ぎゃ
guiu    ぎゅ
guio    ぎょ
gueo    ぎょ
gua ぐゎ
xia しゃ
xa  しゃ
xu  しゅ
xo  しょ
jia じゃ
ja  じゃ
ju  じゅ
jo  じょ
cha ちゃ
chu ちゅ
cho ちょ
gia ぢゃ
giu ぢゅ
gio ぢょ
nha にゃ
nhu にゅ
nho にょ
fia ひゃ
fiu ひゅ
fio ひょ
bia びゃ
biu びゅ
bio びょ
beo びょ
mia みゃ
miu みゅ
mio みょ
meo みょ
ria りゃ
riu りゅ
rio りょ
reo りょ
[t] [t]

これで出たものをHTMLに変換する。なお、変換にかけるまえに、国語研のテキストファイルから凡例を消し、(扉)などの箇所を画像ファイル名に合わせておく前提である。

#which perl

use strict;
use warnings;
use utf8;

use open qw/ :std :utf8 /;

my $argv = shift @ARGV;
die "no argument" unless $argv;
die "not a file (please check if it is on the same directory)" unless -f $argv;

open my $fh, "<", $argv or die;

my $xml = <<EOF;
<!Doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>$argv</title>
</head>
<body>
EOF

my @op = ();

my $p = "";
my $i = 0;
while (my $line = <$fh>) {
    chomp $line;
    my @items = split /\t/, $line;
    my($cur_p, $cur_l) = split /-/, $items[0];
    if($p ne $cur_p) {
        $i++ if $p;
        $p = $cur_p;
    }
    push @{$op[$i]{$p}{orig}}, "<p>$items[1]</p>\n";
    push @{$op[$i]{$p}{transcr}}, "<p>$items[2]</p>\n";
}

for my $page (@op) {
    my @keys = keys %{$page};
    my $k = shift @keys;
    my $page_num = $k =~ /^\d+$/ ? sprintf "p%03d", $k : $k;
    my $orig = join "", @{$page->{$k}{orig}};
    my $transcr = join "", @{$page->{$k}{transcr}};
    $xml .= sprintf qq(<table id="%s"><tr><td><img src="./or_59_aa_1_%s.jpg"></td><td class="orig">%s</td><td class="transcr">%s</td></table>), $k, $page_num, $orig, $transcr;
}

$xml .= "</title>";

print $xml;

あとはHTMLを加工するだけ……。

雑に作るとこうなる。

f:id:karpa:20210603020231p:plain
HTML出力イメージ

*1:片岡ほか2018

*2:ないというひとは国語研のコーパスか、国語研で出ている原本画像・翻刻対照のシステムを使っててください。