Java中文分词【逆向最大匹配法】
一:正文
思想:
逆向最大匹配法
:将整个字符串作为一个“词组”带入到词典中进行比对,若不成功,删除第一个字符,继续进行如此操作,直到成功或者只剩下最后一个字,再把结果放入一个字符串的数组中,最后删除原句中的结果,继续上面的操作。下面我将用一个例子解释这个操作:
原句
:河南师范大学位于河南省新乡市牧野区建设东路四十六号
词典
:“师范”,“河南”,“牧野”
第一次代入
:南师范大学位于河南省新乡市牧野区建设东路四十六号(在词典中没有该词汇,删除首字符继续比对)
删除首字符
:师范大学位于河南省新乡市牧野区建设东路四十六号(在词典中没有该词汇,删除首字符继续比对)
删除首字符
:范大学位于河南省新乡市牧野区建设东路四十六号(在词典中没有该词汇,删除首字符继续比对)
删除首字符
:大学位于河南省新乡市牧野区建设东路四十六号(在词典中没有该词汇,删除首字符继续比对)
…
删除首字符
:号(在词典中没有该词汇,只剩下一个字,放入结果数组,并删除位于句尾的最后这个字,进行第二次代入)
第二次代入
:河南师范大学位于河南省新乡市牧野区建设东路四十六(在词典中没有该词汇,删除首字符继续比对)
…
删除首字符
:牧野(在词典中找到词汇“牧野”,放入结果数组,并删除位于句尾的结果“牧野”,进行第三次代入)
…
实现逻辑:
public static void main(String args[]) {
String[] cs = {"今晚", "月亮", "漂亮"};//词典
String a = "今晚月亮真漂亮啊";
System.out.print("原句:");
System.out.print(a + '\n');
System.out.print("拆分后为:");
String[] cs2 = new String[100]; //结果数组
int jud = 0;//找到匹配字符串与否的标志
int j = 0;
String temp = null;//初始化临时字符串
for (; a.length() > 0; ) {
for (int i = 0; i < a.length(); i++) {
temp = a.substring(i);//每次截取掉首个字符
if (isin(cs, temp) == true) {//如果目标字符串在数组中
cs2[j] = temp;
jud = 1;
int number = temp.length();
a = a.substring(0, a.length() - number);
}
}
if (jud == 0) {//没有找到匹配字符串
cs2[j] = a.substring(a.length() - 1, a.length());//将最后一个元素放在cs2里面
a = a.substring(0, a.length() - 1);//截掉最后一个元素继续循环。
}
jud = 0;
j++;
}
for (; j >= 0; j--) {
if (cs2[j] != null)
System.out.print(cs2[j] + " ");
}
}
// 下面为判断字符串是否在词典中的函数方法
static public boolean isin(String[] cs, String temp) {
int i;
for (i = 0; i < cs.length; ) {
if (temp.equals(cs[i]))
i = cs.length + 1;
else
i++;
}
if (i == cs.length + 1)
return true;
else
return false;
}