分享
 
 
 

ASP.NET编写简单的中文分词程序

王朝asp·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

几个月之前,在网上找到了一个中文词库素材(几百K),当时便想写一个分词程序了.我对汉语分词没有什么研究,也就凭自己臆想而写.若有相关方面专家,还请多给意见.

一、词库

词库大概有5万多词语(google能搜到,类似的词库都能用),我摘要如下:

地区 82

重要 81

新华社 80

技术 80

会议 80

自己 79

干部 78

职工 78

群众 77

没有 77

今天 76

同志 76

部门 75

加强 75

组织 75

第一列是词,第二列是权重.我写的这个分词算法目前并未利用权重.

二、设计思路

算法简要描述:

对一个字符串S,从前到后扫描,对扫描的每个字,从词库中寻找最长匹配.比如假设S="我是中华人民共和国公民",词库中有"中华人民共和国","中华","公民","人民","共和国"......等词.当扫描到"中"字,那么从中字开始,向后分别取1,2,3,......个字("中","中华","中华人","中华人民","中华人民共","中华人民共和","中华人民共和国",,"中华人民共和国公"),词库中的最长匹配字符串是"中华人民共和国",那么就此切分开,扫描器推进到"公"字.

数据结构:

选择什么样的数据结构对性能影响很大.我采用Hashtable _rootTable记录词库.键值对为(键,插入次数).对每一个词语,如果该词语有N个字,则将该词语的1,1~2,1~3,......1~N个字作为键,插入_rootTable中.而同一个键如果重复插入,则后面的值递增.

三、程序

具体程序如下(程序中包含权重,插入次数等要素,目前的算法并没有利用这些.可以借此写出更有效的分词算法):

ChineseWordUnit.cs //struct--(词语,权重)对

1 public struct ChineseWordUnit

2 {

3 private string _word;

4 private int _power;

5

6 /**//// <summary>

7 /// 中文词语单元所对应的中文词。

8 /// </summary>

9 public string Word

10 {

11 get

12 {

13 return _word;

14 }

15 }

16

17 /**//// <summary>

18 /// 该中文词语的权重。

19 /// </summary>

20 public int Power

21 {

22 get

23 {

24 return _power;

25 }

26 }

27

28 /**//// <summary>

29 /// 结构初始化。

30 /// </summary>

31 /// <param name="word">中文词语</param>

32 /// <param name="power">该词语的权重</param>

33 public ChineseWordUnit(string word, int power)

34 {

35 this._word = word;

36 this._power = power;

37 }

38 }

ChineseWordsHashCountSet.cs //词库容器

1 /**//// <summary>

2 /// 记录字符串出现在中文字典所录中文词语的前端的次数的字典类。如字符串“中”出现在“中国”的前端,则在字典中记录一个次数。

3 /// </summary>

4 public class ChineseWordsHashCountSet

5 {

6 /**//// <summary>

7 /// 记录字符串在中文词语中出现次数的Hashtable。键为特定的字符串,值为该字符串在中文词语中出现的次数。

8 /// </summary>

9 private Hashtable _rootTable;

10

11 /**//// <summary>

12 /// 类型初始化。

13 /// </summary>

14 public ChineseWordsHashCountSet()

15 {

16 _rootTable = new Hashtable();

17 }

18

19 /**//// <summary>

20 /// 查询指定字符串出现在中文字典所录中文词语的前端的次数。

21 /// </summary>

22 /// <param name="s">指定字符串</param>

23 /// <returns>字符串出现在中文字典所录中文词语的前端的次数。若为-1,表示不出现。</returns>

24 public int GetCount(string s)

25 {

26 if (!this._rootTable.ContainsKey(s.Length))

27 {

28 return -1;

29 }

30 Hashtable _tempTable = (Hashtable)this._rootTable[s.Length];

31 if (!_tempTable.ContainsKey(s))

32 {

33 return -1;

34 }

35 return (int)_tempTable[s];

36 }

37

38 /**//// <summary>

39 /// 向次数字典中插入一个词语。解析该词语,插入次数字典。

40 /// </summary>

41 /// <param name="s">所处理的字符串。</param>

42 public void InsertWord(string s)

43 {

44 for(int i=0;i<s.Length;i++)

45 {

46 string _s = s.Substring(0,i+1);

47 this.InsertSubString(_s);

48 }

49 }

50

51 /**//// <summary>

52 /// 向次数字典中插入一个字符串的次数记录。

53 /// </summary>

54 /// <param name="s">所插入的字符串。</param>

55 private void InsertSubString(string s)

56 {

57 if (!_

[1] [2] [3] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有