论文部分内容阅读
摘要:该文对英文字符串、中文字串和中英文混合字符串的切分方法进行研究。首先分析现有的中文、英文切分算法,再提出了一种实用的中英文混合切分算法。对于不同字符串的切分问题进行深入研究,针对不同要求,不同字符串提出不同切分算法和具体实施方法。
关键词:字符;切分;技术;函数;软件;字符串
中图分类号:TP391文献标识码:A文章编号:1009-3044(2011)14-3426-03
Chinese and English Mixed String Segmentation Technique
YANG Zhen-yu
(Qingyuan Polytechnic, Qingyuan 511500, China)
Abstract: This paper text string in English string, mixed string in both Chinese and English segmentation method for research. This paper firstly analyzes the existing Chinese, English segmentation algorithm is proposed, then mixed segmentation practical English and Chinese. The segmentation problem for different string, in-depth study according to different requirements, different string put a different segmentation and concrete implementation method.
Key words: characters; segmentation; technology; functions; software; string
隨着计算机在各个领域的广泛应用。从最初的数据处理、信息处理发展到今天的知识处理、图形处理和对语言文字的信息处理。上世纪提出中文信息自动分词处理以来,许多专家和学者在这一领域已经取得了很大的进展。随着信息的多元化和复杂化,基于中文信息分词的算法也得到了不断改进和完善[1]。分词算法在信息检索、信息提取、人机交互、文本挖掘、自动归档等领域都有着广泛的应用,但是在今天经济的飞速发展的中国,中国与世界的紧密联系,信息的形式从单一的汉语发展到中外语言混合的形式来表达,特别是中英文混合使用的情况非常普遍。这就要求新的信息处理系统不仅能够将中文正确切分,还要能够对中英文混合的情况正确切分[2]。本文就英文字符串、中文字串和中英文混合字符串的切分谈谈自己的方法。
1 英文字符串切分技术
英文字符串一般是指英文字母、阿拉伯数字、标点符号、运算符、特殊字符等,每个字符只占用一个存储单元[3]。对于这样的的字符串进行切分,方法很多,下面主要从两个方面进行介绍,一是按某一特定字符对字符串进行切分,二是切分指定长度的字符串。
1.1 按指定字符进行切分
在对一个字符串进行切分时,通常要求按照某一个特定的字符对字符串进行切分。这种切分的结果是切出来的字符串长度不定。按照要求,采用函数ExtractStrings就可以轻松实现,但要注意切分后的串有足够的存储空间。
1.1.1 ExtractStrings函数定义
Function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar; Strings: TStrings): Integer;[4]
参数说明:
1)Separators参数指定一组分割符,所有的子串都是用它们分割的。但是成对的引号内的分割符会被忽略。
2)WhiteSpace 参数指定每个子串开头被忽略的字符s。
3)Content 参数就是被分割的“源”串了。
4)Strings 参数用于接收分割后的各个子串,它的原有内容不会被清空。
另外,EctractStrings不会把(忽略WhiteSpaces后的)空串加入到Strings中。
1.1.2 实例验证
切分字符串:welcom to|...Qingyuan|##Polytechnic|"|# www.qypt.com.cn"
希望得到下面四个字符串:
1)welcom to
2)Qingyuan
3)Polytechnic
4)"|# www.qypt.com.cn"
分析:从给定的字符串可以看出,利用字符“|”作为分割符,指定被忽略为空格、“.”和“#”。具体实现算法如下:
var
ASource: PChar;
AStr: String;
ACount: Integer;
begin
ASource := ’welcom to|...Qingyuan|##Polytechnic|"|# www.qypt.com.cn"’;
ACount :=ExtractStrings([’|’],[’ ’, ’#’, ’.’], ASource,ListBox1.Items);
end;
1.2 切分指定长度的字符串
对于从任一字符串中截取指定位置、指定长度字符串的方法很多,通常利用LeftStr、MidStr、RightStr等函数实现切分。函数定义如下:
1.2.1 LeftStr函数定义
定义格式:function LeftStr(S:string;Count:integer):string;[5]
函数表示获取字符串S左边起Count个字符
1.2.2 MidStr函数定义
定义格式:function MidStr(S:String; Index, Count: Integer): String;
函数表示从S字符串的Index处开始,截取Count个字符的串返回。
1.2.3 RightStr函数定义
定义格式:function RightStr (S:string;Count:integer):string;
函数表示获取字符串S右边起Count个字符。
1.2.4 实例验证
切分字符串:welcom to|... Qingyuan|##Polytechnic|"|# www.qypt.com.cn"
希望得到下面四个字符串:
1)welcom to
2)Qingyuan
3)Polytechnic
4)"|# www.qypt.com.cn"
分析:从上面的要求来看,采用LeftStr、MidStr、RightStr三个函数来实现,具体实现算法如下:
var
dstr,str1,str2,str3,str4:string;
begin
Dstr :=’ welcom to|... Qingyuan|##Polytechnic|"|# www.qypt.com.cn"’;
Str1:=LeftStr(Dstr, 9);
Str2:=MidStr(Dstr, 15, 8);
Str3:=MidStr(Dstr, 26, 11);
Str4:=RightStr(Dstr, 20);
end;
2 中文字串切分技术
中文字通常指汉字,以及中文的标点符号等,在计算机中每个字占用两个存储单元,因此,在切分全中文串时要特别注意。在对中文字串进行切分时,要确保切割后的字不被分成两半产生乱码[6]。对于全中文的字串切分,同样可以采用字符串的切分方法,只是特别注意切分后的字串长度是偶数。要注意的是copy函数与LeftStr、MidStr、RightStr函数在进行中文字串切分时长度的要求是不相同的。Copy函数是按照字占有的存储单元进行计算长度,而LeftStr、MidStr、RightStr函数是按照字符或字的个数为长度计算长度的。下面我们先来看一下copy函数的定义。
2.1 Copy函数定义
定义格式: functionCopy(S; Index, Count: Integer): string;[7]
函数表示从S字符串的Index处开始,截取Count个字符的串返回。
2.2 切分实例
切分字串:中华人民共和国中央人民政府
希望得到下面四个字符串:
1)中华
2)人民共和国
3)中央人民
4)政府
分析:要得到相应的结果,采用copy、LeftStr、MidStr、RightStr四个函数都可以实现,具体实现算法如下:
var
dstr,str1,str2,str3,str4:string;
begin
Dstr :=’中华人民共和国中央人民政府’;
Str1:=LeftStr(Dstr,2);
Str2:=MidStr(Dstr,3,5);
Str3:=copy(Dstr,15,8);
Str4:=RightStr(Dstr,2);
end;
从各个函数的应用来看,不难看出,LeftStr、MidStr、RightStr切分的长度是字的个数,而实际上所占用的存储单元为该长度的2倍,如“LeftStr(Dstr,2)”是截取字串Dstr的最左边两个汉字,但是两个汉字所占用的存储单元为4个字节。而“copy(Dstr,15,8)”则是以实际所占用的存储单元作为起始切分点和切分长度。
3 中英文混合字符串切分方法
对于全中文或全英文的信息串,已经能够利用多种方法进行很好的切分。但在实际的应用中,信息的形式不再是单一的汉语或英文,发展今天中英文混合使用的情况非常普遍。这就要求新的信息处理系统不仅能够将中文正确切分,还要能够对中英文混合的情况正确切分。特别是从串中切出指定长度的子串,已经在信息检索、信息提取、人机交互、文本挖掘、自动归档等领域广泛使用。下面就如何对中英文混合串进行切分提出一种快速的算法。
对于中英文混排的字符串,在利用上述的copy、LeftStr、MidStr、RightStr四个函数进行切分时,会产生以下几个方面的问题:
1)利用LeftStr、MidStr、RightStr函数切分时,切分后的中英文混合子串不一定与要求的串长度一致。
2)利用copy函数或其他类似的函数进行切分时,由于指定了子串的长度,而切分子串的位置可能会是汉字的前一个存储单元或后一个存储单元,从理论上来说即有可能将一个汉字切成两半,产生乱码。但是copy函数会自动判断最后一个存储单元是字符还是半个汉字的存储单元,如果是半个汉字的存储单元则丢弃,以保证数据的完整性,从而不会产生乱码。
通过实例来验证存在的问题。有下例三段文字要求切分出前12个存储单元的内容。
Activate:激活(来源于active活泼的,-ate表使役的动词后缀)。
动词augment(增加)也来源于"augere"。
警察使用homicide来表示杀人事件,因为homicide有“杀人”的意思。
分别用copy、LeftStr函数,可以得出语句:
Var
Str1,str2,str3:string;
Ls1,Ls2,Ls3:string;
Begin
Str1:=’Activate:激活(來源于active活泼的,-ate表使役的动词后缀)。’;
Str2:=’动词augment(增加)也来源于"augere"。’;
Str3:=’警察使用homicide来表示杀人事件,因为homicide有“杀人”的意思。’;
Ls1:=Copy(str1,1,12);
Ls2:=Copy(str2,1,12);
Ls3:=Copy(str3,1,12);
End;
结果:
Ls1为“Activate:激”
Ls2为“动词augment”
Ls3为“警察使用homi”
其中Ls1的长度为11,Ls2的长度为11,Ls3的长度为12。
如果使用LeftStr有:
Ls1:= LeftStr (str1,12);
Ls2:= LeftStr (str2,12);
Ls3:= LeftStr (str3,12);
结果:
Ls1为“Activate:激活(”
Ls2为“动词augment(增加”
Ls3为“警察使用homicide”
其中Ls1的长度为15,Ls2的长度为17,Ls3的长度为16。
因此,在需要切取指定长度的字或字符串时,显然copy函数比较接近需要。
4 结束语
中英文混合字符串切分技术现在已经得到普遍应用,对于不同的切分要求,根据实现情况采用合理的切分方法,特别是对串的词的识别、切分仍然存在很多问题,需要去探索、研究和解决。本文介绍只在中英文混合字符串切分技术方面抛砖引玉,提供借鉴。
参考文献:
[1] 李钊.中英文混排文字识别系统的设计与实现[D].成都:电子科技大学,2007.
[2] 安艳辉.中英文混排字符切分方法研究[D].保定:河北大学,2004.
[3] 陈臻刚,丁晓青,刘长松,等.文档识别中误切分字符拒识问题的研究[J].计算机工程与应用,2002(17).
[4] 许洁舟,林伟鹏,林盛雄,等.Delphi7程序设计与实例[M].北京:冶金工业出版社,2003:526-528.
[5] 邓一贵.基于字符频率及分治法的字符串模式匹配算法[J].计算机科学,2008(6):168-170.
[6] 王晓鹏.验证码识别系统的研究及实现 [D].广州:华南理工大学,2010.
[7] 刘瑞新.Delphi 程序设计教程[M].2版.北京:机械工业出版社,2010:35-46.
关键词:字符;切分;技术;函数;软件;字符串
中图分类号:TP391文献标识码:A文章编号:1009-3044(2011)14-3426-03
Chinese and English Mixed String Segmentation Technique
YANG Zhen-yu
(Qingyuan Polytechnic, Qingyuan 511500, China)
Abstract: This paper text string in English string, mixed string in both Chinese and English segmentation method for research. This paper firstly analyzes the existing Chinese, English segmentation algorithm is proposed, then mixed segmentation practical English and Chinese. The segmentation problem for different string, in-depth study according to different requirements, different string put a different segmentation and concrete implementation method.
Key words: characters; segmentation; technology; functions; software; string
隨着计算机在各个领域的广泛应用。从最初的数据处理、信息处理发展到今天的知识处理、图形处理和对语言文字的信息处理。上世纪提出中文信息自动分词处理以来,许多专家和学者在这一领域已经取得了很大的进展。随着信息的多元化和复杂化,基于中文信息分词的算法也得到了不断改进和完善[1]。分词算法在信息检索、信息提取、人机交互、文本挖掘、自动归档等领域都有着广泛的应用,但是在今天经济的飞速发展的中国,中国与世界的紧密联系,信息的形式从单一的汉语发展到中外语言混合的形式来表达,特别是中英文混合使用的情况非常普遍。这就要求新的信息处理系统不仅能够将中文正确切分,还要能够对中英文混合的情况正确切分[2]。本文就英文字符串、中文字串和中英文混合字符串的切分谈谈自己的方法。
1 英文字符串切分技术
英文字符串一般是指英文字母、阿拉伯数字、标点符号、运算符、特殊字符等,每个字符只占用一个存储单元[3]。对于这样的的字符串进行切分,方法很多,下面主要从两个方面进行介绍,一是按某一特定字符对字符串进行切分,二是切分指定长度的字符串。
1.1 按指定字符进行切分
在对一个字符串进行切分时,通常要求按照某一个特定的字符对字符串进行切分。这种切分的结果是切出来的字符串长度不定。按照要求,采用函数ExtractStrings就可以轻松实现,但要注意切分后的串有足够的存储空间。
1.1.1 ExtractStrings函数定义
Function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar; Strings: TStrings): Integer;[4]
参数说明:
1)Separators参数指定一组分割符,所有的子串都是用它们分割的。但是成对的引号内的分割符会被忽略。
2)WhiteSpace 参数指定每个子串开头被忽略的字符s。
3)Content 参数就是被分割的“源”串了。
4)Strings 参数用于接收分割后的各个子串,它的原有内容不会被清空。
另外,EctractStrings不会把(忽略WhiteSpaces后的)空串加入到Strings中。
1.1.2 实例验证
切分字符串:welcom to|...Qingyuan|##Polytechnic|"|# www.qypt.com.cn"
希望得到下面四个字符串:
1)welcom to
2)Qingyuan
3)Polytechnic
4)"|# www.qypt.com.cn"
分析:从给定的字符串可以看出,利用字符“|”作为分割符,指定被忽略为空格、“.”和“#”。具体实现算法如下:
var
ASource: PChar;
AStr: String;
ACount: Integer;
begin
ASource := ’welcom to|...Qingyuan|##Polytechnic|"|# www.qypt.com.cn"’;
ACount :=ExtractStrings([’|’],[’ ’, ’#’, ’.’], ASource,ListBox1.Items);
end;
1.2 切分指定长度的字符串
对于从任一字符串中截取指定位置、指定长度字符串的方法很多,通常利用LeftStr、MidStr、RightStr等函数实现切分。函数定义如下:
1.2.1 LeftStr函数定义
定义格式:function LeftStr(S:string;Count:integer):string;[5]
函数表示获取字符串S左边起Count个字符
1.2.2 MidStr函数定义
定义格式:function MidStr(S:String; Index, Count: Integer): String;
函数表示从S字符串的Index处开始,截取Count个字符的串返回。
1.2.3 RightStr函数定义
定义格式:function RightStr (S:string;Count:integer):string;
函数表示获取字符串S右边起Count个字符。
1.2.4 实例验证
切分字符串:welcom to|... Qingyuan|##Polytechnic|"|# www.qypt.com.cn"
希望得到下面四个字符串:
1)welcom to
2)Qingyuan
3)Polytechnic
4)"|# www.qypt.com.cn"
分析:从上面的要求来看,采用LeftStr、MidStr、RightStr三个函数来实现,具体实现算法如下:
var
dstr,str1,str2,str3,str4:string;
begin
Dstr :=’ welcom to|... Qingyuan|##Polytechnic|"|# www.qypt.com.cn"’;
Str1:=LeftStr(Dstr, 9);
Str2:=MidStr(Dstr, 15, 8);
Str3:=MidStr(Dstr, 26, 11);
Str4:=RightStr(Dstr, 20);
end;
2 中文字串切分技术
中文字通常指汉字,以及中文的标点符号等,在计算机中每个字占用两个存储单元,因此,在切分全中文串时要特别注意。在对中文字串进行切分时,要确保切割后的字不被分成两半产生乱码[6]。对于全中文的字串切分,同样可以采用字符串的切分方法,只是特别注意切分后的字串长度是偶数。要注意的是copy函数与LeftStr、MidStr、RightStr函数在进行中文字串切分时长度的要求是不相同的。Copy函数是按照字占有的存储单元进行计算长度,而LeftStr、MidStr、RightStr函数是按照字符或字的个数为长度计算长度的。下面我们先来看一下copy函数的定义。
2.1 Copy函数定义
定义格式: functionCopy(S; Index, Count: Integer): string;[7]
函数表示从S字符串的Index处开始,截取Count个字符的串返回。
2.2 切分实例
切分字串:中华人民共和国中央人民政府
希望得到下面四个字符串:
1)中华
2)人民共和国
3)中央人民
4)政府
分析:要得到相应的结果,采用copy、LeftStr、MidStr、RightStr四个函数都可以实现,具体实现算法如下:
var
dstr,str1,str2,str3,str4:string;
begin
Dstr :=’中华人民共和国中央人民政府’;
Str1:=LeftStr(Dstr,2);
Str2:=MidStr(Dstr,3,5);
Str3:=copy(Dstr,15,8);
Str4:=RightStr(Dstr,2);
end;
从各个函数的应用来看,不难看出,LeftStr、MidStr、RightStr切分的长度是字的个数,而实际上所占用的存储单元为该长度的2倍,如“LeftStr(Dstr,2)”是截取字串Dstr的最左边两个汉字,但是两个汉字所占用的存储单元为4个字节。而“copy(Dstr,15,8)”则是以实际所占用的存储单元作为起始切分点和切分长度。
3 中英文混合字符串切分方法
对于全中文或全英文的信息串,已经能够利用多种方法进行很好的切分。但在实际的应用中,信息的形式不再是单一的汉语或英文,发展今天中英文混合使用的情况非常普遍。这就要求新的信息处理系统不仅能够将中文正确切分,还要能够对中英文混合的情况正确切分。特别是从串中切出指定长度的子串,已经在信息检索、信息提取、人机交互、文本挖掘、自动归档等领域广泛使用。下面就如何对中英文混合串进行切分提出一种快速的算法。
对于中英文混排的字符串,在利用上述的copy、LeftStr、MidStr、RightStr四个函数进行切分时,会产生以下几个方面的问题:
1)利用LeftStr、MidStr、RightStr函数切分时,切分后的中英文混合子串不一定与要求的串长度一致。
2)利用copy函数或其他类似的函数进行切分时,由于指定了子串的长度,而切分子串的位置可能会是汉字的前一个存储单元或后一个存储单元,从理论上来说即有可能将一个汉字切成两半,产生乱码。但是copy函数会自动判断最后一个存储单元是字符还是半个汉字的存储单元,如果是半个汉字的存储单元则丢弃,以保证数据的完整性,从而不会产生乱码。
通过实例来验证存在的问题。有下例三段文字要求切分出前12个存储单元的内容。
Activate:激活(来源于active活泼的,-ate表使役的动词后缀)。
动词augment(增加)也来源于"augere"。
警察使用homicide来表示杀人事件,因为homicide有“杀人”的意思。
分别用copy、LeftStr函数,可以得出语句:
Var
Str1,str2,str3:string;
Ls1,Ls2,Ls3:string;
Begin
Str1:=’Activate:激活(來源于active活泼的,-ate表使役的动词后缀)。’;
Str2:=’动词augment(增加)也来源于"augere"。’;
Str3:=’警察使用homicide来表示杀人事件,因为homicide有“杀人”的意思。’;
Ls1:=Copy(str1,1,12);
Ls2:=Copy(str2,1,12);
Ls3:=Copy(str3,1,12);
End;
结果:
Ls1为“Activate:激”
Ls2为“动词augment”
Ls3为“警察使用homi”
其中Ls1的长度为11,Ls2的长度为11,Ls3的长度为12。
如果使用LeftStr有:
Ls1:= LeftStr (str1,12);
Ls2:= LeftStr (str2,12);
Ls3:= LeftStr (str3,12);
结果:
Ls1为“Activate:激活(”
Ls2为“动词augment(增加”
Ls3为“警察使用homicide”
其中Ls1的长度为15,Ls2的长度为17,Ls3的长度为16。
因此,在需要切取指定长度的字或字符串时,显然copy函数比较接近需要。
4 结束语
中英文混合字符串切分技术现在已经得到普遍应用,对于不同的切分要求,根据实现情况采用合理的切分方法,特别是对串的词的识别、切分仍然存在很多问题,需要去探索、研究和解决。本文介绍只在中英文混合字符串切分技术方面抛砖引玉,提供借鉴。
参考文献:
[1] 李钊.中英文混排文字识别系统的设计与实现[D].成都:电子科技大学,2007.
[2] 安艳辉.中英文混排字符切分方法研究[D].保定:河北大学,2004.
[3] 陈臻刚,丁晓青,刘长松,等.文档识别中误切分字符拒识问题的研究[J].计算机工程与应用,2002(17).
[4] 许洁舟,林伟鹏,林盛雄,等.Delphi7程序设计与实例[M].北京:冶金工业出版社,2003:526-528.
[5] 邓一贵.基于字符频率及分治法的字符串模式匹配算法[J].计算机科学,2008(6):168-170.
[6] 王晓鹏.验证码识别系统的研究及实现 [D].广州:华南理工大学,2010.
[7] 刘瑞新.Delphi 程序设计教程[M].2版.北京:机械工业出版社,2010:35-46.