#!/usr/local/bin/jperl -- -*-Perl-*- # # 対象外とする記事,文 # $neglect_aid{"950101140"} = 1; # 選手紹介 $neglect_aid{"950110251"} = 1; # 各地の地震強度 $GIVEUP = "../src/giveup.dat"; die if ($#ARGV != 0 || $ARGV[0] !~ /^95/); @enu = ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); $start_flag = 0; ###################################################################### # 毎日新聞CD-ROMデータのフォーマット ###################################################################### # # giveup.dat があれば読み込み,削除する. # if (open(GIVEUP, $GIVEUP)) { while ( ) { /^([\d-]+)/; $neglect_h_sid{$1} = 1; } close(GIVEUP); } while ( ) { if (/<\/ENTRY>/) { if ($start_flag) { &check_article($aid, $title, $article); # 記事に区切るだけ # print "$aid\n$title\n$article\n\n"; } $article = ""; } elsif (//) { /^(.+)<\/C0>\n/; $aid = $1; if ($aid =~ /^$ARGV[0]/) { $start_flag = 1; } else { if ($start_flag) { exit; } else { ; } } } elsif (//) { /^(.+)<\/T1>\n/; $title = $1; } elsif (//) { $flag = 1; } elsif (/<\/T2>/) { $flag = 0; } else { $article .= $_ if ($start_flag && $flag); } } ###################################################################### # コーパス作成から排除する記事 # # ・タイトルに次の文字列があるもの # [余録] # [雑記帳] # [社告] # [人事] # [人物略歴] # 死去= # # ・本文中に(段落先頭を除いて)スペースを含むもの # (スペースの2つ連続を除けば表などはほとんど省けるが,とりあえず簡単の # ためスペースが一つでも入れば排除する) # # ・段落先頭に" ――"があるもの # (インタビュー記事,発言者名,発言全体が括弧に囲まれる可能性などがある # ため) # ###################################################################### sub check_article { local($aid, $title, $artice) = @_; local($i, $flag); $flag = 1; if ($neglect_aid{$aid}) { $flag = 0; } elsif ($title =~ /[余録]|[雑記帳]|[社告]|[人事]|[人物略歴]|死去=|=の葬儀・告別式/) { $flag = 0; } # 社説だけを対象とする場合 # elsif ($title !~ /[社説]/) { # $flag = 0; # } else { foreach $i (split(/\n/, $article)) { $flag = 0 if ($i =~ / ――/); $i =~ s/^ //; $flag = 0 if ($i =~ / /); } } if ($flag == 0) { print "# A-ID:$aid 削除\n"; } else { print "# A-ID:$aid\n"; &breakdown_article($aid, $article); } } ###################################################################### # 記事を文単位に分解 # # ・括弧内以外の"。" # # ・"】" ###################################################################### sub breakdown_article { local($aid, $article) = @_; local($paragraph, $char, $sentence, $level, $last, $scount, $sid); chop($article); $scount = 1; foreach $paragraph (split(/\n/, $article)) { $level = 0; $sentence = ""; foreach $char (split(//, $paragraph)) { if ($char eq "「" || $char eq "<" || $char eq "(") { $level ++; # print STDERR "nesting 括弧:$sentence\n" if ($level == 2); } elsif ($char eq "」" || $char eq ">" || $char eq ")") { $level --; # print STDERR "invalid 括弧?:$paragraph\n" if ($level == -1); } $sentence .= $char; if (($level == 0 && $char eq "。" ) || $char eq "】") { $sid = sprintf("%s-%03d", $aid, $scount); &check_sentence($sid, $sentence); $scount++; $sentence = ""; } $last = $char; } if ($last ne "。" && $last ne "】") { $sid = sprintf("%s-%03d", $aid, $scount); &check_sentence($sid, $sentence); $scount++; $sentence = ""; } print "# 改段落\n"; } } ###################################################################### # 文,文内で削除するもの # # ・"【","◇","▽","●","<","《"で始まる文は全体を削除 # # ・文頭の" "," ――"; # # ・"(…)"の削除,ただし,"(1)","(2)"の場合は残す # # ・"=…="の削除,ただし間に","がくればRESET # # ・"=…(文末)"で,文末に"。"がないか,"…"が"写真。"であれば除削 # # ・(1)…(2) という箇条書きがあるもの ###################################################################### sub check_sentence { local($sid, $sentence) = @_; local(@char_array, @check_array, $i, $flag); local($enu_num, $paren_start, $paren_level, $paren_str); (@char_array) = split(//, $sentence); # 特別に対象外とする文 if ($neglect_sid{$sid}) { print "# S-ID:$sid 全体削除:$sentence\n"; return; } if ($neglect_h_sid{$sid}) { print "# S-ID:$sid 人手削除:$sentence\n"; return; } # "【","◇","▽","●","<","《"で始まる文は全体を削除 if ($sentence =~ /^( )?(【|◇|▽|●|<|《)/) { print "# S-ID:$sid 全体削除:$sentence\n"; return; } # "………"だけの文は全体を削除 if ($sentence =~ /^(…)+$/) { print "# S-ID:$sid 全体削除:$sentence\n"; return; } for ($i = 0; $i < @char_array; $i++) { $check_array[$i] = 1; } # 文頭の" "は削除 $check_array[0] = 0 if ($char_array[0] eq " "); # 文頭の" ――"は削除 if ($sentence =~ "^ ――") { $check_array[1] = 0; $check_array[2] = 0; } # "(…)"の削除,ただし,"(1)","(2)"の場合は残す $enu_num = 1; $paren_start = -1; $paren_level = 0; $paren_str = ""; for ($i = 0; $i < @char_array; $i++) { if ($char_array[$i] eq "(") { $paren_start = $i if ($paren_level == 0); $paren_level++; } elsif ($char_array[$i] eq ")") { $paren_level--; if ($paren_level == 0) { if ($paren_str eq $enu[$enu_num]) { $enu_num++; } else { for ($j = $paren_start; $j <= $i; $j++) { $check_array[$j] = 0; } } $paren_start = -1; $paren_str = ""; } } else { $paren_str .= $char_array[$i] if ($paren_level != 0); } } # print STDERR "enu_num(+1) = $enu_num\n" if ($enu_num > 1); # "=…="の削除,ただし間に","がくればRESET $paren_start = -1; $paren_level = 0; $paren_str = ""; for ($i = 0; $i < @char_array; $i++) { if ($check_array[$j] == 0) { ; # "(…)"の中はスキップ } elsif ($char_array[$i] eq "=") { if ($paren_level == 0) { $paren_start = $i; $paren_level++; } elsif ($paren_level == 1) { for ($j = $paren_start; $j <= $i; $j++) { $check_array[$j] = 0; } $paren_start = -1; $paren_level = 0; $paren_str = ""; } } elsif ($char_array[$i] eq "、") { if ($paren_level == 1) { # "=…"となっていても,"、"がくればRESET # 例 "「中高年の星」=米長と、若き天才=羽生" # print STDERR "=…,…=RESET:$paren_str:$sentence\n"; $paren_start = -1; $paren_level = 0; $paren_str = ""; } } else { $paren_str .= $char_array[$i] if ($paren_level == 1); } } # "=…(文末)"で,文末に"。"がないか,"…"が"写真。"であれば除削 if ($paren_level == 1) { if ($paren_str =~ /^写真/ || $paren_str !~ /。$/) { for ($j = $paren_start; $j < $i; $j++) { $check_array[$j] = 0; } # print STDERR "=…DELETE:$paren_str:$sentence\n"; } else { # print STDERR "=…KEEP:$paren_str:$sentence\n"; } } $flag = 0; for ($i = 0; $i < @char_array; $i++) { if ($check_array[$i] == 1) { $flag = 1; last; } # 有効部分がなければ全体削除 } if ($enu_num > 2) { # (1)(2)とあれば全体削除 # print STDERR "# S-ID:$sid 全体削除:$sentence\n"; $flag = 0; } if ($flag == 0) { print "# S-ID:$sid 全体削除:$sentence\n"; } else { print "# S-ID:$sid"; for ($i = 0; $i < @char_array; $i++) { if ($check_array[$i] == 0) { print " 部分削除:$i:" if ($i == 0 || $check_array[$i-1] == 1); print $char_array[$i]; } } print "\n"; for ($i = 0; $i < @char_array; $i++) { print $char_array[$i] if ($check_array[$i] == 1); } print "\n"; } } ###################################################################### # END ######################################################################