**[[CRF++]] [#f967730e]
-暫定版 11/09
$file = "";#タグ付データ
$fileOut = "";#CRF++形式のファイルへ変換
open(IN,$file);
open(OUT,">$fileOut");
while(<IN>){
chomp;
#タグを削除する
$after = $before =$_;
print "[前]$before\n";
$after =~ s/<.*?>//g;
print "[後]$after\n";
#タグが付いている単語を格納する。
@tmp = split(/<\//);
undef %NE;
foreach(@tmp){
if(/^(.*)<(.*?)>(.*?)$/){
$pre =$1;
$name =$2;
$value =$3;
$NE{$value} .= "$name";
}
}
#タグを削除したデータを形態素解析する。
open(MECAB,">mecab.input");
print MECAB "$after";
close(MECAB);
#Mecab実行
@M = `/usr/local/bin/mecab -Ocrf < mecab.input`;
chomp @M;
#IOBタグ
#B: チャンクの先頭
#E: チャンクの末尾
#I : チャンクの内部
#S: 一つの語でチャンクを構成する
#O: チャンクの外部
undef $comb;
undef @Mp;#IOBタグ格納
for($i=0;$i<@M;$i++){
@Ms = split(/\s/,$M[$i]);
#print "$i $Ms[0] --> $M[$i]\n";
#マッチングのために結合
$comb .= "$Ms[0] ";
@combs = split(/ /,$comb);
#後ろから結合してマッチした単語にIOBタグを付与(暫定版)
undef $comb2;
for($j=@combs-1;$j>=0;$j--){
#$i までの状態を後ろから結合
$comb2 = $combs[$j] . $comb2;
#タグ付けされた単語と一致した場合、IOBタグを付与する。
if($NE{$comb2}){
$n = @combs - $j -1;
#Bタグだけは最初につける
$Mp[$i-$n] = "B-$NE{$comb2}";
#IタグはBタグの後につける
for($k=$i-$n+1;$k<=$i;$k++){
$Mp[$k] = "I-$NE{$comb2}";
}
last;
}
}
}
#print OUT "\n$before\n";
for($i=0;$i<@M;$i++){
if($Mp[$i]){
print OUT "$M[$i] $Mp[$i]\n";
}
else{
#タグが付けられていない場合、Oタグをつける
print OUT "$M[$i] O\n";
}
}
}
close(OUT);
close(IN);