原文と対訳文のタグ情報を一つのファイルNo.04316
Majima さん 04/05/15 20:34
 
いつもお騒がせしております。次のような作業をしようとしていますが、手作業だと
非常に大変です。アイディアを示しますので、
どなたか形にしていただけると非常に助かります。

次のような原文と対訳文のファイルがあります。

【原文】*****************************
<body id=1>
<div id=1.1>
<head id=1.1.h1>あいうえお</head>
<p id=1.1.p1>
<s id=1.1.p1.s1>あああ。</s>
<s id=1.1.p1.s2>いいい。</s>
<s id=1.1.p1.s3>ううう。</s>
<s id=1.1.p1.s4>えええ。</s>
<s id=1.1.p1.s5>おおお。</s>
</p>
<p id=1.1.p2>
<s id=1.1.p2.s1>かかか。</s>
<s id=1.1.p2.s2>ききき。</s>
<s id=1.1.p2.s3>くくく。</s>
<s id=1.1.p2.s4>けけけ、こここ。</s>
</p>
<p id=1.1.p3>
<s id=1.1.p3.s1>さささ。</s>
<s id=1.1.p3.s2>ししし。</s>
<s id=1.1.p3.s3>すすす。</s>
<s id=1.1.p3.s4>せせせ。</s>
<s id=1.1.p3.s5>そそそ。</s>
</p>
</div>
</body>

【対訳文】*****************************
<body id=1>
<div id=1.1>
<head id=1.1.h1>aioueo</head>
<p id=1.1.p1>
<s id=1.1.p1.s1>aaa.</s>
<s id=1.1.p1.s2>iii.</s>
<s id=1.1.p1.s3>uuu.</s>
<s id=1.1.p1.s4>eee.</s>
<s id=1.1.p1.s5>ooo.</s>
</p>
<p id=1.1.p2>
<s id=1.1.p2.s1>kakaka.</s>
<s id=1.1.p2.s2>kikiki.</s>
<s id=1.1.p2.s3>kukuku.</s>
<s id=1.1.p2.s4>kekeke.</s>
<s id=1.1.p2.s5>kokoko.</s>
</p>
<p id=1.1.p3>
<s id=1.1.p3.s1>sasasa.</s>
<s id=1.1.p3.s2>shishishi,sususu,sesese.</s>
<s id=1.1.p3.s3>sososo.</s>
</p>
</div>
</body>

これを次のようなそれぞれのタグ情報だけをまとめたファイルを
作ろうと思います。

【目標とするタグ情報ファイル】********************************
<linkGrp domains="1 ; 1">
<linkGrp domains="1.1 ; 1.1">
    <link xtargets="1.1.h1 ; 1.1.h1">
<linkGrp domains="1.1.p1 ; 1.1.p1">
    <link xtargets="1.1.p1.s1 ; 1.1.p1.s1">
    <link xtargets="1.1.p1.s2 ; 1.1.p1.s2">
    <link xtargets="1.1.p1.s3 ; 1.1.p1.s3">
    <link xtargets="1.1.p1.s4 ; 1.1.p1.s4">
    <link xtargets="1.1.p1.s5 ; 1.1.p1.s5">
</linkGrp>
<linkGrp domains="1.1.p2 ; 1.1.p2">
    <link xtargets="1.1.p2.s1 ; 1.1.p1.s1">
    <link xtargets="1.1.p2.s2 ; 1.1.p1.s2">
    <link xtargets="1.1.p2.s3 ; 1.1.p1.s3">
    <link xtargets="1.1.p2.s4 ; 1.1.p1.s4 s5">
</linkGrp>
<linkGrp domains="1.1.p3 ; 1.1.p3">
    <link xtargets="1.1.p3.s1 ; 1.1.p3.s1">
    <link xtargets="1.1.p3.s2 s3 s4 ; 1.1.p3.s2">
    <link xtargets="1.1.p3.s5 ; 1.1.p3.s3">
</linkGrp>
</linkGrp>
</linkGrp>

タグ情報は左に原文の情報、右側に対訳文の情報が入るようにします。
それぞれの数字が何を表しているのかは、原文と対訳文をごらんに
なるとお分かりになると思います。要は原文と対訳文のどれとどれが
対応しているのかということを示すファイルなのです。

例えばそれには

   <link xtargets="1.1.p1.s1 ; 1.1.p1.s1">

のように、

【原文】 <s id=1.1.p1.s1>あああ。</s>
【対訳文】<s id=1.1.p1.s1>aaa.</s>

原文と対訳文が1対1で対応する文もあれば、

<link xtargets="1.1.p2.s4 ; 1.1.p1.s4 s5">

のように、

【原文】 <s id=1.1.p2.s4>けけけ、こここ。</s>
【対訳文】<s id=1.1.p2.s4>kekeke.</s>
     <s id=1.1.p2.s5>kokoko.</s>

原文が1で対訳文が2の場合もあります。また逆に次のように

<link xtargets="1.1.p3.s2 s3 s4 ; 1.1.p3.s2">

【原文】 <s id=1.1.p3.s2>ししし。</s>
     <s id=1.1.p3.s3>すすす。/s>
     <s id=1.1.p3.s4>せせせ。</s>
【対訳文】<s id=1.1.p3.s2>shishishi,sususu,sesese.</s>

