perl词典分词
从网上看了一篇perl分词的程序,运行程序后发现,数字全部给分开了,例如,“2010年国家GDP是...”,运行程序后结果为“2 0 1 0 年 国家 G D P 是 ....”,文中“2010”是不应该分开的,我改进了这个程序,可以实现数字不分开,如下: #!/usr/bin/perl print "Begin Loading Dictionary.../n"; while ($Line = <FileIn>) { #正文部分开始 sub Forward_Segment #正向最大匹配子程序定义 $Remained =~ s//n$//; #去除输入字串末尾之“/n”符号 while (length($Remained) > 0) { #当剩余字串长度为0时,循环结束?? $Match = 0; #定义匹配标志,为1则为汉字匹配,为0则为辞典外之字符匹配#?? $CurLen = length($Remained); #剩余字串长度?? for ($i = $MaxLen; $i >= 2; $i -= 2) {?? #UTF-8之汉字编码为3字节??? $MatchString = substr($Remained,$i); #开始时,取整个剩余字串为操作字串??? if (defined $Dict{$MatchString}) { #若在辞典中有对应词条???? $Segemted .= $MatchString; #操作字串匹配成功,输入到$Segemted中???? $Segemted .= ' '; #用来分割词语之标志???? $Remained = substr($Remained,$i,length($Remained)-$i); #去除匹配成功之字串???? $Match = 1; #标志为汉字匹配???? last; #跳出for循环??? }????? #若没有对应词条,则进入for循环下一轮,去除一个汉字?? }? ?? if ($Match == 0) { #辞典外之字符匹配??? if (ord($Remained) & 0x80) ??? { #取剩余字串之ASCII码并判断其所表示字符之长度???? ?$Len = 2; ???? ?$Segemted .= substr($Remained,$Len); #将其写入$Segemted中??? ?$Segemted .= ' '; #分割符??? ?$Remained = substr($Remained,$Len,length($Remained) - $Len); #去除该字符??? } else {???? ?$Len = 1;???? ?$Segemted .= substr($Remained,$Len); #将其写入$Segemted中??? ?$Segemted .= '? '; #分割符??? ?$Remained = substr($Remained,length($Remained) - $Len); #去除该字符??? }?? }}?$Segemted=~s/? ([^0-9.%])/ $1/g;?$Segemted=~s/([0-9.%])? /$1/g;return $Segemted; #将$Segemted作为结果返回}close FH;close DD; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |