基于逆向最大化词表中文分词法zz
國內做到好的應該是中科院自然研究所,但是相對比較復雜,我看了幾次沒有看明白. :)? ,由于平常我們的知識系統
對分詞的要求沒有這么高,所以 就選擇了最大化的詞表分詞法.? 詞表選擇的是人民日報97版的詞表.
實際效果可以達到90%以上,基本可以滿足需要。支持 Lucene.net分詞,詞表是啟動時一次性載入;
?? 具體代碼如下:
? public sealed class LtWordTokenizer : Tokenizer
?{
??private String bufferText;
??private ArrayList wordArray;?
??private int? intIndex=0;??
??public static Hashtable hsDic=new Hashtable();??
??public LtWordTokenizer(TextReader _in)
??{
???input = _in;
???bufferText=input.ReadToEnd().ToLower();???
???wordArray=new ArrayList();???
???wordSegment(bufferText);??
???
??}??
??public void wordSegment(String Sentence)
??{
???int senLen = Sentence.Length;
???int i=0, j=0;
???int M=12;
???string word;????
???while(i < senLen)
???{
????int N= i+M<senLen ? i+M : senLen+1;
????bool bFind=false;
????for(j=N-1; j>i; j--)
????{
?????word = Sentence.Substring(i, j-i).Trim();?????
?????if(hsDic.ContainsKey(word.Trim()))
?????{
??????wordArray.Add(new Token(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(new Token(word,i,i+word.Length));?????
?????}?????
????}
???}?
??}
?
??public override Token Next()
??{?
???
???if(intIndex<wordArray.Count)
???{?
????intIndex++;
????return (Token)(wordArray[intIndex-1]);???????????
???}
???else
????return null;???
??}
??
?}
}
下次可以在分詞的時候更改一下,不必先分好保存到arraylist,動態速度更好。
轉載于:https://www.cnblogs.com/dayouluo/archive/2005/09/20/240767.html
總結
以上是生活随笔為你收集整理的基于逆向最大化词表中文分词法zz的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: File,FileInfo;Direct
- 下一篇: 为什么一个星期是7天