原文が3で対訳文が1の場合もあります。文によっては原文に対応
する対訳文が無い0の場合も考えられます。

このようなファイルの特徴を考えた上で、原文と対訳文を一行ずつ
確認しながらOKのボタンを押すと、一行ずつ自動的に上に挙げたような
目標とするタグ情報ファイルを書き込んで作ってくれるマクロを
作ろうと思います。
全てが1対1で対応すれば、そんなに問題なく組めそうですが、必ず
1文ずつ目で確認しなければなりませんので、どういうふうにマクロを
書けばいいものかと途方に暮れています。

私の考えでは、秀丸のウインドウ3つを上、中、下と三つに分けて、
上に原文ファイル、下に対訳ファイル、そして中にマクロの中で
作成していくタグ情報ファイルをリアルタイムで表示するように
したいと思います。原文、対訳文それぞれの一文を視覚的に表示する
にはその行だけ反転表示をさせて、この文とこの文が対応することを
タグ情報ファイルに書き込んでもいいですか?見たいなダイアログを
出して、それでOKならボタンを押して、自動的に書き込んでくれる
みたいな方式です。

ここまでは何とか自分の力でなりそうな気もしますが、必ずしも1対1
で対応するとは限らないので、ダイアログを出してその結果によって
原文を2行にするとか、対訳文を3行に増やすとかして、もう一度
確認のダイアログでこれで良いのかダメなのか聞いてくれるように
したいのです。ウインドウを3つに表示するわけは、こういった1対1
で対応しない場合、上下の文脈も確認しながらどこまで文を増やすか
考える必要があるからです。

大体お分かりになっていただけたでしょうか。もしお時間の許す限り
私に付き合っていただけたらと思います。よろしくお願いします。


[ ]
RE:04316 原文と対訳文のタグ情報を一つのNo.04320
アルビレオ さん 04/05/16 06:47
 
アルビレオです。

>私の考えでは、秀丸のウインドウ3つを上、中、下と三つに分けて、
>上に原文ファイル、下に対訳ファイル、そして中にマクロの中で
>作成していくタグ情報ファイルをリアルタイムで表示するように
>したいと思います。原文、対訳文それぞれの一文を視覚的に表示する
>にはその行だけ反転表示をさせて、この文とこの文が対応することを
>タグ情報ファイルに書き込んでもいいですか?見たいなダイアログを
>出して、それでOKならボタンを押して、自動的に書き込んでくれる
>みたいな方式です。

秀丸はウィンドウを3分割できません。
それに対応付けの作業自体はマクロ内でやるより普通にテキストエディタの機能
を使ってコピー&ペーストを繰り返した方が融通が利いてやりやすいと思います。

たとえば、まずマクロが原文と訳文を識別できるように訳文の s タグ名を大文
字にします。
前にあげられたマクロでは<s>〜</s>ごとには改行されていないので、原文と訳
文の両方でその処理もやっておいた方がいいでしょう。

【原文用】
replaceallfast "><s id=",">\\n<s id=",regular;
replaceallfast "</s><","</s>\\n<",regular;

【訳文用】
replaceallfast "<head id=","<HEAD id=";
replaceallfast "><s id=",">\\n<S id=",regular;
replaceallfast "</s><","</s>\\n<",regular;
replaceallfast "<s id=","<S id=";//←いらないかも

次に対応付け情報用に新規ファイルを開いて、原文と対訳文のファイルから内容
をコピーしていきます。
原文を丸ごとコピーしてから、対応する訳文を挿入していくと楽でしょう。
以下の内容はそうやって作りました。
body,div,pの番号はsタグにも情報が含まれていて、あるとかえって自動化の邪
魔になるので削除します。

<head id=1.1.h1>あいうえお</head>
<head id=1.1.h1>aioueo</head>
<s id=1.1.p1.s1>あああ。</s>
<S id=1.1.p1.s1>aaa.</s>
<s id=1.1.p1.s2>いいい。</s>
<S id=1.1.p1.s2>iii.</s>
<s id=1.1.p1.s3>ううう。</s>
<S id=1.1.p1.s3>uuu.</s>
<s id=1.1.p1.s4>えええ。</s>
<S id=1.1.p1.s4>eee.</s>
<s id=1.1.p1.s5>おおお。</s>
<S id=1.1.p1.s5>ooo.</s>
<s id=1.1.p2.s1>かかか。</s>
<S id=1.1.p2.s1>kakaka.</s>
<s id=1.1.p2.s2>ききき。</s>
<S id=1.1.p2.s2>kikiki.</s>
<s id=1.1.p2.s3>くくく。</s>
<S id=1.1.p2.s3>kukuku.</s>
<s id=1.1.p2.s4>けけけ、こここ。</s>
<S id=1.1.p2.s4>kekeke.</s>
<S id=1.1.p2.s5>kokoko.</s>
<s id=1.1.p3.s1>さささ。</s>
<S id=1.1.p3.s1>sasasa.</s>
<s id=1.1.p3.s2>ししし。</s>
<s id=1.1.p3.s3>すすす。</s>
<s id=1.1.p3.s4>せせせ。</s>
<S id=1.1.p3.s2>shishishi,sususu,sesese.</s>
<s id=1.1.p3.s5>そそそ。</s>
<S id=1.1.p3.s3>sososo.</s>

