use encoding "UTF-8"; $orgfile="atok-out.txt"; $jionkanjilistfile="jionkanjilisttest.txt"; $tangolistfile="outtest4.txt"; $outfile="outtest5.txt"; $delfile="outtest5del.txt"; $ryakuji="亜悪圧唖穐鯵囲医為壱逸逸稲飲隠羽嘘営栄衛益駅悦謁円縁塩焔艶奥応横欧殴黄温穏鴬鴎仮価禍画会壊悔懐海絵慨概拡殻覚学岳楽喝渇褐勧巻寛歓漢缶観間関陥館顔撹竃噛潅諌巌器既帰気祈偽戯犠旧拠挙虚峡挟教狭郷響暁勤謹亀侠尭区駆勲薫倶躯径恵掲渓経継茎蛍軽鶏芸撃倹剣圏検権献研県険顕験厳繋頚鹸効広恒鉱号国穀黒砿麹済砕斎剤桜冊殺雑参惨桟蚕賛残讃祉糸視飼歯児辞湿実舎写煮社者釈寿収臭従渋獣縦祝粛処暑緒署諸叙奨将渉焼祥称証乗剰壌嬢条浄状畳譲醸嘱触寝慎真神尽屡繍渚蒋醤穣晋図粋酔随髄数枢瀬晴清精声青静斉摂窃節専戦浅潜繊践銭禅蝉賎祖僧双壮層捜挿巣争総荘装騒増憎臓蔵贈即属続掻痩聡堕体対帯滞滝択沢単嘆担胆団弾断騨琢箪痴遅昼虫鋳著庁徴懲聴勅鎮猪塚掴壷逓鉄転点伝禎填顛都党盗灯当闘徳独読突届砺梼涛祷涜呑縄難弐迩悩脳嚢覇廃拝梅売麦発髪抜繁飯晩蛮蝿剥溌醗卑碑秘浜賓頻敏瓶桧侮福払仏併塀並変辺勉弁弁弁舗歩穂宝褒豊墨没頬毎万満槙侭免麺黙戻餅薬訳弥靖薮祐予余与誉揺様謡遥来頼乱欄覧莱隆竜虜両猟緑塁涙類励礼霊齢暦歴恋練錬炉労廊朗楼郎録篭蝋禄湾亘熙攅屏并妍叱瑶﨔麸弯迸鈬緕梹卆伜忰翆剱鑚纉譛筝祢枦舮芦槞蛎椢輌鼡乕档抬褝珱鰛鷏陦畴"; binmode (STDOUT); open IN, "<:utf8", $jionkanjilistfile; $jionkanji=; close IN; $mes="音データベースを構築中...\n"; &comhyoji; open IN, "<:utf8", $tangolistfile; while () { @a=split('\t'); push (@{$hyon{$a[0]}},$a[1]); push (@{$jion{$a[0]}},$a[2]); } close IN; $mes="完了\n"; &comhyoji; $mes="辭書ファイルを讀込中...\n"; &comhyoji; open(IN, $orgfile) ; my $txt; { local $/ = undef; $txt = ; } close(IN); $mes="完了\n"; &comhyoji; $mes="辭書ファイルを再構築中...(少し時間がかかる)\n"; &comhyoji; $txt = Encode::decode("UTF-16", $txt); $txt =~ s/\r\n/\n/g; @temp = split('\n', $txt); $mes="完了\n"; &comhyoji; $head = ""; while (1) { $i=shift(@temp); if ($i =~ /^!!/) {$head.="$i\n";} else { $head.="\n"; last;} } $maxo = $#temp; $per =0; $p = 0; $main = ""; $wakaran = ""; $delmain= ""; $chksum=0; foreach $i (@temp) { $p++; #進捗狀況表示 if (($p % 1000)==0) {print "$p / $maxo\n";} @a=split('\t',$i); #漢字チェック if ($a[1] !~ /[($jionkanji)]/) {next;} if ($a[1] =~ /[($ryakuji)]/) {next;} # $mes="$a[1] をチェック中 ( $p / $maxo ) \n"; &comhyoji; @jionyomi=(); @hyonyomi=(); $max=0; #一文字目の處理 $j=substr($a[1],0,1); for ($k=0; $k<= $#{$jion{$j}}; $k++) { if ($hyon{$j}[$k] eq substr($a[0],0,length($hyon{$j}[$k]))) { push (@jionyomi,$jion{$j}[$k]); push (@hyonyomi,$hyon{$j}[$k]); $max++; } } #二文字目以降の處理 for ($ii=1; $ii < length($a[1]); $ii++) { $maxplus=0; $j=substr($a[1],$ii,1); for ($k=0; $k<=$#{$jion{$j}}; $k++) { for ($m=0; $m < $max; $m++) { $st="$hyonyomi[$m]$hyon{$j}[$k]"; if ($st eq substr($a[0],0,length($st))) { push (@jionyomi,"$jionyomi[$m]$jion{$j}[$k]"); push (@hyonyomi,$st); $maxplus++; } } } while ($max>0) { shift (@jionyomi); shift (@hyonyomi); $max--; } $max=$maxplus; } for ($m=0; $m<=$max; $m++) { if ($a[0] eq $hyonyomi[$m]) { $chksum=1; if ($a[0] eq $jionyomi[$m]) {last;} $main.="$jionyomi[$m]\t$a[1]\t$a[2]\n"; $delmain.="$a[0]\t$a[1]\t$a[2]\n"; last; } } if ($chksum==0) {&addwakaran;} else {$chksum=0;} } $mes="完了\n"; &comhyoji; $mes="$outfile を出力中...\n"; &comhyoji; $txt = "$head$main"; $txt = Encode::encode ("UTF-16",$txt); open(OUT, "> $outfile"); binmode OUT; print OUT "$txt"; close(OUT); $mes="$delfile を出力中...\n"; &comhyoji; $txt = "$head$delmain"; $txt = Encode::encode("UTF-16",$txt); open(OUT, ">$delfile"); binmode OUT; print OUT "$txt"; close(OUT); $txt = "$head$wakaran"; $txt = Encode::encode("UTF-16",$txt); open(OUT, ">wakarantin.txt"); binmode OUT; print OUT "$txt"; close(OUT); $mes="終了\n"; &comhyoji; exit; sub comhyoji { print Encode::encode("shiftjis", $mes); } sub addwakaran{ #コピペ @jionyomi=(); $max=0; #一文字目の處理 $j=substr($a[1],0,1); for ($k=0; $k<= $#{$jion{$j}}; $k++) { if ($jion{$j}[$k] eq substr($a[0],0,length($jion{$j}[$k]))) { push (@jionyomi,$jion{$j}[$k]); $max++; } } #二文字目以降の處理 for ($ii=1; $ii < length($a[1]); $ii++) { $maxplus=0; $j=substr($a[1],$ii,1); for ($k=0; $k<=$#{$jion{$j}}; $k++) { for ($m=0; $m < $max; $m++) { $st="$jionyomi[$m]$jion{$j}[$k]"; if ($st eq substr($a[0],0,length($st))) { push (@jionyomi,$st); $maxplus++; } } } while ($max>0) { shift (@jionyomi); $max--; } $max=$maxplus; } for ($m=0; $m<=$max; $m++) { if ($a[0] eq $jionyomi[$m]) { $chksum=1; last; } } if ($chksum==0) {$wakaran.="$a[0]\t$a[1]\t$a[2]\n";} else {$chksum=0;} }