以前做知識管理系統(tǒng)的時候,由于需要建立全文檢索和統(tǒng)計(jì)詞頻,,需要對中文文本進(jìn)行分詞。對于中文分詞,
國內(nèi)做到好的應(yīng)該是中科院自然研究所,但是相對比較復(fù)雜,我看了幾次沒有看明白. :) ,由于平常我們的知識系統(tǒng)
對分詞的要求沒有這么高,所以 就選擇了最大化的詞表分詞法. 詞表選擇的是人民日報97版的詞表.
實(shí)際效果可以達(dá)到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,動態(tài)速度更好,。