ここまでできたら、あとはマクロ一発で一気に目的のテキストができるはずです。
まず不要な情報を削除。
replaceallfast ">.*</(s|head)>$",">",regular;
…の続きはちょっと気力がありません。
まあかなりわかりやすくなったとは思うので、もっとレベルの高いマクロ職人さ
んにお願いしたいところです。


それからフォーマットについて気になったのですが、

【原文】
<s id=1.1.p1.s1>あああ、いいい。</s>
<s id=1.1.p1.s2>ううう。</s>

【訳文】
<s id=1.1.p1.s1>aaa.</s>
<s id=1.1.p1.s2>iii,uuu.</s>

のような場合はどうするのでしょう?
またパラグラフは完全に1対1で対応していると考えていいのでしょうか?
パラグラフの対応も一致しないことがあるのなら、かなり複雑になりそうです。

正直なところ最後の変換は完全に自動化できるはずなので、できればPerlなどを
使った方がいいと思います。

[ ]
RE:04316 原文と対訳文のタグ情報を一つのNo.04323
encodingshiftjis さん 04/05/16 14:59
 
これは、完全なアプリケーションですから
単純なマクロの範囲を越えています。

xmlデータを操作できるプログラマを養成
したほうが良いでしょう。(長期安定な解としては)
いろいろな点で、
テキスト処理は処理条件の変化に敏感ですから
ここでこなせても、保守・機能追加は大変です(たぶん)。

[ ]
RE:04320 原文と対訳文のタグ情報を一つのNo.04325
Majima さん 04/05/16 17:12
 
アルビレオさん

ありがとうございます。

>普通にテキストエディタの機能を使ってコピー&ペーストを繰り返し
>た方が融通が利いてやりやすいと思います。

基本的にコピー&ペーストの作業が大変でこの質問をしたわけです。
ファイル数もファイルの内容も多いので、左手が腱鞘炎になる勢い
ですから(笑)。でも以前はエディターではなくて、ワードプロセッサー
のキーボードマクロを利用してウインドウを行ったり来たりさせながら
タグ情報だけコピー&ペーストしていました。

>以下の内容はそうやって作りました。
><head id=1.1.h1>あいうえお</head>
><head id=1.1.h1>aioueo</head>
><s id=1.1.p1.s1>あああ。</s>
><S id=1.1.p1.s1>aaa.</s>
><s id=1.1.p1.s2>いいい。</s>
><S id=1.1.p1.s2>iii.</s>
><s id=1.1.p1.s3>ううう。</s>
><S id=1.1.p1.s3>uuu.</s>
><s id=1.1.p1.s4>えええ。</s>
><S id=1.1.p1.s4>eee.</s>
><s id=1.1.p1.s5>おおお。</s>
><S id=1.1.p1.s5>ooo.</s>
><s id=1.1.p2.s1>かかか。</s>
><S id=1.1.p2.s1>kakaka.</s>
><s id=1.1.p2.s2>ききき。</s>
><S id=1.1.p2.s2>kikiki.</s>
><s id=1.1.p2.s3>くくく。</s>
><S id=1.1.p2.s3>kukuku.</s>
><s id=1.1.p2.s4>けけけ、こここ。</s>
><S id=1.1.p2.s4>kekeke.</s>
><S id=1.1.p2.s5>kokoko.</s>
><s id=1.1.p3.s1>さささ。</s>
><S id=1.1.p3.s1>sasasa.</s>
><s id=1.1.p3.s2>ししし。</s>
><s id=1.1.p3.s3>すすす。</s>
><s id=1.1.p3.s4>せせせ。</s>
><S id=1.1.p3.s2>shishishi,sususu,sesese.</s>
><s id=1.1.p3.s5>そそそ。</s>
><S id=1.1.p3.s3>sososo.</s>

この文書に整形する自体大変そうですね(超面倒くさがり)。でもここは
自動化できないので、一つ一つ確認していかなければなりませんよね。

>ここまでできたら、あとはマクロ一発で一気に目的のテキストができ
>るはずです。まず不要な情報を削除。
>replaceallfast ">.*</(s|head)>$",">",regular;
>…の続きはちょっと気力がありません。

ここからの自動処理は基本的に、左に小文字の「s id=」が来て、右に
大文字の「S id=」が来るように揃えると考えるといいですか。要する
に「s id=」を検索してすぐ下にある「S id=」を「s id=」の行末に
つけたり、その逆だったりと。必ず一行に「s id=」と「S id=」が入る
ようにするものだと考えていますけど・・・。でもその場合「s id=」
と「S id=」で必ず対応があるといいのですが、文の中には0対応、
つまり該当するペアが無く、1対0だったりするものも機械的に認識
できるのでしょうか?私の頭の中ではそれぐらいしか考えられません。

>それからフォーマットについて気になったのですが、
>
>【原文】
><s id=1.1.p1.s1>あああ、いいい。</s>
><s id=1.1.p1.s2>ううう。</s>
>
>【訳文】
><s id=1.1.p1.s1>aaa.</s>
><s id=1.1.p1.s2>iii,uuu.</s>
>
>のような場合はどうするのでしょう?

確率的にはそれも考えられますよね。上のような例は例えば

