浏览 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); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |