PDIC & DokoPop! 会議室

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク 検索 過去ログ

ログ内検索
・ キーワードを複数指定する場合は 半角スペース で区切ってください。
・ 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
・ 過去ログから探す場合は過去ログを選択。

キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/

No.572 の関連記事表示

全ページ数 / [0]
No.572/単語分割スクリプト(Perl)
■投稿者/ 関根 -(2002/08/07(Wed) 12:56:55)

    先日ちらっと書いた、PDICの単語を指定行毎に分割するPerlスクリプト(1行テキスト
    形式用)です。英語版Perl、JPerlのどちらでも動作します。

    効能は次の通り。

    1.電子辞書をPDIC化する際、訳部が長すぎてはじかれていた単語も登録できる。

    2.単語の訳が1画面以上続く時、続きを表示しにくい(次の単語に飛んでしまったり
    する)症状が改善。

    PDICは本来訳語が数行程度の辞書用に設計されているようで、今日では大辞典級の
    辞書も扱えるが、比較的訳部のサイズが小さい。70byte/行で40行程度(用例部は
    大きいが、訳部との使い分けが難しい)。画面コントロールもそんな感じ。それなら
    見出しをいっぱい作り訳を小分けにしたらどうか、という発想で作ってみました。
    情報カードで辞書を扱う感じでしょうか。辞書の内容は何でも良いので、上の症状に
    お悩みの諸兄はお試しを。

    [処理内容]

    訳が各々指定行に収まるよう、単語を次のように分割します('_'は' 'のこと)。元の
    単語の次にスペース2個入れたので語順が崩れることはまず無いでしょう。'.'も
    さほど気にならないと思います。

    have
    have__.
    have__..

    [使い方]

    まず、お使いの環境に合わせてp_div.plで次の値を設定してください。

    $WIDTH … PDIC画面で訳部の1行文字数(byte、つまり半角文字単位)。70前後か。
    $LINES … 1単語の最大行数。表示行数マイナス4前後が良いかも。

    シグマリオンII(PDIC-CE)では $LINES=8 くらいが良い感じでした。

    次に、変換する1行テキスト形式ファイルをold_file、変換後のそれをnew_fileで、

    perl p_div.pl < old_file > new_file

    とした後、new_fileをPDICで辞書変換すれば終わりです。元の訳は各々短いが辞書
    変換で「同一単語を改行付きで追加」した結果長い訳になった場合は、いったん
    PDIC辞書を1行テキスト形式に落としてから上の作業を行なってください。

    注1:他のフリーソフトと同様、「現状渡し、免責」です。何らかの事情で辞書ファ
    イルが壊れても責任は取らないので、必ず辞書のバックアップを取ってから作業する
    こと。なお、分割した単語を元通りに戻すスクリプトも後で公開します。

    注2:改行部分で分割するため、改行の少ない文では$LINES行を超えることもある。
    というか1~2行超えることはよくあるので、$LINESは表示行数マイナス4くらいが
    適当かと。

    注3:用例のスペースは考慮していません。用例が多いようなら$LINESの値を小さめに
    してみてください。

    注4:発音記号なども扱う場合は、CSV形式用(近日公開予定)をご利用ください。

    #[p_div.pl]
    # ================================================================
    # PDIC辞書(1行テキスト形式)の単語を指定行以下に分割する
    # for Perl (& JPerl) by T.SEKINE
    #
    # 使い方: perl p_div.pl < old_file > new_file
    # ※使用前に、環境に応じて $WIDTH, $LINES の値を設定すること
    #
    # 処理内容: 単語を次のように分割し、各訳が $LINES 行以内に収まる
    # ようにする('_' は ' 'を表す)。
    #
    # have
    # have__.
    # have__..
    #
    # ================================================================
    # 主な変数
    # @data 訳(改行毎)

    # --- 環境に応じて次の値を設定してから実行すること ---
    $WIDTH = 72; # 訳部の1行文字数(byte)
    $LINES = 8; # 単語の最大行数(画面行数より少し小さくする)

    while (<>) {
    ($tango,$yaku,$yourei) = split(/ \/\/\/ | \/ |\n/, $_);
    @data = split(/ \\ |\n/, $yaku); # 訳を@dataにセット
    &print_data; # 単語を分割して出力
    }

    sub print_data {
    $page = 0;
    $i = 0;
    while (@data[$i] ne '') {
    &print_tango($page++); # 単語
    $gyo = int((length(@data[$i])-1) / $WIDTH) + 1;
    print @data[$i++]; # 訳
    while ((@data[$i] ne '') && ($gyo < $LINES)) {
    $gyo += int((length(@data[$i])-1) / $WIDTH) + 1;
    print ' \ '.@data[$i++];
    }
    if ($yourei ne '') { # 用例
    print ' / '.$yourei;
    $yourei = ''; # 用例出力は1回だけ
    }
    print "\n";
    }
    }

    sub print_tango {
    my($page) = @_;
    print $tango;
    if ($page > 0) {
    print "\x20\x20", '.' x $page;
    }
    print ' /// ';
    }
親記事 / 関連記事表示
削除チェック/

No.573/Re[1]: 単語分割スクリプト(Perl)
■投稿者/ 関根 -(2002/08/07(Wed) 12:58:15)

    p_con.plは、p_div.plで分割した単語を元に戻すスクリプト(1行テキスト形式用)
    です。元の辞書のバックアップを取っていればこれを使うことも無いのですが、
    分割した辞書しか手元に無い場合でも元の辞書を復元することが可能です。

    #[p_con.pl]
    # ================================================================
    # PDIC辞書(1行テキスト形式)のp_div.plで分割した単語を元に戻す
    # for Perl (& JPerl) by T.SEKINE
    #
    # 使い方: perl p_con.pl < old_file > new_file
    # ================================================================
    # 主な変数
    # @line 訳(入力用)
    # @data 訳(出力用)
    # p @data[p]

    &init_data;

    while (<>) {
    ($tango,$yaku,$yourei) = split(/ \/\/\/ | \/ |\n/, $_);
    @line = split(/ \\ |\n/, $yaku);
    if ($tango !~ /\x20\x20\.+$/) { # 単語(新規)
    if ($p != 0) { &print_data; } # 単語1個分を出力
    # 単語は最初の物を使う
    # 用例は順次追加
    $tango0 = $tango;
    $yourei0 = $yourei;
    &init_data; # 訳を@dataにセット
    &add_data;
    } else { # 単語(継続)
    if (($yourei0 ne '') && ($yourei ne '')) { # 用例を追加
    $yourei0 .= ' \ ';
    }
    $yourei0 .= $yourei;
    &add_data; # 訳を@dataに追加
    }
    }
    &print_data; # 単語1個分を出力

    sub init_data {
    $p = 0;
    }

    sub add_data {
    my $i = 0;
    while (@line[$i] ne '') {
    @data[$p++] = @line[$i++];
    }
    }

    sub print_data {
    my $i = 0;
    @data[$p] = '';
    print $tango0.' /// '.@data[$i++]; # 単語、訳
    while (@data[$i] ne '') {
    print ' \ '.@data[$i++];
    }
    if ($yourei0 ne '') { # 用例
    print ' / '.$yourei0;
    }
    print "\n";
    }
記事No.572 のレス / 関連記事表示
削除チェック/