【原文】
<s id=1.1.p1.s1>私は男で、会社員だ。</s>
<s id=1.1.p1.s2>30歳だ。</s>

【訳文】
<s id=1.1.p1.s1>私は男だ。</s>
<s id=1.1.p1.s2>会社員で、30歳だ。</s>

という文にあたりますよね。文構成を無視して意訳的に解釈した対訳
文ではありえますが、普通こういう風に対訳文を作らないということで
上のような例は一応出てこないという前提で考えています。

>またパラグラフは完全に1対1で対応していると考えていいのでしょ
>うか?パラグラフの対応も一致しないことがあるのなら、かなり複雑
>になりそうです。

パラグラフもごくごく稀に完全に1対1で一致しないものがあります。
こういう対訳文は非常に悪い対訳文として、私たちの間から嫌がられて
います(笑)。100に一つ出るか出ないかぐらいなので、これも基本的に
1対1で対応するという前提で考えています。

[ ]
RE:04323 原文と対訳文のタグ情報を一つのNo.04326
Majima さん 04/05/16 17:17
 
encodingshiftjisさん

>これは、完全なアプリケーションですから
>単純なマクロの範囲を越えています。

ありがとうございます。私はまだどれを使ってどこまで出来るのかを
よく理解していないので、漠然と「機械的にあれをこうできたらいい
なぁ」ぐらいで考えていました。機械でどこまで楽して正確に作業を
こなせるかということを考えることも楽しみではありますがね。

[ ]
RE:04325 原文と対訳文のタグ情報を一つのNo.04328
アルビレオ さん 04/05/16 22:31
 
アルビレオです。

>この文書に整形する自体大変そうですね(超面倒くさがり)。でもここは
>自動化できないので、一つ一つ確認していかなければなりませんよね。

そうなんです。どうしても確認が必要なので自動化で減らせる手間には限界があ
ります。
それにあまり自動化してしまうと、ちょっと不規則な文が出てきたりしたときに
かえって手間がかかります。
そういう場合への柔軟性を確保しながらの自動化となると、普通のテキストエ
ディタとしての操作に比べて意味があるほど手間を減らせるのかなと。
何か方法があるかもしれませんが、私には思いつきません。

>基本的にコピー&ペーストの作業が大変でこの質問をしたわけです。
>ファイル数もファイルの内容も多いので、左手が腱鞘炎になる勢い
>ですから(笑)。でも以前はエディターではなくて、ワードプロセッサー
>のキーボードマクロを利用してウインドウを行ったり来たりさせながら
>タグ情報だけコピー&ペーストしていました。

定型的に処理できるかどうかは文の内容にも左右されますよね。
それなら普通のコピー&ペーストで行なっておけば、よくあるパターンは別にマ
クロに登録するという手段が使えます。

先に私が書いたように、タグつきの原文の内容をタグ情報ファイルにコピーした
とします。
タグ情報ファイルの中で対訳文を挿入したい場所にカーソルを移動し、対訳文
ファイルで挿入したい部分を範囲選択してから、以下のマクロを実行するといい
でしょう。

#tagtext=hidemaruhandle(findhidemaru("タグ情報ファイル名.txt"));
#curtext=hidemaruhandle(0);
if(#curtext==#tagtext){
message "対訳文で範囲選択してから実行してください";
endmacro;
}
if(!selecting){
selectline;//範囲選択されてなかったら1行選択
}
//----必ず行単位で選択すれば、この部分は不要
// if(seltopx>0||selendx>0||seltopy==selendy||rectselecting){
// //行単位で選択しなおす
// #endy=selendy;
// moveto 0,seltopy;//選択範囲の先頭へ移動
// golinetop2;//論理行頭へ移動
// beginsel;
// moveto 0,#endy;//選択範囲の最後へ移動
// golineend2;//論理行末へ移動
// moveto 0,y+1;//次の行の先頭へ
// }
//----ここまで
copy;//クリップボードにコピー

setactivehidemaru #tegtext;//タグ情報ファイルに切り替え
paste;//対訳文の挿入
down;//1行下へ移動(気休め)

このマクロを基本にして、たとえば原文1行に対して訳文2行というパターンが
非常に多いなら、上のマクロの先頭に
golinetop2;//行頭へ移動
beginsel;//選択開始
movetolineno 1,lineno+2;//2行下まで選択
endsel;//選択終了
を追加して別のマクロとして保存しておけば、元のマクロと使い分けることで作
業が楽になります。

このように1つのマクロにせずに、小さなマクロを使い分けることで文の内容に
合わせたカスタマイズも容易です。
これらの小さなマクロはすぐ終了するので、対応しきれない特殊な場合はテキス
トエディタとして手で修正できるので小回りがききます。

>ここからの自動処理は基本的に、左に小文字の「s id=」が来て、右に
>大文字の「S id=」が来るように揃えると考えるといいですか。要する
>に「s id=」を検索してすぐ下にある「S id=」を「s id=」の行末に
>つけたり、その逆だったりと。必ず一行に「s id=」と「S id=」が入る
>ようにするものだと考えていますけど・・・。

<s>...</s>を行単位にそろえておくことがミソです。
行頭が「<s id=」で始まる行が連続していればそれは1つのブロック、
「<S id=」で始まる部分は次に「<s id=」が出てくるまでがそれに対応するブ
ロックになります。

