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