全切分分词程序。中华人民共和国切分成 {中华人民共和国|中华|华人|人民|共和国}。
能实现中英文数字混合分词。比如能分出这样的词:bb霜、3室、乐phone、touch4、mp3、T恤。
public class FMW extends M
{
public static final HashMap<Character,TreeNode> dic = Dictionary.getFmmdic();
/** *//**
* @return 返回可能匹配词的长度, 没有找到返回 0.
*/
public ArrayList<Integer> maxMatch(TreeNode node,char[] sen, int offset)
{
ArrayList<Integer> list=new ArrayList<Integer>();
for(int i=offset; i<sen.length; i++)
{
node = node.subNode(sen[i]);
if(node != null)
{
if(node.isAlsoLeaf())
list.add(i+1);
}
else
break;
}
if(list.size()==0)
list.add(offset);
return list;
}
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=dic.get(sen.getText()[i]);
if(n!=null)
{
ArrayList<Integer> ilist =maxMatch(n, sen.getText(),i);
if(ilist.size()>1)
{
for(int j=0;j<ilist.size();j++)
{
Token token = new Token(new String(sen.getText(),i,ilist.get(j)-i),sen.getStartOffset()+i,sen.getStartOffset()+ilist.get(j));
tokenlist.add(token);
}
}
else
{
if(ilist.get(0)>i)
{
Token token = new Token(new String(sen.getText(),i,ilist.get(0)-i),sen.getStartOffset()+i,sen.getStartOffset()+ilist.get(0));
tokenlist.add(token);
}
else
{
if(tokenlist.size()==0 || tokenlist.get(tokenlist.size()-1).getEnd()<=i+sen.getStartOffset())
{
Token token = new Token(new String(sen.getText(),i,1),sen.getStartOffset()+i,sen.getStartOffset()+i+1);
tokenlist.add(token);
}
}
}
}
else
{
if(tokenlist.size()==0 || tokenlist.get(tokenlist.size()-1).getEnd()<=i+sen.getStartOffset())
{
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-07-02 14:17
nianzai 阅读(3063)
评论(4) 编辑 收藏 所属分类:
中文分词