<s id=1.1.p1.s1>あああ。</s>
<s id=1.1.p1.s2>いいい。</s>
--ここまでが原文のブロック--
<S id=1.1.p1.s1>aaa.</s>
<S id=1.1.p1.s2>iii.</s>
--ここまでが対応する訳文のブロック--
--ここからは次のブロック--
<s id=1.1.p1.s3>ううう。</s>
...

>でもその場合「s id=」
>と「S id=」で必ず対応があるといいのですが、文の中には0対応、
>つまり該当するペアが無く、1対0だったりするものも機械的に認識
>できるのでしょうか?私の頭の中ではそれぐらいしか考えられません。

それにはまず、<link xtargets="1.1.p1.s1 ; 1.1.p1.s1">の書式が片方が空の
場合にどう表記するかを考える方が先でしょう。
私の案だと1対0には対応できず、対応する文がないと自然に前か後ろのブロッ
クにくっついてしまいます。実際、そういう形で対処した方が楽だと思います。

>確率的にはそれも考えられますよね。上のような例は例えば
>
>【原文】
><s id=1.1.p1.s1>私は男で、会社員だ。</s>
><s id=1.1.p1.s2>30歳だ。</s>
>
>【訳文】
><s id=1.1.p1.s1>私は男だ。</s>
><s id=1.1.p1.s2>会社員で、30歳だ。</s>
>
>という文にあたりますよね。文構成を無視して意訳的に解釈した対訳
>文ではありえますが、普通こういう風に対訳文を作らないということで
>上のような例は一応出てこないという前提で考えています。

今さら気づいたんですが、私の案ではn対1とか1対mだけでなくn対mという
形にもできますね。最後の整形マクロを作るときにそのことを想定しておけば大
丈夫でしょう。

>パラグラフもごくごく稀に完全に1対1で一致しないものがあります。
>こういう対訳文は非常に悪い対訳文として、私たちの間から嫌がられて
>います(笑)。100に一つ出るか出ないかぐらいなので、これも基本的に
>1対1で対応するという前提で考えています。

パラグラフについては人間にがんばってもらった方がよさそうですね。
1対1という前提なら
<linkGrp domains="1 ; 1">
<linkGrp domains="1.1 ; 1.1">
<linkGrp domains="1.1.p1 ; 1.1.p1">
についてはセミコロンの前と後ろの内容は必ず一致するのでシンプルになりそう
です。

話は変わりますが、encodingshiftjisさんの
>これは、完全なアプリケーションですから
>単純なマクロの範囲を越えています。
にも一理あります。
ある程度複雑になってきて実現するためのハードルが高くなれば、お金を払って
依頼するべきことになってきます。もちろん無償でそれを引き受けてくれる人が
いるなら、それに越したことはないでしょうけど。

秀丸マクロは単なる手段のひとつというだけで、マクロだったら無料だけど単体
のアプリケーションだったら有料というものではありません。
お金を払うだけの価値がある解決策なら、それを実現する方法が秀丸マクロで
あってもその価値が変わるわけではないですから。
そうすることで金額次第では事後のサポートもある程度期待できるというメリッ
トもあります。

対応付けしたテキストを最終的な形に仕上げるマクロを私が示せないのも、善意
として提供するにはあまりにも時間がかかりそうなのでキツイ、という事情もあ
りますので。

[ ]
RE:04326 原文と対訳文のタグ情報を一つのNo.04330
encodingshiftjis さん 04/05/17 00:08
 
>こなせるかということを考えることも楽しみではありますがね。

はい、テキスト処理の技能を深化させるのは必要ですが

横の知識として
単純なXSLT変換では初級レベルでも、この程度できます。
以下 XMLspy(XMLエディタ+α)独自の箇所もありますが
そこは無視して読んで下さい。

----- 変換指定
<?xml version="1.0" encoding="UTF-8"?>
<?xmlspysamplexml C:\Documents and Settings\taka\デスクトップ\Txslt\D.xml?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:S="S" xmlns:T="T">
 <xsl:output encoding="UTF-8" method="xml" indent="yes"/>

 <xsl:variable name="Stext" select="document('Stext.xml')"/>
 <xsl:variable name="Ttext" select="document('Ttext.xml')"/>

<!-- id属性をキーにして混ぜ合わせる、グルーピングは未実装(可能) -->

<xsl:template match="/">
<RESULT>
<xsl:for-each select="$Stext//S:s|$Ttext//T:s">
<xsl:sort data-type="text" order="ascending" select="@id"/>
<xsl:sort data-type="text" order="ascending" select="namespace-uri()"/>
<xsl:copy-of select="."/>
</xsl:for-each>

<!-- 非対応の検出は 未実装です(可能です) -->
 
</RESULT>
</xsl:template>
</xsl:stylesheet>

