曹卫宇,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,农

从本文开端要讲一个非常重要的问题:文本类似度问题,经过核算两个文本类似度,以到达文本的判重的意图。它的使用有许多,比方文本去重、搜索引擎网页判重、论文的反抄袭等。

处理文本类似度问题的算法有许多,本文就先讲一个比较简单的,根据最长公共子串的算法

假设要比较两篇文档的类似度,能够将两篇文档看出是两个字符串序列,将曹卫宇,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,农其一致归一化处理后,能够转化为最长公共子串的问题。战国兰斯那么处理最长公共子串的算法又有许多,下面将逐一解说。

一. 暴力解法

直接经过两个循环枚举第一个字符串的子串,然后判别其在第二个字符串中是否包括,并记载包括第一个字符串子串的最大长度即可。很明显,这样的解法时刻杂乱度是大于O(nm)的老兵电视剧全集,代码如下

int LS(string x, string y) {
int郑雨盛 maxLen = 0;
int xlen = x.size半夏();
int ylen = y最强魔法师的隐遁方案.size();
for (int i = 0; i < xlen; i++) {
int len = 0;
string str = "";
for (int 淮河j = i; j < ylen; j++) {
str += x[j];
if (y.find(str) == y.npos) {
break;
}
len++;
}
maxLen = max(maxLen, len);
}
return maxLen;
}

这里在判别是否包括子串时用到了STL的find函数,它的均匀时刻杂乱度为O(m+n),但最坏时刻杂乱度为O(mn),能够将其改为KMP匹配算法,那么全体时刻杂乱度为O(m*n*(m+n))。这种郊野暴力算法功能太差范粲,那么下面根据动态规黑科技划的办法功能又要好许多曹卫宇,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,农。

二. 动态规划法

假设咱们用动态规划的思维,关于两个字符串,用dp[i][j]来表明同曹卫宇,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,农时以x_i和y_j结束的子串,那么很明显当x_i不等于y_j曹卫宇,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,农时,dp[i][j]=0,当x_i等于y_j时分,dp[i][j] = dp[i - 1][j - 1] + 1,所以搬运方程如下

那么代码也就很简单了,如下

int LS(string x, string y) {
int maxLen = 0;
int xlen = x.size();
in曹卫宇,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,农t ylen = y.size();
for (int i = 0; i <= xlen; i++) {
fo忠犬八公的故事r (int j = 0; j <= ylen; j++) {
if (i == 0 || j == 0) {
dp[i][j] = 0;
} else if (x[i - 1] == y[grandj - 1]) {
dp[i][j] = dp[i - 1中山气候预报][j - 1] + 1;
} else气冲斗牛 {
dp[i][j] = 0;
}
maxLen = max(maxL青林歪弹en, dp[i][j]);
}
}
retur曹卫宇,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,农n max镇妖册Len;
}

很明显,动态规划法两个循环,时刻杂乱度为O(mn),一般这种桦树芝菌茶时刻杂乱度也就够用了。但其实还有其它更优的算法,例如根据后缀数组的最长公共子串求法。

三. 后缀数组法

这个算法略微杂乱一点,经过曹卫宇,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,农结构后缀数组,时刻杂乱度会更低。根据二倍增算法的后缀罗布泊双鱼玉佩事情数组时刻杂乱度为O(n*log(n)),而根据DC3算法的后缀数组时刻杂乱度为O(n)。后边有时刻我会具体解说这两种算法。

能够看出经过核算公阿一西呆路共子串的办法来核算两个串的类似度还存在缺点,比方许多状况是两个字符串高度类似,但子串并不一定很长,后边我再解说其它算法来逐渐改善这个问题。下一节我会解说更多关于字符串类似度核算算法,欢迎高平气候我们重视!