把句号作为一个提取的位置,分别在句号两边提取L/2长的词串构成网页的一个特征码。之所以要在句号的两边分别取L/2长的词串,是因为在 L/2-1和L/2处的字很难构成一个词,因此更能保证特征码的唯一性。下面是几个特征码的例子:“百七十二人其中很多是”,“的社会效果但是大陆报”,“率几十倍这表明法律”。
参考文章:
网上还有说用hash算法去重复,好像好厉害的样子,LZ可以百度
楼主可以在网上查一下LD算法。我在一个项目中用到了,效果还不错。当然我比较的字符串长度比较小。
#region 比较字符串相似度 private static int min(int one, int two, int three) { int min = one; if (two < min) { min = two; } if (three < min) { min = three; } return min; } public static int LD(String str1, String str2) { int[,] d; // 矩阵 int n = str1.Length; int m = str2.Length; int i; // 遍历str1的 int j; // 遍历str2的 char ch1; // str1的 char ch2; // str2的 int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1 if (n == 0) { return m; } if (m == 0) { return n; } d = new int[n + 1, m + 1]; for (i = 0; i <= n; i++) { // 初始化第一列 d[i, 0] = i; } for (j = 0; j <= m; j++) { // 初始化第一行 d[0, j] = j; } for (i = 1; i <= n; i++) { // 遍历str1 ch1 = str1[i - 1]; // 去匹配str2 for (j = 1; j <= m; j++) { ch2 = str2[j - 1]; if (ch1 == ch2) { temp = 0; } else { temp = 1; } // 左边+1,上边+1, 左上角+temp取最小 d[i, j] = min(d[i - 1, j] + 1, d[i, j - 1] + 1, d[i - 1, j - 1] + temp); } } return d[n, m]; } //返回两个字符串的相似度,返回一个0到100之间的整数,值越大,表示相似度越高 public static int similar(String newStr, String targetStr) { int ld = LD(newStr, targetStr); double i = 1 - (double)ld / (double)Math.Max(newStr.Length, targetStr.Length); int similar = Convert.ToInt32(Math.Round((Convert.ToDecimal(i)), 2, MidpointRounding.AwayFromZero) * 100); return similar; } #endregion