------------ Stext.xml
<?xml version="1.0" encoding="UTF-8"?>
<body id="1" xmlns="S">
 <div id="1.1">
  <head id="1.1.h1">aioueo</head>
  <p id="1.1.p1">
   <s id="1.1.p1.s1">aaa.</s>
   <s id="1.1.p1.s2">iii.</s>
   <s id="1.1.p1.s3">uuu.</s>
   <s id="1.1.p1.s4">eee.</s>
   <s id="1.1.p1.s5">ooo.</s>
  </p>
  <p id="1.1.p2">
   <s id="1.1.p2.s1">kakaka.</s>
   <s id="1.1.p2.s2">kikiki.</s>
   <s id="1.1.p2.s3">kukuku.</s>
   <s id="1.1.p2.s4">kekeke.</s>
   <s id="1.1.p2.s5">kokoko.</s>
  </p>
  <p id="1.1.p3">
   <s id="1.1.p3.s1">sasasa.</s>
   <s id="1.1.p3.s2">shishishi,sususu,sesese.</s>
   <s id="1.1.p3.s3">sososo.</s>
  </p>
 </div>
</body>
------------ Ttext.xml
<?xml version="1.0" encoding="UTF-8"?>
<body id="1" xmlns="T">
 <div id="1.1">
  <head id="1.1.h1">あいうえお</head>
  <p id="1.1.p1">
   <s id="1.1.p1.s1">あああ。</s>
   <s id="1.1.p1.s2">いいい。</s>
   <s id="1.1.p1.s3">ううう。</s>
   <s id="1.1.p1.s4">えええ。</s>
   <s id="1.1.p1.s5">おおお。</s>
  </p>
  <p id="1.1.p2">
   <s id="1.1.p2.s1">かかか。</s>
   <s id="1.1.p2.s2">ききき。</s>
   <s id="1.1.p2.s3">くくく。</s>
   <s id="1.1.p2.s4">けけけ、こここ。</s>
  </p>
  <p id="1.1.p3">
   <s id="1.1.p3.s1">さささ。</s>
   <s id="1.1.p3.s2">ししし。</s>
   <s id="1.1.p3.s3">すすす。</s>
   <s id="1.1.p3.s4">せせせ。</s>
   <s id="1.1.p3.s5">そそそ。</s>
  </p>
 </div>
</body>
------------ 変換ダミー D.xml
<?xml version="1.0" encoding="UTF-8"?>
<ROOT/>
-------- 出力結果 XSL Output.html
<?xml version="1.0" encoding="UTF-8"?>
<RESULT xmlns:S="S" xmlns:T="T">
 <s id="1.1.p1.s1" xmlns="S">aaa.</s>
 <s id="1.1.p1.s1" xmlns="T">あああ。</s>
 <s id="1.1.p1.s2" xmlns="S">iii.</s>
 <s id="1.1.p1.s2" xmlns="T">いいい。</s>
 <s id="1.1.p1.s3" xmlns="S">uuu.</s>
 <s id="1.1.p1.s3" xmlns="T">ううう。</s>
 <s id="1.1.p1.s4" xmlns="S">eee.</s>
 <s id="1.1.p1.s4" xmlns="T">えええ。</s>
 <s id="1.1.p1.s5" xmlns="S">ooo.</s>
 <s id="1.1.p1.s5" xmlns="T">おおお。</s>
 <s id="1.1.p2.s1" xmlns="S">kakaka.</s>
 <s id="1.1.p2.s1" xmlns="T">かかか。</s>
 <s id="1.1.p2.s2" xmlns="S">kikiki.</s>
 <s id="1.1.p2.s2" xmlns="T">ききき。</s>
 <s id="1.1.p2.s3" xmlns="S">kukuku.</s>
 <s id="1.1.p2.s3" xmlns="T">くくく。</s>
 <s id="1.1.p2.s4" xmlns="S">kekeke.</s>
 <s id="1.1.p2.s4" xmlns="T">けけけ、こここ。</s>
 <s id="1.1.p2.s5" xmlns="S">kokoko.</s>
 <s id="1.1.p3.s1" xmlns="S">sasasa.</s>
 <s id="1.1.p3.s1" xmlns="T">さささ。</s>
 <s id="1.1.p3.s2" xmlns="S">shishishi,sususu,sesese.</s>
 <s id="1.1.p3.s2" xmlns="T">ししし。</s>
 <s id="1.1.p3.s3" xmlns="S">sososo.</s>
 <s id="1.1.p3.s3" xmlns="T">すすす。</s>
 <s id="1.1.p3.s4" xmlns="T">せせせ。</s>
 <s id="1.1.p3.s5" xmlns="T">そそそ。</s>
</RESULT>
---------

テキスト処理の敏感さから開放されるので、サステイナブル(持続可能)です
データ処理の歴史では、結局 DBMS が作られることになりました。
(テキスト上での限界は昔に認識されています)
ここの場合は XML−DBの扱いになります、フリーなソフトも多数あります
(技能は必要)

[ ]
RE:04328 原文と対訳文のタグ情報を一つのNo.04332
Majima さん 04/05/17 01:20
 
アルビレオさん

貴重なご意見本当にありがとうございます。

>このように1つのマクロにせずに、小さなマクロを使い分けることで
>文の内容に合わせたカスタマイズも容易です。
>これらの小さなマクロはすぐ終了するので、対応しきれない特殊な場
>合はテキストエディタとして手で修正できるので小回りがききます。

そうですよね。あまりに複雑な作業はこまめに対応できるようにした
ほうがいいですよね。

><s>...</s>を行単位にそろえておくことがミソです。
>行頭が「<s id=」で始まる行が連続していればそれは1つのブロッ
>ク、「<S id=」で始まる部分は次に「<s id=」が出てくるまでがそれ
>に対応するブロックになります。

