玫琳凯,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,单反

车世界 admin 2019-04-11 273 次浏览 0个评论
网站分享代码

从本文开端要讲一个非常重要的问题:文本类似度问题,经过核算两个文本类似度,以到达文本的判重的意图。玫琳凯,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,单反它的使用有许多,比方文本去重、搜索引擎网页判重欢爱、论文的反抄袭等。

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

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

假设要比较两篇文档的类似度,能够将两篇文档看出是两个字符串序列,将其一致归一化处理后,能够转化为最长公共子串的问题。那么处理最长公共子串的算法又有许多,下面将逐一解说。

一. 暴力解法

直接经过两个循环枚举第一个字符串的子串,然后判别玫琳凯,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,单反其在第二个字符串中是否包括,并记载包括第一个字符串子串的最大长度即可。很明显,这样的解法时刻杂乱度是大于O(nm)的,代码如下

int LS(string x, stri不胜风雨乱红尘ng y) {
int maxLen = 0;
i新浪爱彩nt xlen =篡嫡 x.si玫琳凯,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,单反ze();
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的f玫琳凯,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,单反i冷志宏nd函数,湖南卫视小年夜春晚它的均匀时刻杂乱度为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;
i色奶奶nt xlen = x.size();
int ylen = y.size();
for (int i = 0; i <= xlen; i++) {
for (int j = 0; j <= ylen; j++) {
if (i == 0 || j == 0) {
dp[i][j]玫琳凯,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,单反 = 0;
} else if (x[i - 1] == y[j - 1飞天茅台酒]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = 0;
}
maxLen = max大凉王(maxLen, dp[i][j]);
}
好听的网名男生}
return maxLen;
}

很明显,动态规划法两个循陈思成环,时刻杂乱度为O(mn),一般这种时刻杂乱度也玫琳凯,程序员自然语言处理编程算法,处理文本类似度问题的最长公共子串,单反就够用了。但其实还有其它更优的算法,例如根据后缀数组的最十世吧长公共子串求法。

三. 后缀数组法

这个算法略微杂乱一点,经过结构后缀数组,时刻杂乱度会更低。根据二倍增算滴滴快车法的后缀数组时刻杂乱度为O(n*log(n)),而根据DC3算法的后缀数组时刻杂乱度为O(n)。后边有时刻我会具体解说这两种算法。

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