推翻了第一版,参考了其他分词程序,重新写的第二版。
正向最大匹配中文分词程序,能实现中英文数字混合分词。比如能分出这样的词:bb霜、3室、乐phone、touch4、mp3、T恤
public class FMM2 extends Seg


{
public static final HashMap<Character,TreeNode> dic = Dictionary.getFmmdic();

/** *//**
* @return 返回匹配最长词的长度, 没有找到返回 0.
*/
public static int maxMatch(TreeNode node,char[] sen, int offset)

{
int idx = offset - 1;
for(int i=offset; i<sen.length; i++)

{
node = node.subNode(sen[i]);
if(node != null)

{
if(node.isAlsoLeaf())
idx = i;
}
else
break;
}
return idx + 1;
}
public ArrayList<Token> getToken(ArrayList<Sentence> list)

{
ArrayList<Token> tokenlist=new ArrayList<Token>();
for(Sentence sen:list)

{
int i=0;
while(i<sen.getText().length)

{
TreeNode n=FMM2.dic.get(sen.getText()[i]);
if(n!=null)

{
int j=FMM2.maxMatch(n, sen.getText(),i);
if(j>i)

{
Token token = new Token(new String(sen.getText(),i,j-i),sen.getStartOffset()+i,sen.getStartOffset()+j);
tokenlist.add(token);
i=j;
}
else

{
Token token = new Token(new String(sen.getText(),i,1),sen.getStartOffset()+i,sen.getStartOffset()+i+1);
tokenlist.add(token);
i++;
}
}
else

{
Token token = new Token(new String(sen.getText(),i,1),sen.getStartOffset()+i,sen.getStartOffset()+i+1);
tokenlist.add(token);
i++;
}
}
}
return tokenlist;
}
}
posted on 2012-06-27 13:39
nianzai 阅读(1267)
评论(0) 编辑 收藏 所属分类:
中文分词