测试环境
10
IDEA 2020.1
JDK 1.8
算法描述
1、 首先读取词库java字符串匹配度算法 中文分词-词典逆向最大匹配法-JAVA实现,每个词用哈希表存储,查找效率高
2、 读取待分词句子input, 设置最大匹配长度 MAX
3、 input的长度是否大于0,如果是接着下一步,否则第8步
4、 input长度是否大于 MAX, 如果是,设置尝试匹配词语token = input后MAX个字符, 否则 token = input
5、 是否有:token的长度大于1并且token并未出现在词库中?是的话接着下一步,否则转至第7步
6、 token去掉最左的第一个字符作为新token, 转去第5步
7、 分词结果栈rs保存token,input去除token的部分作为新input,转至第3步
8、 输出分词结果rs,程序结束
流程图
源程序-JAVA实现
Words.java 负责读取词库文件并判断token是否存在词库中
org.;
java.io.*;
java.nio..;
java.util.;
class Words {
= new ();
void ( ) {
br = null;
isr = null;
fis = null;
File file = new File();
fis = new (file);
isr = new (fis, .UTF_8);
br = new (isr);
/读取每一行内容即一个词,保存在哈希表中/
line = null;
while ((line = br.()) != null) {
.add(line.(" ", ""));
}
}
/词库中是否存在word/
( word) {
.(word);
}
}
App.java 算法主流程
org.;
java.io.;
java.util.;
java.util.Deque;
/**
* @: Mr.Hu
* @: 2021-04-07 15:52
*/
class App {
void main([] args) {
Words words = new Words();
words.("data.txt");
Deque rs = new ();
input = "普京跟特朗普在明天下雨之前学会加减乘除,吃完饭没时间睡觉,睡觉后去上大学";
= null; // 每次匹配的字符串
int head = 0; // head~tail-1为分词字符串
int tail = input.(); // 余下的字符长度
final int = 4; // 最大匹配长度
while (tail > 0) {
// 先尝试取最大匹配长度
if (tail > ) head = tail - ;
else head = 0; // 余下全部
= input.(head, tail); // 截取
/直到截取字符串只有一个字符或者字符串存在于词库中/
while (.() > 1 && !words.()) {
= .(1); // 去除最左字符java字符串匹配度算法java字符串匹配度算法,即尝试匹配少一位
head++; // 下标往后
}
rs.push(); // 栈中
tail = head; // 下一个截取字符串的尾巴是这次的头
}
for ( item : rs) {
.out.print(item + " / "); // 词库中的词没有单字的
}
.out.();
}
}
data.txt 词库文件
普京
大学
天气
睡觉
下雨
吃饭
时间
特朗普
加减乘除
明天
之前
运行结果
普京 / 跟 / 特朗普 / 在 / 明天 / 下雨 / 之前 / 学 / 会 / 加减乘除 / , / 吃 / 完 / 饭 / 没 / 时间 / 睡觉 / , / 睡觉 / 后 / 去 / 上 / 大学 /