`
javatgo
  • 浏览: 1193718 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

编写简单的中文分词程序(转载)

阅读更多
几个月之前,在网上找到了一个中文词库素材(几百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--(词语,权重)对

1publicstructChineseWordUnit
2{
3privatestring_word;
4privateint_power;
5
6/**////<summary>
7///中文词语单元所对应的中文词。
8///</summary>

9publicstringWord
10{
11get
12{
13return_word;
14}

15}

16
17/**////<summary>
18///该中文词语的权重。
19///</summary>

20publicintPower
21{
22get
23{
24return_power;
25}

26}

27
28/**////<summary>
29///结构初始化。
30///</summary>
31///<paramname="word">中文词语</param>
32///<paramname="power">该词语的权重</param>

33publicChineseWordUnit(stringword,intpower)
34{
35this._word=word;
36this._power=power;
37}

38}

ChineseWordsHashCountSet.cs //词库容器

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

4publicclassChineseWordsHashCountSet
5{
6/**////<summary>
7///记录字符串在中文词语中出现次数的Hashtable。键为特定的字符串,值为该字符串在中文词语中出现的次数。
8///</summary>

9privateHashtable_rootTable;
10
11/**////<summary>
12///类型初始化。
13///</summary>

14publicChineseWordsHashCountSet()
15{
16_rootTable=newHashtable();
17}

18
19/**////<summary>
20///查询指定字符串出现在中文字典所录中文词语的前端的次数。
21///</summary>
22///<paramname="s">指定字符串</param>
23///<returns>字符串出现在中文字典所录中文词语的前端的次数。若为-1,表示不出现。</returns>

24publicintGetCount(strings)
25{
26if(!this._rootTable.ContainsKey(s.Length))
27{
28return-1;
29}

30Hashtable_tempTable=(Hashtable)this._rootTable[s.Length];
31if(!_tempTable.ContainsKey(s))
32{
33return-1;
34}

35return(int)_tempTable[s];
36}

37
38/**////<summary>
39///向次数字典中插入一个词语。解析该词语,插入次数字典。
40///</summary>
41///<paramname="s">所处理的字符串。</param>

42publicvoidInsertWord(strings)
43{
44for(inti=0;i<s.Length;i++)
45{
46string_s=s.Substring(0,i+1);
47this.InsertSubString(_s);
48}

49}

50
51/**////<summary>
52///向次数字典中插入一个字符串的次数记录。
53///</summary>
54///<paramname="s">所插入的字符串。</param>

55privatevoidInsertSubString(strings)
56{
57if(!_rootTable.ContainsKey(s.Length)&&s.Length>0)
58{
59Hashtable_newHashtable=newHashtable();
60_rootTable.Add(s.Length,_newHashtable);
61}

62Hashtable_tempTable=(Hashtable)_rootTable[s.Length];
63if(!_tempTable.ContainsKey(s))
64{
65_tempTable.Add(s,1);
66}

67else
68{
69_tempTable[s]=(int)_tempTable[s]+1;
70}

71}

72}

ChineseParse.cs //分词器

1/**////<summary>
2///中文分词器。
3///</summary>

4publicclassChineseParse
5{
6privatestaticChineseWordsHashCountSet_countTable;
7
8staticChineseParse()
9{
10_countTable=newChineseWordsHashCountSet();
11InitFromFile("ChineseDictionary.txt");
12}

13
14/**////<summary>
15///从指定的文件中初始化中文词语字典和字符串次数字典。
16///</summary>
17///<paramname="fileName">文件名</param>

18privatestaticvoidInitFromFile(stringfileName)
19{
20stringpath=Directory.GetCurrentDirectory()+@"\"+fileName;
21if(File.Exists(path))
22{
23using(StreamReadersr=File.OpenText(path))
24{
25strings="";
26while((s=sr.ReadLine())!=null)
27{
28ChineseWordUnit_tempUnit=InitUnit(s);
29_countTable.InsertWord(_tempUnit.Word);
30}

31}</s
分享到:
评论

相关推荐

    编写简单的中文分词程序

    本话题将聚焦于如何使用C#语言来编写一个简单的中文分词程序。C#是一种广泛应用的面向对象的编程语言,具有丰富的库和工具,非常适合进行此类任务。 首先,我们需要了解中文分词的基本原理。由于中文没有明显的空格...

    C语言编写的中文分词程序

    《C语言编写的中文分词程序》 在计算机科学领域,中文分词是自然语言处理(NLP)中的一项基础任务。它涉及到将连续的汉字序列切分成具有语义意义的词汇单元,这对于理解文本内容至关重要。C语言,作为一种基础且...

    简单的中文分词程序(练习)

    标题 "简单的中文分词程序(练习)" 指向的是一个个人开发的、用于学习和实践的简单中文分词工具。在这个项目中,开发者可能使用了 Python 语言,因为 Python 是处理自然语言处理任务(NLP,Natural Language ...

    C++编写的中文分词程序

    本项目以C++编程语言实现了一个中文分词程序,它具有一定的智能性,能够将输入的汉字文本文件中的内容分解成符合人们心理预期的词语。 C++是一种强大的、通用的编程语言,常用于系统软件、应用软件、游戏开发以及高...

    C#汉字分词程序

    本项目名为"C#汉字分词程序",它实现了两种常见的分词算法:正向最大匹配法(Forward Maximum Matching, FMM)和逆向最大匹配法(Reverse Maximum Matching, RMM)。下面我们将详细探讨这两种方法及其在C#中的应用。...

    VBA编写的分词程序

    ### VBA编写的分词程序知识点解析 #### 一、VBA简介 VBA(Visual Basic for Applications)是Microsoft Office套件中的一种基于过程的编程语言。它允许用户自定义功能并通过编写脚本来扩展应用程序的功能。VBA广泛...

    简单的中文分词程序 vc++

    本文将深入探讨“简单的中文分词程序”在VC++环境下如何实现,以及涉及的相关技术。 首先,我们要了解什么是中文分词。中文分词是将连续的汉字序列切分成具有语义的词汇单元的过程,因为中文没有像英文那样的空格或...

    C++编写的分词程序

    标题 "C++编写的分词程序" 暗示了我们讨论的是一个使用C++编程语言实现的文本处理工具,具体来说是一个分词器。在自然语言处理(NLP)领域,分词是将连续的文本序列分解成一系列单独的词汇单元,即“词”,它是文本...

    php 中文分词程序

    标题中的"php 中文分词程序"指的是使用PHP编写的用于处理中文文本的分词工具。PHP中文分词库通常包含一个词典,用于存储常用词汇,以及一套分词算法,用于将输入的中文文本切分成词语。这些库可以极大地简化开发者的...

    中文分词C语言版.rar

    中文分词是将连续的汉字序列切分成具有独立语义的词语,例如将“我爱自然语言处理”拆分为“我”、“爱”、“自然语言”、“处理”。由于中文没有明显的词与词之间的边界,因此分词成为理解和处理中文文本的基础。 ...

    自然语言处理-中文分词程序

    中文分词是指将连续的汉字序列切分成具有独立语义的词汇单元,它是进行其他高级自然语言处理任务,如情感分析、机器翻译、文本分类等的前提。 中文分词的挑战主要源于中文无明确的词边界,不像英文有空格作为单词的...

    JAVA编写的中文智能分词源程序

    Java编写的中文智能分词源程序是用于处理和分析中文文本的一种重要工具,它在信息检索、搜索引擎优化、自然语言处理等领域有着广泛的应用。在这个源程序中,开发者使用了Java编程语言来实现智能分词算法,使得程序...

    中文分词程序

    中文分词程序是自然语言处理(NLP)领域的一个关键环节,主要目的是将连续的汉字序列切分成具有语义意义的词语序列。这是因为中文没有明显的空格或标点符号来划分单词,所以需要通过特定算法进行分词。在这个场景中...

    java编写的中文分词

    java编写的中文分词,使用IK分词器进行中文分词,简单的demo,使用Java原生sdk实现,可以运行。

    JAVA实现的中文分词程序

    Java实现的中文分词程序是一种基于Java编程语言的文本处理工具,主要应用于处理中文文本,将其拆分成有意义的词汇单元,这一过程被称为分词。在自然语言处理(NLP)领域,分词是预处理阶段的关键步骤,为后续的文本...

    中文分词算法程序

    中文分词是自然语言处理(NLP)领域中的基础任务,它是将连续的汉字序列切分成具有语义的单个词汇。在这个“中文分词算法程序”中,开发者使用C++编程语言实现了一种方法来处理这个任务。C++是一种高效、灵活且强大...

    中文分词mapreduce程序

    【标题】:“中文分词MapReduce程序” 在大数据处理领域,MapReduce是一种并行计算模型,常用于处理海量数据。本程序是针对中文文本的一种特殊应用,它利用Java编程语言实现了中文分词功能,将复杂的分词任务分散到...

    分词程序程序演示分词程序程序演示分词程序程序演示分词程序程序演示分词程序程序演示

    在IT领域,中文分词是自然语言处理(NLP)中的关键步骤,它涉及到将连续的汉字序列分割成有意义的词汇单元,以便计算机能够理解和处理中文文本。在本项目中,“分词程序程序演示”标题指出这是一个用于展示分词功能...

    藏拙简易中文分词服务器

    使用藏拙简易中文分词服务器的过程十分简单:用户只需上传或直接输入需要分词的中文文本,服务器便会自动完成分词过程,并将结果返回给用户。这样的设计极大地降低了分词的门槛,使得无论是研究人员进行实验,还是...

    C#实现的中文分词程序

    中文分词是将连续的汉字序列切分成具有实际意义的词语的过程,因为中文没有像英文那样的空格作为单词的天然分隔符,所以需要通过特定算法来识别词语边界。例如,句子“我爱你,中国”会被分词为“我”、“爱”、“你...

Global site tag (gtag.js) - Google Analytics