No.583/Re[2]: 単語分割スクリプト(Perl)
■投稿者/ 関根 -(2002/08/08(Thu) 08:54:39)

    p_div.plのCSV形式用です。辞書にレベルや発音記号データがある場合はこちらを
    お使いください。使い方は、CSV形式を扱う外はp_div.plと同じです。

    #[p_divc.pl]
    # ================================================================
    # PDIC辞書(CSV形式)の単語を指定行以下に分割する
    # for Perl (& JPerl) by T.SEKINE
    #
    # 使い方: perl p_divc.pl < old_file > new_file
    # ※使用前に、環境に応じて $WIDTH, $LINES の値を設定すること
    #
    # 処理内容: 単語を次のように分割し、各訳が $LINES 行以内に収まる
    # ようにする('_' は ' 'の意)。
    #
    # have
    # have__.
    # have__..
    #
    # ================================================================
    # 主な変数
    # @data 訳(改行毎)

    # --- 環境に応じて次の値を設定してから実行すること ---
    $WIDTH = 72; # 訳部の1行文字数(byte)
    $LINES = 8; # 単語の最大行数(画面行数より少し小さくする)

    while (<>) {
    $csvline .= $_ ; # 論理的1行読み込み
    if ($csvline =~ /"(.+)","(.+)","(.*)",(\d+),(\d),(\d),"(.*)"/s) {
    $tango = $1; # '"'なし
    $yaku = $2; # '"'なし
    $yourei = $3; # '"'なし
    $level = $4;
    $aflag = $5;
    $mflag = $6;
    $pron = $7; # '"'なし
    @data = split(/[\r\n]+/, $yaku); # 訳を@dataにセット
    &print_data; # 単語を分割して出力
    $csvline = ''; # 次の論理行へ
    }
    }

    sub print_data {
    $page = 0;
    $i = 0;
    while (@data[$i] ne '') {
    &print_tango($page++); # 単語
    $gyo = int((length(@data[$i])-1) / $WIDTH) + 1;
    print '"'; # 訳
    print @data[$i++];
    while ((@data[$i] ne '') && ($gyo < $LINES)) {
    $gyo += int((length(@data[$i])-1) / $WIDTH) + 1;
    print "\r\n".@data[$i++];
    }
    print '",';
    print &quote($yourei).','; # 用例など
    print $level.','.$aflag.','.$mflag.','.&quote($pron);
    $yourei = ''; # 用例出力は1回だけ
    print "\n";
    }
    }

    sub print_tango {
    my($page) = @_;
    print '"';
    print $tango;
    if ($page > 0) {
    print "\x20\x20", '.' x $page;
    }
    print '",';
    }

    sub quote{
    my($s) = @_;
    return '"'.$s.'"';
    }
記事No.572 のレス / 関連記事表示
削除チェック/

No.584/Re[3]: 単語分割スクリプト(Perl)
■投稿者/ 関根 -(2002/08/08(Thu) 08:55:43)

    p_con.plのCSV形式用です。

    #[p_conc.pl]
    # ================================================================
    # PDIC辞書(CSV形式)のp_div.plで分割した単語を元に戻す
    # for Perl (& JPerl) by T.SEKINE
    #
    # 使い方: perl p_con.pl < old_file > new_file
    # ================================================================
    # 主な変数
    # @line 訳(入力用)
    # @data 訳(出力用)
    # p @data[p]

    &init_data;

    while (<>) {
    $csvline .= $_ ; # 論理的1行読み込み
    if ($csvline =~ /"(.+)","(.+)","(.*)",(\d+),(\d),(\d),"(.*)"/s) {
    $tango = $1; # '"'なし
    $yaku = $2; # '"'なし
    $yourei = $3; # '"'なし
    $level = $4;
    $aflag = $5;
    $mflag = $6;
    $pron = $7; # '"'なし
    @line = split(/[\r\n]+/, $yaku);
    if ($tango !~ /\x20\x20\.+$/) { # 単語(新規)
    if ($p != 0) { &print_data; } # 単語1個分を出力
    # 単語、レベル、暗記フラグ、修正フラグ、発音記号は最初の物を使う
    # 用例は順次追加
    $tango0 = $tango;
    $yourei0 = $yourei;
    $level0 = $level;
    $aflag0 = $aflag;
    $mflag0 = $mflag;
    $pron0 = $pron;
    &init_data; # 訳を@dataにセット
    &add_data;
    } else { # 単語(継続)
    if (($yourei0 ne '') && ($yourei ne '')) { # 用例を追加
    $yourei0 .= "\r\n";
    }
    $yourei0 .= $yourei;
    &add_data; # 訳を@dataに追加
    }
    $csvline = ''; # 次の論理行へ
    }
    }
    &print_data; # 単語1個分を出力

    sub init_data {
    $p = 0;
    }

    sub add_data {
    my $i = 0;
    while (@line[$i] ne '') {
    @data[$p++] = @line[$i++];
    }
    }

    sub print_data {
    my $i = 0;
    @data[$p] = '';
    print &quote($tango0).',"'.@data[$i++]; # 単語、訳
    while (@data[$i] ne '') {
    print "\r\n".@data[$i++];
    }
    print '",';
    print &quote($yourei0).','; # 用例など
    print $level0.','.$aflag0.','.$mflag0.','.&quote($pron0);
    print "\n";
    }

    sub quote{
    my($s) = @_;
    return '"'.$s.'"';
    }
