系列索引:基于.NET的分词软件设计与实现–索引及说明
在前面的两个版本中我们已经实现了所有的功能,即针对中文、英文、数字及特殊符号的分词功能,所以整体的功能已经基本实现,所有从这一篇开始起,系列的重点就放在了对比测试和性能优化上。
首先来看对比测试,俗话说:有比较才有进步。所以偶下载了很多分词软件,通过分词算法、分词效果及分词耗时等多项指标的比对,对自己的分词软件做出了相应的功能修补:
如果没有特别说明,从本文开始的所有文章均以下图所示的某新闻报道为测试文本:
标注不是本系列的关注点,所以暂且pass(下同)。可以看到本分词软件的结果分隔并不是很明显,用户体验较差。
(2)中科院计算所汉语词法分析系统 下载
即把所有的斜线分隔符换成了来两个空格的形式。基于xml格式的即把分出来的词使用<src></src>的标签包裹。
(3)、盘古分词 下载
看到下面的留言有人提到盘古分词,我也下载了测试一下,效果如下:
可以看出本软件并没有对特殊字符(如换行符)作特殊处理,且分词只有一种输出格式,并且文本溢出时没有显示下拉框,体验不是很好。
(5)网络在线分词
下面提供一些我找到的还算可以的网络在线分词系统:
SCWS: http://www.hightman.cn/index.phpcws
高速在线中文分词:http://www.goocnjp.com/test/fenci/
此外,个人还做了一些分词软件的测试,结果是大多数分词对于待分词文本均不进行附加处理,而是保留其格式输出,而且其中作为分词方面权威的中科院的两款分词软件也是如此,这更说明了我们应该保留文本的原意,所以综合以上测试,我否定了自己在V2.0中提出的文本预处理的做法。
2、使用数组索引进行分词效率提升尝试。
回顾上篇的程序流程图,可以看到,我构造了一个集合用来存储非中文字符,在分词时出来循环遍历词典,还要遍历非中文字符的集合,效率自然比较悲催。。。
所以在V3.0中采取了数组索引的方式,所谓数组索引,代码如下:
1 /// <summary>
2 /// Updated:为所有数字英文添加分隔符
3 /// </summary>
4 /// <returns></returns>
5 string SplitNonChinese()
6 {
7 for ( int j = 0 ; j < _nonChineseRegex.Matches(_inputStr).Count; j ++ )
8 {
9 _inputStr = _inputStr.Insert(_nonChineseRegex.Matches(_inputStr)[j].Index + _nonChineseRegex.Matches(_inputStr)[j].Value.Length, @” “ );
10 }
11 return _inputStr;
12 }
13
14 /// <summary>
15 /// Updated:为所有中文标点添加分隔符
16 /// </summary>
17 string SplitChinesePunctuation()
18 {
19 _inputStr = SplitNonChinese();
20 for ( int i = 0 ; i < _chinesePunctuationRegex.Matches(_inputStr).Count; i ++ )
21 {
22 _inputStr = _inputStr.Insert(_chinesePunctuationRegex.Matches(_inputStr)[i]. Index + _chinesePunctuationRegex.Matches(_inputStr)[i].Value.Length, @” “ ); 23 }
24 return _inputStr;
25 }
26
27 /// <summary>
28 /// Updated:为所有汉字添加分隔符
29 /// </summary>
30 string SplitChinese()
31 {
32 _inputStr = SplitChinesePunctuation();
33 StringBuilder sb = new StringBuilder(_inputStr);
34 int i = 0 ;
35 foreach (Match item in _chineseRegex.Matches(sb.ToString()))
36 {
37 sb = sb.Insert(item.Index + item.Value.Length + i, “ \ “ );
38 i ++ ;
39 }
40 return sb.ToString();
41 }
由上可以看出,我们利用正则匹配,对匹配的位置分别加入斜杠分割,这样我们在正式的RMM(逆向最大匹配算法)开始分词之前就将文本进行了划分,划分出中文、非中文和标点符号。
程序流程图:
可以看到之前的遍历非中文集合操作已经被取消,更改为判断是否是中文字符,只要通过:_nonChineseRegex.IsMatch(strList[i])判断出有一个字符不是中文,介于之前已经对文本进行了拆分,所以我们可以很肯定的认为整个子句均为非中文,故直接加入到待输出集合中即可。
结果:截取测试文本的1000个字进行测试,结果从V2.0的11秒左右提升到了8秒左右,效率提升27%。
作者:Rocky翔
出处:http://www.cnblogs.com/RockyMyx/
本文版权归作者和博客园共有,欢迎转载,但请在文章明显位置给出原文连接,否则保留追究法律责任的权利。
转载于:https://www.cnblogs.com/RockyMyx/archive/2011/06/15/my-word-segmentation-software-part-three.html
相关资源:jFB精良分班软件绿色版-教育工具类资源-CSDN文库
来源:weixin_33843947
声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!