基于词典的正向最大匹配算法(最长词优先匹配)

public Set<String> matchChinese(String text,Set<String> dictionary,int maxLength) {
//text:待匹配文本     dictiona:词典    maxLength:词典中最长词长度
          Set<String> result=new HashSet<>();
          while(text.length()>0) {
          	int length=maxLength;
          	if(text.length()<maxLength)
          		length=text.length();
          	//取指定的最大长度的文本去词典里面匹配
          	String s=text.substring(0,0+length);
          	while(!dictionary.contains(s)){
				//如果长度为一且在词典中未找到匹配
                if(s.length()==1)
                	break;
				//如果匹配不到,则长度减一继续匹配
          		s=s.substring(0,s.length()-1);
			}
			if(s.length()==1){
				if (dictionary.contains(s))
					result.add(s);
			}else{
          		result.add(s);
			}
			//从待查找文本中去除已经匹配的文本
			text=text.substring(s.length());
		  }
		  return result;
	}


测试方法

public static void main(String[] args) {

		Set<String> dictionary=new HashSet<>();
		dictionary.add("桃树");
		dictionary.add("杏树");
		dictionary.add("树");
		dictionary.add("飞来飞去");
		dictionary.add("仿佛已经满是桃儿");

		Scanner scanner=new Scanner(System.in);
		newtest n=new newtest();
		while(scanner.hasNext()){
			String text=scanner.next();
			Set<String> result=n.matchChinese(text,dictionary,8);
			for(String s:result){
				System.out.println(s);
			}
		}
测试文本:
桃树,杏树,梨树,你不让我,我不让你,都开满了花赶趟儿。红的像火,粉的像霞,白的像雪。花里带着甜味;闭了眼,树上仿佛已经满是桃儿,杏儿,梨儿。花下成千成百的蜜蜂嗡嗡的闹着,大小的蝴蝶飞来飞去。野花遍地是:杂样儿,有名字的,没名字的,散在草丛里像眼睛像星星,还眨呀眨

猜你喜欢

转载自blog.csdn.net/qiuwenjie123/article/details/80057229