記事No.572 のレス / 関連記事表示
削除チェック/

No.585/Re[4]: 単語分割スクリプト(Perl)
■投稿者/ 関根 -(2002/08/08(Thu) 09:20:02)

    p_div.pl (p_divc.pl) の単語分割アルゴリズムは「行数に達しない限り詰め込む」
    というものでした。が、「次行を追加したら超えてしまう、という所でやめる」と
    した方が合理的かなという気もしています。動作的には、前者が指定行をオーバー
    気味なのに対し後者はアンダー気味になります(超える場合もあるが)。

    後者の方が良いと思われる方は、次の変更をしてください。

    p_div.pl の sub print_data 内の、

    print @data[$i++]; # 訳
    while ((@data[$i] ne '') && ($gyo < $LINES)) {
    $gyo += int((length(@data[$i])-1) / $WIDTH) + 1;
    print ' \ '.@data[$i++];
    }

    を次のように変更($gyo +=.. の位置、while 文の条件が変わっています)。

    print @data[$i++]; # 訳
    $gyo += int((length(@data[$i])-1) / $WIDTH) + 1;
    while ((@data[$i] ne '') && ($gyo <= $LINES)) {
    print ' \ '.@data[$i++];
    $gyo += int((length(@data[$i])-1) / $WIDTH) + 1;
    }

    p_divc.pl の sub print_data 内も同様に変更願います(ほとんど同じなので略)。

    どちらが良いかは判断つきかねます。また、もっとスマートな方法があるかも知れ
    ません。できれば動作レポートいただけるとありがたいです。
記事No.572 のレス / 関連記事表示
削除チェック/

No.596/Re[1]: 単語分割スクリプト(Perl)
■投稿者/ TaN -(2002/08/08(Thu) 22:45:50)
□ U R L/ http://member.nifty.ne.jp/TaN/

    関根さん、いつもお世話になってます。

    一つ提案なのですが、scriptなどはご自分のサイトで公開され、
    そのリンクや議論をこちらで行ったほうがいいかと思うのですが、
    いかがでしょう?
    この掲示板は新しい記事順に表示されるので、古くなればなるほど
    ほとんど人の目には触れなくなります。
    また、そのユーザーにとって見れば最新版が欲しいと思いますが、
    掲示板をたどる必要があり手間がかかります。
    ご一考のほどを。
記事No.572 のレス / 関連記事表示
削除チェック/

No.600/Re[2]: 単語分割スクリプト(Perl)
■投稿者/ 関根 -(2002/08/09(Fri) 10:10:25)

    TaN さん

    ふらっと立ち寄ったつもりが居心地良いのですっかり居着いてしまいました…
    会議室をお騒がせして申し訳ありません。

    そう言われればそうですね。(^_^;)

    ホームページ使ったことないので、まずはその勉強から始めないと。それに
    もうネタ切れだし、という話もありますが、その方向で検討してみます。
記事No.572 のレス / 関連記事表示
削除チェック/



全ページ数 / [0]

パスワード/

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク 検索 過去ログ

- Child Tree -