基于逆向最大化词表中文分词法zz
國(guó)內(nèi)做到好的應(yīng)該是中科院自然研究所,但是相對(duì)比較復(fù)雜,我看了幾次沒有看明白. :)? ,由于平常我們的知識(shí)系統(tǒng)
對(duì)分詞的要求沒有這么高,所以 就選擇了最大化的詞表分詞法.? 詞表選擇的是人民日?qǐng)?bào)97版的詞表.
實(shí)際效果可以達(dá)到90%以上,基本可以滿足需要。支持 Lucene.net分詞,詞表是啟動(dòng)時(shí)一次性載入;
?? 具體代碼如下:
? 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;???
??}
??
?}
}
下次可以在分詞的時(shí)候更改一下,不必先分好保存到arraylist,動(dòng)態(tài)速度更好。
轉(zhuǎn)載于:https://www.cnblogs.com/dayouluo/archive/2005/09/20/240767.html
總結(jié)
以上是生活随笔為你收集整理的基于逆向最大化词表中文分词法zz的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: File,FileInfo;Direct
- 下一篇: 为什么一个星期是7天