やっぱりそうですよね。この考え方は会議室で投稿するまで思いつか
ず、なるほどと思いました。

>秀丸マクロは単なる手段のひとつというだけで、マクロだったら無料
>だけど単体のアプリケーションだったら有料というものではありませ
>ん。お金を払うだけの価値がある解決策なら、それを実現する方法が
>秀丸マクロであってもその価値が変わるわけではないですから。

そうですよね。ここで何度か質問させてもらっていますけど、お金と
時間には引き換えられないぐらい価値のある意見を伺うことができて
いるわけですからね。本当に有難く、また私の為に時間を省いてくだ
さっている方々に何かお返しをしたいぐらいの気持ちです。

>対応付けしたテキストを最終的な形に仕上げるマクロを私が示せない
>のも、善意として提供するにはあまりにも時間がかかりそうなのでキ
>ツイ、という事情もありますので。

いえいえ。方向性なり具体的な案を少し示して下さるだけでも非常に
助かっています。でも中には専門的過ぎてまだ理解できないままにある
部分もありますがね。時々この会議室でどこまで質問していいものやら
分からない部分もありますが、その辺は今回のように「ここまで
行ったらマクロの範囲を超えている」とかおっしゃって頂くと有難い
です。秀丸のマクロで、まだどこまでカバーできるのかといったことが
分からない部分が沢山ありますので・・・。

[ ]
RE:04330 原文と対訳文のタグ情報を一つのNo.04333
Majima さん 04/05/17 01:27
 
encodingshiftjisさん

何だか文系の者にはハードルが高そうな感じです。私はまだマクロに
毛が生えたぐらいのものしか動かしていないので、初級レベルといっ
ても先に勉強しなければならないことが沢山ありそうで・・・。
会議室の皆様からのご意見には色々と調べならがらなんとか理解して
いっている状況です。トホホ・・・。新しい用語も含めて色々勉強
させていただきます。ありがとうございます。

[ ]
RE:04316 原文と対訳文のタグ情報を一つのNo.04334
Kamonohasi さん 04/05/17 15:43
 
こんにちは&初めまして、Majima さん
カモノハシと申します。
encodingshiftjis さんも仰っているようにXMLを使った方が理に
かなっていると私も思います。
でもちょっと思いついたので投稿してみました。

完全な自動化はできない処理ですので、自動化できる部分と出来ない部分に
分割してしまおうというコンセプトです。アルビレオさんとほぼ同じ発想です。
「対応情報を一定の書式にあわせて与えることが出来るなら自動生成することが可能」

コピー&ペーストよりは手にかかる負担が少ないかと思いますが(汗)



こういうのはいかがでしょうか?
・1論理行に1データになるようにファイルを加工
・2ファイルの対応関係を目視で設定(データファイルとして保存)
・出来上がったデータファイルを元にして2つのファイルをマージ
 する要領でタグ情報ファイルを生成
って手順に分割してしまいます。
この内の手動になる真ん中の処理を助けるマクロを作ってみました。
注意事項に沿って実行して頂くと、原文と訳文のファイルが開かれますので、
見やすいように元のウィンドウとあわせてサイズ、位置を調整してください。
大きさの調整が終わったら、元のウィンドウで「Enter」を押してください。
そうすると『コマンド』を入力するダイアログがでますので、2つのウィンドウ
を見比べながら入力してください。

ちなみに、デフォルトのコマンドでは、
マクロ中で$cmd_xxxみたいに定義されています。
マクロ中のコメントを参照してください。
で、メインの原文-訳文の対応関係を入力する方法ですが、
「n.m」の書式で原文n行が訳文m行に対応するって意味です。
全てを入力し終わったら結果が実行もとウィンドウに出力されていますので、
上書き保存などで保存してください。

コレで、出来上がるデータのフォーマットは、
最初の2行にファイルパス
以降が対応関係を示すコマンド
になります。

後はこのデータファイルを使って最終目的のタグ情報ファイルを自動生成
するようなマクロ(確実に秀丸マクロ以外で作った方が簡単ですが、それは
置いておいて)に喰わせればいいだけです。


※注意事項
結果を保存するファイル(はじめは空が望ましい)を作っておくこと。
そのファイルを開いて実行すること。
マクロの先頭の「$file1」「$file2」にはそれぞれ原文のファイルと
訳文のファイル名を入れること。
そのファイルはマクロで削除されるのでコピーを使うこと。
単純にするためにbody,divは無視しています。
これに対応するための雛形のつもりでpにだけ対応していますので、
同じ要領で書き足してください。
また、この辺りは全て削除してしまってもidに記入があるために
大した問題にはなりません。タグ情報ファイルに変換するときに
どっちにしてあるかで変換方法を多少変えればOKです。
随所で手抜きがあるので実運用は手直ししてからの方がいいかと思います(汗)
結構カスタマイズ出来るようになってますので(汗)

/////////////////////////////////////////////////////////////////////
$file1 = "D:\\原文.txt";
$file2 = "D:\\訳文.txt";

$delim = ".";//これで対応行数を区切る。

