##########################################################################
#	文件名：	Fun_of_MarkCh.pl
#	作者:		南京大学计算机系NLP实验室	
#			liby.		May，2009
#	功能：		对字符串进行预处理和标注处理，详见各函数的说明
##########################################################################
##########################################################################
#		函数名：	Prepercess
#		功能：		对$_字符串进行操作，
#				在Itaclass基础上去掉预料中的多余标注，
#				仅保留数字和时间的标注
#		参数： 		使用默认参数$_
#		返回值：	操作结果直接保留在$_变量中
##########################################################################
sub Prepercess(){#在Itaclass基础上去掉预料中的多余标注，仅保留数字和时间的标注
###用于进行全半角转换的哈希表
my %h = ("０"=>"\\0]","１"=>"1","２"=>"2","３"=>"3","４"=>"4","５"=>"5","６"=>"6","７"=>"7","８"=>"8","９"=>"9","％"=>"%","（"=>"(","）"=>")",
         "＋"=>"+","－"=>"-","．"=>".","／"=>"/","："=>":","，"=>",","；"=>";","？"=>"?","！"=>"!","｛"=>"{","｝"=>"}","｜"=>"|","。"=>".");
###全半角数字标点转换
s/([\x80-\xff]{2})/$h{ $1 } ? $h{ $1 } : $1/eg;	
s/\\0\]/0/g;
###去掉多余的空格
s/\s(\s)/$1/g;
###处理语料库中的特例
s/\/m\s\%\/m/%\/m/g; #10/m  %/m 

###将符合数字和数字型时间条件的时间和数字用\(t|m)特殊标记
s/(^|\s)([+-]?\d+[\.\/\,\:]?\d*(?:百|千|万|亿|佰|仟|年|月|日|‰|\%|点|年|月|日|时|分|秒|月份)?\d*)\/(t|m)/$1$2\\$3/g;#isAllNum
s/(^|\s)((?:零|○|一|二|两|三|四|五|六|七|八|九|十|廿|百|千|万|亿|壹|贰|叁|肆|伍|陆|柒|捌|玖|拾|佰|仟)+(?:分之)?(?:零|○|一|二|两|三|四|五|六|七|八|九|十|廿|百|千|万|亿|壹|贰|叁|肆|伍|陆|柒|捌|玖|拾|佰|仟|\.|\/|点|年|月|日|时|分|秒|月份)*)\/(t|m)/$1$2\\$3/g;#isAllChinesenum
s/(第\S+)\/m/$1\\m/g;
s/\\m\s\,\/wd\s(?=\d{3}(?:万|千|亿)?\\m)/,$1/g;			#处理逗号隔开的数字形式2，000
s/\\m\s(\/|\:)\/wd\s(\d+)(?=\\m\s)/$1$2/g; 		#将分数和比分形式表示出来
s/(^|\s)(\d\d\d\d)\\m/($2>=1800&&$2<=2050)?"$1$2\\m":"$1$2\\t"/eg;#认为1800-2050间的数为年份

###将符合条件的钟点型时间和数字用\c特殊标记
s/(上午|下午)\/t\s(\S+)\\(?:m|t)/$1 $2\\c/g;	#跟在时间后面的数字应当为时间
s/(点|时|分)\\t/$1\\c/g;                                #标注被判断为时间的钟点形式。
s/(点\S+)\\m\s(分)/$1$2\\c/g;			#标注简单的钟点形式“五点十分”
s/\\c\s半\\w+/半\\c/g;  				#两点半

###去掉其他的词性标注
s/(\S*)\/\w+/$1/g;

s/(^|\s)((?:一|二|两|三|四|五|六|七|八|九){2})\\m/$1$2/g; #去掉“两三、四五”等形式
s/(^|\s)((?:千|万)*)\\m/$1$2/g;

}

##########################################################################
#		函数名：	Replace_Num_Ch
#		功能：		对$_字符串进行操作，
#				在Prepercess()基础上将语料中的数字用[Num]替换
#				将被替换部分保存入$Numlist
#		参数： 		使用默认参数$_
#		返回值：	$Numlist(语料中被替换的数字)
#				被替换过的语料直接保存于$_中
##########################################################################
sub Replace_Num_Ch(){
my $Numlist="";
while(s/(\s|^)((?:\S+\\m\s)+)/$1\[Num] /){
$Numlist.=" $2;";
}
$Numlist=~s/(\S+)\\m(?=\s)/$1 /g;
chomp($Numlist);
return $Numlist;
}

##########################################################################
#		函数名：	Replace_Time_Ch
#		功能：		对$_字符串进行操作，
#				在Prepercess()基础上将语料中的时间用[Time]替换
#				将被替换部分保存入$Timelist
#		参数： 		使用默认参数$_
#		返回值：	$Timelist(语料中被替换的时间)
#				被替换过的语料直接保存于$_中
##########################################################################
sub Replace_Time_Ch(){
my $Timelist="";
while(s/(\s|^)((?:\S+\\t\s)+)/$1\[Time] /){
$Timelist.=" $2;";
}
$Timelist=~s/(\S+)\\t(?=\s)/$1 /g;
chomp($Timelist);
return $Timelist;
}

##########################################################################
#		函数名：	Replace_Clock_Ch
#		功能：		对$_字符串进行操作，
#				在Prepercess()基础上将语料中的时间用[Clock]替换
#				将被替换部分保存入$Clocklist
#		参数： 		使用默认参数$_
#		返回值：	$Clocklist(语料中被替换的时间)
#				被替换过的语料直接保存于$_中
##########################################################################
sub Replace_Clock_Ch(){
my $Clocklist="";
while(s/(\s|^)((?:\S+\\c\s)+)/$1\[Clock] /){
$Clocklist.=" $2;";
}
$Clocklist=~s/(\S+)\\c(?=\s)/$1 /g;
chomp($Clocklist);
return $Clocklist;
}

##########################################################################
#		函数名：	ReserveNumBelowTen_Ch
#		功能：		对$_字符串进行操作，
#				在Prepercess()基础上,Replace_Num之前,
#				将语料中小于等于十的数字标记抹去
#		参数： 		使用默认参数$_
#		返回值：	被替换过的语料直接保存于$_中
##########################################################################
sub ReserveNumBelowTen_Ch(){
s/(?:\s|^)(第(?:一|二|三|四|五|壹|贰|叁|肆|伍|1|2|3|4|5))\\m/ $1/g;
s/(?:\s|^)(第(?:六|七|八|九|十|陆|柒|捌|玖|拾|6|7|8|9|10))\\m/ $1/g;
s/(?:\s|^)(一|二|两|三|四|五|壹|贰|叁|肆|伍|1|2|3|4|5)\\m/ $1/g;
s/(?:\s|^)(六|七|八|九|十|陆|柒|捌|玖|拾|6|7|8|9|10)\\m/ $1/g;
}
1;