Hatena::Groupchinese

妄言砂漠

2006-06-13

[] 頭の中を整理するために書き出してみる  頭の中を整理するために書き出してみる - 妄言砂漠 を含むブックマーク はてなブックマーク -  頭の中を整理するために書き出してみる - 妄言砂漠

先日、翻訳作業をしながら単語帳を作成するためのテキスト記述について、少しメモ書きをしましたが、これをもう少し進めて、作業をしながら労力をかけずに対訳ファイルを作る方法を考えたい。

普段の作業

  1. 原稿はWord形式がほとんど(たまにPDF)。
  2. 原稿をコピペ。作業はエディタ上で行っている
  3. その際、人名や地名の入力を省力化するため、PinConvで簡体字を和漢字に変換し、原文の下に張り付けている。画面を縦に2分割して、右側に原文、左側に変換された原文が表示されるように調整し、左側の変換された原文を上書きしていくかたちで翻訳を行う*1
  4. 見出しなど構造が必要な文章は、はてな記法で記述し、htextでhtmlにしてからWordに読み込ませると、見栄えをいじるのが多少楽になる。
  5. 作業ファイルは、エディタのバックアップ機能でひとつのフォルダにすべてのバックアップが保存されるようにしてある(文字コードはUTF-8で統一)。作業時に原文も訳文もひとつのファイルにまとめるようにしているので、中国語からでも日本語からでも当該フォルダをgrepすれば、過去の訳文を確認することができる。
  6. 特定分野の原稿の場合は、単語と訳語をタブで区切った単語帳を読み込んで、一括置換することで、名詞などの翻訳をさらに省力化できる。Tclだとソースはこんな感じ↓
#exprsはタブ区切りファイルから読み込んだデータ
#targetは置換対象の原文
proc mrep {exprs target} {
    foreach line [split $exprs \n] {
        set line [split $line \t]
        if {[llength $line] == 2} {
            set old [lindex $line 0]
            set new [lindex $line 1]
            regsub -all -- $old $target "(($new))" target
        }
    }
    return $target
}
#置換後の文字列を((と))で括っているのは処理結果を確認するため。
#((と))で括られているところを強調表示するようにエディタを設定
#してある。

問題点

  1. やってる作業が毎回同じなんだから、自動化できるところは自動化すべき
  2. 分割画面右側の原文を眺めたり、印刷してドキュメントフォルダに置いてある原稿を眺めるのは、原文からの視点移動が大きい。本当は左右ではなくて上下に並べたい。
  3. grepもいいけど、原文と訳文の対応を確認するのが面倒。

じゃあどうする

  1. 「原文+改行+訳文+二重改行」のかたちで作業。
    1. 準備作業:原文+改行+「原文に一括置換をかけて、さらに和漢字に変換したもの」+二重改行 ←こういうかたちに原文を変換する。なお、原文の頭には#をつけて目印にする*2。左右ではなく上下にすることで視点移動が減って楽になりそう。
  2. 単語帳に登録したい単語は、「((原文|訳語))」のかたちで原文部分に埋め込む。
  3. エディタ上での作業が終わったら、原文部分に埋め込んだ「((原文|訳語))」を抜き出して、「原文+タブ+訳語」のかたちにして特定ファイルに書き出す。このファイルは降順にソートしておく。一括置換の際に、長い単語を優先して置換するため。また、抜き出した部分は原文だけに戻しておく。
  4. 単語帳の作成が終わったら、「原文+訳語+ファイル名+作業日時+分野」くらいのかたちでデータベースに登録する*3。改行単位ではなく、文単位にしたいところだけど、翻訳をしていると一文を二文に分けたり、逆にまとめることもあるので却下。
  5. 単語帳の作成と原文+訳文の保存が終わったら、テキストから原文を削除する(頭に#が付いた行を削除するだけなので簡単)。

とりあえず*4

#「((原文|訳語))」の抜き出し
#fnは出力先 strは原文テキスト addは〈分野〉など追加文字列
proc equi_fput {fn str {add ""}} {
    set offset 0
    set out ""
    while {[regexp -indices -start $offset -- \
            {\(\(([^()\n]+)\)\)} $str match range]} {
        set matchstr [string range $str \
        [lindex $range 0] [lindex $range 1]]
        if {[string first "|" $matchstr] > -1} {
            set outstr [split $matchstr "|"]
            set origin [lindex $outstr 0]
            set equi [lindex $outstr 1]
            append out $origin "\t" $add $equi "\n"
        }
        set offset [expr [lindex $match 1]+1]
    }

    #ファイルへ出力
    if {[catch {set fout_handle [open $fn a+]} err_msg]} {
        #エラー処理
        return
    }
    fconfigure $fout_handle -encoding utf-8
    puts $fout_handle $out
    close $fout_handle

    #該当部分を削除し、原文のみに置換
    regsub -all -- {\(\(([^()\n]+)\|([^()\n]+)\)\)} $str {\1} str
    return $str
}

*1:訳抜け防止にも効果的

*2:これもエディタで強調表示することが可能

*3:sqliteを使うと思う

*4:てきとーですけど

トラックバック - http://chinese.g.hatena.ne.jp/Ctrans/20060613