以前做知识管理系统的时候,由于需要建立全文检索和统计词频,需要对中文文本进行分词。对于中文分词,
软件开发网 www.mscto.com
国内做到好的应该是中科院自然研究所,但是相对比较复杂,我看了几次没有看明白.:) ,由于平常我们的知识系统
对分词的要求没有这么高,所以就选择了最大化的词表分词法. 词表选择的是人民日报97版的词表. 软件开发网 www.mscto.com
实际效果可以达到90%以上,基本可以满足需要。支持Lucene.net分词,词表是启动时一次性载入;
具体代码如下: www.mscto.com
publicsealedclassLtWordTokenizer:Tokenizer { privateStringbufferText; privateArrayListwordArray; privateint intIndex=0; publicstaticHashtablehsDic=newHashtable();
publicLtWordTokenizer(TextReader_in) { input=_in; bufferText=input.ReadToEnd().ToLower(); wordArray=newArrayList(); wordSegment(bufferText); }
publicvoidwordSegment(StringSentence) { intsenLen=Sentence.Length; inti=0,j=0; intM=12; stringword; while(i<senLen) { intN=i M<senLen?i M:senLen 1; boolbFind=false; for(j=N-1;j>i;j--) { word=Sentence.Substring(i,j-i).Trim(); if(hsDic.ContainsKey(word.Trim())) { wordArray.Add(newToken(word,i,i word.Length)); bFind=true; i=j; break; } } if(!bFind) { word=Sentence.Substring(i,1).Trim(); i=j 1; if(word.Trim()!="") { wordArray.Add(newToken(word,i,i word.Length)); } } } }
软件开发网 www.mscto.com
publicoverrideTokenNext() { if(intIndex<wordArray.Count) { intIndex ; return(Token)(wordArray[intIndex-1]); } else returnnull; } }}
下次可以在分词的时候更改一下,不必先分好保存到arraylist,动态速度更好。
软件开发网 www.mscto.com