中文分词—新词挖掘篇

大概想法是这样:
找词库完毕,剩下没有找到的所有字符串,进行新词挖掘。
例如:
一篇文章中,没有找到的所有字符串有:
1、杨瑞第集国宁你们
2、杨瑞来你们来国宁
3、过来要不要去
4、要不要过来啊
经过新词挖掘,可以得到
[color=red]杨瑞->你们->国宁->要不要->过来->[/color]
欢迎大家测试!有更好的算法,也可以说一下,讨论讨论~~~

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);
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值