论坛首页 Java企业应用论坛

中文分词—新词挖掘篇

浏览 1666 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-10-26  
大概想法是这样:
找词库完毕,剩下没有找到的所有字符串,进行新词挖掘。
例如:
一篇文章中,没有找到的所有字符串有:
1、杨瑞第集国宁你们
2、杨瑞来你们来国宁
3、过来要不要去
4、要不要过来啊
经过新词挖掘,可以得到
杨瑞->你们->国宁->要不要->过来->
欢迎大家测试!有更好的算法,也可以说一下,讨论讨论~~~
package wss.analysis.analyzer;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author Loiy
 * @time 2011-10-26
 * @return 新词挖掘
 */
public class newWordAnalyzer {

	public List<String> list = new ArrayList<String>();
	
	public List<String> word = new ArrayList<String>();
	
	public void findWord(String text){
		Iterator<String> iter = list.iterator();
		while(iter.hasNext()){
			String str = iter.next();
			match(str,text);
		}
		list.add(text);
	}
	
	/**
	 * @param  s1 词库
	 * @param  s2 待挖掘新词的字符串 
	 * @return 查找两个字符串共同子字符串,并返回.子字符串必须大于等于2
	 */
	public void match(String s1, String s2){
		char c1[] = s1.toCharArray();
		char c2[] = s2.toCharArray();
		int j = 0;
		boolean bool = false; // 上次是否匹配成功 true 匹配成功 false 匹配失败
		int start = -1,end = -1; // 开始匹配位置;结束匹配位置
		for(int i = 0; i < c2.length; i++){
			for(; j < c1.length; j++){
				if(c2[i] == c1[j] && j != c1.length - 1){ // 找到匹配,还不到第二个循环最后一个字符
					if(start == -1) start = i;
					if(i == c2.length - 1) end = i; // 到第一个循环最后,赋值把i赋值给end 
					bool = true;
					j = j + 1; 
					break; // 结束该循环,查找第一个循环的下个字符(A),A从第二个循环下标为j+1开始找
				}
				if(c2[i] == c1[j] && j == c1.length - 1){ // 找到匹配,到第二个循环最后一个字符
					end = i; // 这里i不需要减1,因为已经到了第二个循环最后一个元素
					if(start != -1 && (end - start >= 1)){ // 相连字符长度大于等于2,打印出来
						word.add(s2.substring(start, end + 1));
					}
					j = 0;
					start = -1;
					end = -1;
					break;
				}
				if(bool){ //匹配到这个下标结束,开始总计到目前为止相连字符有多少个
					end = i - 1; // 上次成功匹配到的字符位置
					//System.out.println(end+" "+start);
					if(start != -1 && (end - start >= 1)){ // 相连字符长度大于等于2,打印出来
						word.add(s2.substring(start, end + 1));
					}
					//System.out.println("<--i="+i+" "+c2[i]+" j="+j+" "+c1[j]+"-->");
					bool = false;
					start = -1;
					end = -1;
					i--; // 匹配失败,第一个循环下标减1
					j = 0; // 第二个循环下标从零开始.
					break;
				}
				if(j == c1.length -1){ // 第一个循环某个字符到第二个循环最后一个字符,还是匹配不到,那么 j=0;
					j = 0;
					break;
				}
			}
		}
		if(start != -1 && (end - start >= 1)){ // 相连字符长度大于等于2,打印出来
			word.add(s2.substring(start, end + 1));
		}
	}
	
	public String toString(){
		Iterator<String> iter = word.iterator();
		StringBuffer sb = new StringBuffer();
		while(iter.hasNext()){
			String str = iter.next();
			if(str.length() <= 1) continue;
			sb.append(str).append("->");
		}
		String result = sb.toString();
		sb.setLength(0);
		sb = null;
		return result;
	}
	
	public static void main(String args[]){
		newWordAnalyzer wordExcavate = new newWordAnalyzer();
		wordExcavate.findWord("杨瑞第集国宁你们");
		wordExcavate.findWord("杨瑞来你们来国宁");
		wordExcavate.findWord("过来要不要去");
		wordExcavate.findWord("要不要过来啊");
		String t = wordExcavate.toString();
		System.out.println(t);
	}
	
}

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics