基于逆向最大化词表中文分词法。

王朝c#·作者佚名  2006-12-17
宽屏版  字体: |||超大  

基于逆向最大化词表中文分词法。

基于逆向最大化词表中文分词法。 以前做知识管理系统的时候,由于需要建立全文检索和统计词频,需要对中文文本进行分词。对于中文分词,

国内做到好的应该是中科院自然研究所,但是相对比较复杂,我看了几次没有看明白. :) ,由于平常我们的知识系统

对分词的要求没有这么高,所以 就选择了最大化的词表分词法. 词表选择的是人民日报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,动态速度更好。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有