$cmd_end = "end";//終了
$cmd_undo = "undo";//一つ戻る
$cmd_del1 = "d1";//ファイル1を一行削除
$cmd_del2 = "d2";//ファイル2を一行削除
$cmd_delb = "db";//ファイル1と2を一行削除
$cmd_head = "head";//ヘッダ行
$cmd_newPara = "newp";//パラグラフ開始
$cmd_endPara = "endp";//パラグラフ終了


#base = hidemaruhandle(0);
openfile $file1;
#file1 = hidemaruhandle(0);
openfile $file2;
#file2 = hidemaruhandle(0);
setactivehidemaru #base;
question "これら秀丸の内容は全て削除されますが、続行してもよろしいでしょう
か?";
if(result ==no ) endmacro;
gofileend;
if((x==0) && (y == 0)){
 insert $file1 + "\n";
 insert $file2 + "\n";
}

while(true){
 title "準備が出来たら「Enter」を押してください。";
 #ret = inputchar("準備が出来たら「Enter」を押してください。");
 if(#ret == 0xd)break;
}

#undo = 0;
$inputbase = "1" + $delim +"1";
while(true){
 $ret = input("コマンドを入力してください。" ,$inputbase );
 
 if($ret == ""){
  $inputbase = $cmd_end;
  continue;
 }else if($ret == $cmd_end){
  question "終了しますか?";
  if(result ==yes )break;
 }else if($ret == $cmd_undo){
  call MyUndo;
 }else if($ret == $cmd_del1){//ファイル1を一行削除
  call DelLine 1,0;
  insert $cmd_del1 + "\n";
  #undo = #undo +1;
 }else if($ret == $cmd_del2){//ファイル2を一行削除
  call DelLine 0,1;
  insert $cmd_del2 + "\n";
  #undo = #undo +1;
 }else if($ret == $cmd_delb){//ファイル1と2を一行削除
  call DelLine 1,1;
  insert $cmd_delb + "\n";
  #undo = #undo +1;
 }else if($ret == $cmd_head){//ヘッダ行
  call DelLine 1,1;
  insert $cmd_head + "\n";
  #undo = #undo +1;
 }else if($ret == $cmd_newPara){//パラグラフ開始
  call DelLine 1,1;
  insert $cmd_newPara + "\n";
  #undo = #undo +1;
 }else if($ret == $cmd_endPara){//パラグラフ終了
  call DelLine 1,1;
  insert $cmd_endPara + "\n";
  #undo = #undo +1;
 }else if(strlen($ret) >= 2+ strlen($delim)){
  #delm = strstr($ret , $delim);
  if(#delm <= 0){
   message "コマンドエラー";
   continue;
  }
  #ndel1 = val(leftstr($ret , #delm));
  #ndel2 = val(rightstr($ret , strlen($ret)-#delm -1));
  call DelLine #ndel1,#ndel2;
  insert $ret + "\n";
  #undo = #undo +1;
 }else{
  message "コマンドエラー";
 }
 $inputbase = "1" + $delim +"1";
}



endmacro;


DelLine:
 setactivehidemaru #file1;
 call _DelLine ##1;
 setactivehidemaru #file2;
 call _DelLine ##2;
 setactivehidemaru #base;
 return;

_DelLine:
 gofiletop;
 escape;beginsel;
 movetolineno 1,lineno + ##1;
 delete;
 escape;
 return;

MyUndo:
 if(#undo > 0){
  setactivehidemaru #file1;
  undo;
  setactivehidemaru #file2;
  undo;
  setactivehidemaru #base;
  undo;
  #undo = #undo -1;
 }else{
  beep;
 }

 return;
//////////////////////////////////////////////////////////////////////

[ ]
RE:04334 原文と対訳文のタグ情報を一つのNo.04335
Kamonohasi さん 04/05/17 16:03
 
ちなみに、例示されたファイルを使うと
以下のようなデータファイルになるかと思います。
//////////////////////////////
D:\原文.txt
D:\訳文.txt
db
db
head
newp
1.1
1.1
1.1
1.1
1.1
endp
newp
1.1
1.1
1.1
1.2
endp
newp
1.1
3.1
1.1
endp
db
db
//////////////////////////////
になります。
dbのところはコマンドをdivとbodyに対応させれば変わりますが(汗)
ついでに、このファイルからの最終変換をさらっと。
やることは単純です。
先頭行で指定されたファイルを読み込んで、
それぞれ指定行づつコマンドに則ってタグを読み込んで、
「xtargets」を作ります。
特殊な動作は、
・「new〜」があればlinkGrpタグを追加
・「end〜」があればタグを閉じる
・「db」などの削除系があればそのファイルのその行を無視
・「head」でもlinkGrpタグを追加

[ ]
RE:04334 原文と対訳文のタグ情報を一つのNo.04338
Majima さん 04/05/18 01:34
 
カモノハシさん

ご意見ありがとうございます。

>encodingshiftjis さんも仰っているようにXMLを使った方が理に
>かなっていると私も思います。

テキスト処理ってやっぱり作業によって合う・合わないがあるんで
すね。XMLなどの知識もやはりこれからは必要でしょうか。

>完全な自動化はできない処理ですので、自動化できる部分と出来ない
>部分に分割してしまおうというコンセプトです。アルビレオさんと
>ほぼ同じ発想です。

私もその線で考えています。でも皆さんとは違って滅茶苦茶低いレベル
でですが・・・。

置いてくださいましたマクロ参考にいたします。有難うございました。

[ ]